工作上用了c#有好几年了,其实对于c#版本傻傻的分不清楚,所以觉得有必要对c#的用法和理解的层面上再进一步。
希望通过写博客,把自己看书的理解直接体现出来,当时没理解,也能在这里做个记录,以后往回看也是可以的嘛。
- C#1 中定义的产品类型
class Product1{ //c#1
string name;
decimal price;
public string Name{
get{ return name;}//c#1,已经设置了获取变量方法,要想设置赋值变量,set必须是public
}
public decimal Price{ //创建变量的代码太复杂,封装应该是非常简单的任务
get{ return price;}
}
public Product1(string name,decimal price){
this.name = name;
this.price = price;
}
public static ArrayList GetSampleProducts(){
ArrayList al = new ArrayList ();//ArrayList没有提供与其内部内容相关的编译时的信息,一不小心增加个字符串信息也是很有可能的,而且编译器还不会报错
//al.Add ("abc"); //如果没有注释,该句还是会通过编译
al.Add (new Product1("West Side Story",9.99m));
al.Add (new Product1("Assassins",14.99m));
al.Add (new Product1("Frogs",13.99m));
al.Add (new Product1("Sweeney Todd",10.99m));
return al;
}
public override string ToString ()
{
return string.Format ("[Product1: Name={0}, Price={1}]", name, price);
}
}
总结:1.Product类中,Name,Price是只读属性,要想改变字段name,price的话,要通过Product(name,price)构造函数来改变咯。
2.Product类中,ArrayList是弱类型集合,对于加入的类型无限制,这才造成误操作,而且在运行的时候或者单元测试才会被发现,编译器在编译时是不会发现的
3.我学习C#的时候应该是c#3,4之间,原来C#1也有这么个过程,就像我们学习过程,看回以前自己写的代码,会发出“tnnd,这是谁写的代码?”的感叹啊。
- C#2 强类型集合,私有属性赋值
class Product2{
string name;
decimal price;
public string Name{
get{ return name;}//c#1,已经设置了获取变量方法,要想设置赋值变量,set必须是public
private set{ name = value;}//c#2,设置set方法为private
}
public decimal Price{ //c#1,创建变量的代码太复杂,封装应该是非常简单的任务
get{ return price;}
private set{ price=value;}
}
public Product2(string name,decimal price){
//this.name = name; //c#1,赋值到变量
Name = name; //c#2,直接赋值到属性
//this.price = price;
Price = price;
}
public static List<Product2> GetSampleProducts(){
//ArrayList al = new ArrayList ();//c#1,ArrayList没有提供与其内部内容相关的编译时的信息,一不小心增加个字符串信息也是很有可能的,而且编译器还不会报错
//al.Add ("abc"); //c#1,如果没有注释,该句还是会通过编译
List<Product2> al=new List<Product2>(); //c#2,强类型集合,妈妈再也不用担心我会加入乱七八糟的东西啦
al.Add (new Product2("West Side Story",9.99m));
al.Add (new Product2("Assassins",14.99m));
al.Add (new Product2("Frogs",13.99m));
al.Add (new Product2("Sweeney Todd",10.99m));
return al;
}
public override string ToString ()
{
return string.Format ("[Product2: Name={0}, Price={1}]", name, price);
}
}
2.C#2,List<Product>告诉你,你别乱来啊,它在编译时就告诉编译器,列表中只能包含Product。
- C#3 自动实现的属性,增加的结合,简化的对象初始化
class Product3{
/*string name;
decimal price;
public string Name{
get{ return name;}//c#1,已经设置了获取变量方法,要想设置赋值变量,set必须是public
private set{ name = value;}//c#2,设置set方法为private
}
public decimal Price{ //c#1,创建变量的代码太复杂,封装应该是非常简单的任务
get{ return price;}
private set{ price=value;}
}
public Product2(string name,decimal price){
//this.name = name; //c#1,赋值到变量
Name = name; //c#2,直接赋值到属性
//this.price = price;
Price = price;
}*/
public string Name{ get; private set;}
public decimal Price{ get; private set;}
public Product3(string name,decimal price){
Name = name;
Price = price;
}
public Product3(){}
public static List<Product3> GetSampleProducts(){
/*List<Product3> al=new List<Product3>(); //c#2,强类型集合,妈妈再也不用担心我会加入乱七八糟的东西啦
al.Add (new Product3("West Side Story",9.99m));
al.Add (new Product3("Assassins",14.99m));
al.Add (new Product3("Frogs",13.99m));
al.Add (new Product3("Sweeney Todd",10.99m));
return al;*/
return new List<Product3>{
new Product3{Name="West Side Stroy",Price=9.99m},
new Product3{Name="Assassins",Price=14.99m},
new Product3{Name="Frogs",Price=13.99m},
new Product3{Name="Sweeney Todd",Price=10.99m}
};
}
public override string ToString ()
{
return string.Format ("[Product1: Price={0}, account={1}]", Name, Price);
}
}
2.简化初始化
3.虽然相比Lambda表达式来说,可能有点小儿科,但是也是减少很多公共的代码嘛
- C#4 命名参数
class Product4{ //c#4
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 Product4(){}
public static List<Product4> GetSampleProducts(){
/*return new List<Product4>{
new Product4{Name="West Side Stroy",Price=9.99m},
new Product4{Name="Assassins",Price=14.99m},
new Product4{Name="Frogs",Price=13.99m},
new Product4{Name="Sweeney Todd",Price=10.99m}
};*/
return new List<Product4> {
new Product4(name:"West Side Stroy",price:9.99m),//使用命名参数
new Product4(price:14.99m,name:"Assassins"),
new Product4(name:"Frogs",price:13.99m),
new Product4(name:"Sweeney Todd",price:10.99m)
};
}
public override string ToString ()
{
return string.Format ("[Product1: Name={0}, Price={1}]", name, price);
}
}
总结:1.为了让类的私有化属性不能公开地改变,只读属性只能通过以上方式定义
2.然而因为只读属性,那么只能通过调用构造方式来初始化了。
3.书中例子使用以上例子来说明C#4的新特性命名参数有些牵强了,或许,拿默认参数和命名参数来举例会更好,当参数出现多个,并且类型相同或有一个参数为null的时候,效果更明显。