深入理解C#:从简单的数据类型开始

工作上用了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);
	}

}

总结:1.C#2,属性的getter,setter终于有访问修饰符啦,果断private setter,构造函数直接赋值到属性啦。
           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);
	}


}

总结:1.封装属性的方法更加简便
           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的时候,效果更明显。

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值