一、隐含类型局部变量
先看几个声明并赋值的例子:
var i = 5; var h = 23.56; var s = "C Sharp"; var intArr = new[] { 1, 2, 3, 4 };
1、 var为关键字,可以根据后面的初始化语句在编译时自动推断类型。此处的var很容易使人联想到javascript的var,与javascript的弱类型的动态语言不同,c#是强类型的语言,运行变量类型必须为已确定,调试的时候很清楚的看到其庐山真面目,如下图。
2、 var声明仅限于局部变量或foreach、using等语句中。
3、 var关键字只有在建立变量时有用,一旦您建立变量并且确定它的类型以后,就不能再用var来改变一个变量的类型。如var myDate = DateTime.Now;myDate = "Hello”;这样的代码编译时会报类型转换错误。
4、 除了看起来动态一点,具体会有什么作用?
i、
Customer myCustomer = new Customer();
在c# 3.0以后可以用
var myCustomer = new Customer();
来代替。
ii、
Customer myCustomer = GetByName("Zach");
在c# 3.0以后可以用
va
r myData = GetByName("Zach");
来代替。
如果GetByName()函数返回的不一定是Customer对象,后者显得更灵活。
5、 对Visual Studio的智能提示也是正常支持的,不会导致开发用了var后不知道具体类型是什么的问题,如下图可以清楚的看到myDate是一个DateTime类型变量。
6、在创建确实不知道啥类型的时候(如匿名类型)var显得如此有用。
二、扩展方法
1、扩展方法允许我们在不改变源代码的情况下扩展(即添加)现有类型中的实例方法。
比如Doctor对象中有操作开立检查KaiLiJianCha()并编译在XX01.dll中,过段时间如果要增加开立检验KaiLiJianYan()可以考虑的做法是做一个扩展方法并编译在XX02.dll中,“客户端”程序var doctor = new Doctor();doctor.KaiLiJianYan();实现其功能。如果XX01.dll是其他公司或者其他项目提供,而对方又不提供源码的时候,扩展方法显得十分有用。
C# 3.0中新增的System.Linq中大量的用到了扩展方法,我们自己也可以对系统原有对象或者原有类库进行一定的“扩展”,这也有利于实现“对修改封闭,对扩展开放”。
2、下图中,.net 3.0、3.5以及3.5sp1都是基于CLR2.0,同时也是在2.0基础上进行扩展。
3、扩展方法的本质为将实例方法调用在编译器改变为静态类中的静态方法调用;是一种编译时技术,应与反射等运行时技术区别,并慎重使用。
4、扩展方法优先级:现有实例方法优先级最高,其次为最近的namespace下的静态类的静态方法,最后为较远的namespace下的静态类的静态方法。
三、对属性书写的简化
1、C#中属性的出现简化了原有C++这样语言中对实例私有类型访问的get、set函数的简化。比如C++中对Doctor类的私有成员XueXing(在此血型不是很恰当)访问,就要写一个GetXueXing方法和一个SetXueXing方法。C#中定义属性无疑会简单很多,比如:
public class Doctor { private string xueXing; public string XueXing { get { return xueXing; } set { xueXing = value; } } }
访问代码:
var doctor = new Doctor(); doctor.XueXing = "O"; if (doctor.XueXing == "A") { //Do SomeThing. }
属性中的Get和Set中可以实现十分复杂的获取和设置关系,比如获取年龄Age,年龄是等于当前年份减去出生日期,当然要考虑下是不是满周岁、满月的情况,这些都能做在属性里。
C# 3.0以前版本存在着的问题那就是对于private string xueXing;可能根本就是不必要的,因为并不需要如年龄那样进行一些运算得出结果,此时写起来就特别繁琐,特别是在做O\R Mapping的时候写一大堆的这种东西实在叫人心烦(虽然有一些工具可以自动生成代码)。对于XueXing,在C# 3.0以后可以写成如下:
public string XueXing{ get; set; }
感觉世界一下就清净了…
2、关于属性在VS中还有一个利用Code Snippet的小窍门,输入prop然后连续按两下回车能快速帮助开发人员书写属性,如下图:
之后会IDE自动写上:public int MyProperty { get; set; },自己再改下类型和属性名就好了。