设为首页 加入收藏

TOP

理解隐式类型、对象初始化程序和匿名类型
2015-03-04 22:51:19 来源: 作者: 【 】 浏览:37
Tags:理解 类型 对象 初始 程序 匿名

在C# 3.0中,几乎每个新特性都是为LINQ服务的。所以,本文将介绍下面几个在C# 3.0中引入的新特性:


其实这几个特性都是比较容易理解的,对于这几个特性,编译器帮我们做了更多的事情(想想匿名方法和迭代器块),从而简化我们的代码。


在C# 3.0以前,当我们定义属性的时候,一般使用下面的代码


在C# 3.0中引入了自动实现的属性,编译器会帮我们做更多的转换,所以我们可以把上面的属性实现代码转换为:


在使用了自动实现的属性之后,代码变短了,我们也没有必要再定义私有的字段。


其实,当查看过IL代码之后就会发现这里编译器帮我们定义了私有字段,实现了get/set方法。



注意,当使用结构的时候,如果要使用自动属性,会有一个小问题:所有的构造函数都需要显式地调用无参数的构造函数this(),只有这样,编译器才知道所有的字段都被明确的赋值了。


例如下面代码中,当我们删除":this()"后,编译器就会报错。


C# 1.0和C# 2.0中的类型系统是静态、显示和安全的。


在C# 3.0中我们可以使用var关键字定义隐式类型的变量,但是变量仍然是静态类型,只是编译器可以帮助我们推断变量的类型


下面看一段代码,使用隐式类型的语句跟注释掉的语句的IL代码是相同的:



通过代码的输出可以看到,每个隐式类型的变量都是静态类型(同样我们也可以通过VS单步调试来查看隐式类型变量的类型),在这里是编译器帮我们做了类型推断。


为了验证这一点,但我们给str变量赋一个整型的值时,就会得到一个"Cannot implicitly convert type 'int' to 'string'"的错误。


使用隐式类型的时候,会有一些限制,不是所有变量都能使用隐式类型:


有些时候使用隐式类型可以减少代码长度,通过不影响代码可读性,反而使我们把注意力放在了更有用的代码上;但是,有时候隐式类型会是代码可读性变差。所以要自己衡量什么时候使用隐式类型的变量。下面看一个简单的例子


在C# 3.0中,我们有了新的对象和集合初始化的方法。


当我们有了对象初始化程序的时候,对象初始化的代码就变得更加直观、简单。看一个例子:


当我们查看IL代码会发现,b1、b2和b3的IL代码完全一样。


】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
分享到: 
上一篇OpenCV 实现哈哈镜效果 下一篇C#迭代器

评论

帐  号: 密码: (新用户注册)
验 证 码:
表  情:
内  容: