将从定义一个Product类开始,封装几个属性。讲述C#1---C#4的进化过程:
一、C#1 只读属性,弱类型集合
#region C# 1
public class Product
{
string name;
decimal price;
public string Name { get { return name; } }
public decimal Price { get { return price; } }
public Product(string name, decimal price)
{
this.name = name;
this.price = price;
}
public static ArrayList GetList()
{
ArrayList list = new ArrayList();
list.Add(new Product("Orange", 12.3m));
list.Add(new Product("Apple", 10m));
return list;
}
public override string ToString()
{
return string.Format("{0},{1}", name, price);
}
}
#endregion
问题一:创建属性和变量的代码很复杂
问题二:代码为属性提供了公共的取值方法,如果添加对应的赋值方法,那Set就必须是公共的
问题三:ArrayList没有对类型进行限制,如果赋值的时候随便添加一个字符串,编译器并没有报错。例如GetList中list.Add("I am String type"),编译器也一样通过了
二、C#2 私有属性赋值方法,强制类型集合:
#region C# 2
public class Product2
{
string name;
decimal price;
public string Name { get { return name; } private set{name=value;}}
public decimal Price {get { return price; } private set{price=value;}}
public Product2(string name, decimal price)
{
Name = name;
Price = price;
}
public static List<Product2> GetList()
{
List<Product2> list = new List<Product2>();
list.Add(new Product2("Orange", 12.3m));
list.Add(new Product2("Apple", 10m));
return list;
}
public override string ToString()
{
return string.Format("{0},{1}", name, price);
}
}
#endregion
解决了C#1中的
问题二:属性拥有私有的赋值方法,注意看构造方法,使用了私有赋值的方法。
问题三:规定了这个List只能存Product2,,假如添加了不同类型到list中编译器就会报错。例如GetList()中list.Add("different data type"),编译器就会报错。
三、C#3 自动实现属性的Set和Get方法,增强集合和对象的初始化:
#region C# 3
public class Product3
{
public string Name { get; private set; }
public decimal Price { get; private set; }
public Product3(string name, decimal price)
{
Name = name;
Price = price;
}
Product3() { }
public static List<Product3> GetList()
{
return new List<Product3>{
new Product3("Orange",12.3m),
new Product3("Apple", 10m)
};
}
public override string ToString()
{
return string.Format("{0},{1}", Name, Price);
}
}
#endregion
从代码看得出属性的get和set方法变得非常简便,集合的初始化也变得非常方便
四、C#4 命名实参:
当一个类的属性特别多的时候,用构造函数初始化的时候比较难看懂属性之前的对应关系。C#4中提供了命名实参,例如构造初始化时可以这样写 new Product4( price:12.3m,name:"Orange"),给参数命名赋值。
#region C# 4
public class Product4
{
readonly string name;
readonly decimal price;
public string Name { get { return name; } }
public decimal Price { get { return price; } }
public Product4(string name, decimal price)
{
this.name = name;
this.price = price;
}
public static List<Product4> GetList()
{
return new List<Product4>{
new Product4( price:12.3m,name:"Orange"),
new Product4("Apple", 10m)
};
}
public override string ToString()
{
return string.Format("{0},{1}", name, price);
}
}
#endregion
这是今天看到的,所以记录下来。写的不是很好,可能还有很多错误,希望大神指正。参考Depth in C sharp