本博客已经转移至www.mozlite.com,可能不会及时更新和关注留言记录,mvc请加群88794325(已满),8781765ASP.NET(MVC)讨论二群

[.NET 3.x新特性五]匿名类型

    今天我们来看看C#3.0中的最后一个特性:匿名类型。什么是匿名类型呢?在我们开发过程中离不开JS,JS中的变量声明就属于匿名类型。匿名类型有一个关键字var,但是在C#3.0中的匿名类型在CLR并没有改变,只是在第一次付值时进行类型的判定,而且一旦付值该变量的类型也就确定了,在后面的引用中就不能够改变了,本文和前面一样通过一些例子来说明匿名类型的使用和原理等。

    千言万语也不及一个例子,OK我们来看一个例子,在前面我们定一个Person类,并且实例化了一个List<Person>实例(可以在这一系列的文章中找到,如果你没有看过不妨观摩观摩)。我们还是拿这些来举例,代码如下:

    从上面中我们可以在智能提示中看出我们匿名类型的应用,上面的results就相当于我们IEnumerable<T>,当我们取出结果后又声明了匿名类,包含两个字段(属性)Name,NickName,并以选取的结果实例化他们;而下面的r就相当于当前类型,在智能提示中就可以看到。而在resluts和r确定类型后就不能在实例化其他类型了,OK下面让我们来好好理解一下这个关键字var。

    上面的var虽然有点像JS中的一样,但是他只是一个强类型的引用,她也是强类型的。当我们应用var来声明变量时,他只是告诉编译器这个变量的类型是在初始化时来确定他的类型,一旦确定就不能更改,否则就会抛出异常。为了更好的理解这个关键字,让我们再来看看几个例子,我们声明几个变量并对其初始化,代码如下:

1             var name = "网魂小兵";
2             var age = 23;
3             var isMale = true;

    上面声明的三个变量虽然都用var来定义,但是他的类型是不一样的,其中name为String,age为int,isMale为bool类型。var只是告诉编译器name,age,isMale在编译时来定义他的类型,也就是说在IL中的定义就是:

1             string name = "网魂小兵";
2             int age = 23;
3             bool isMale = true;

    现在是不是有点理解了呢?简单的说他就是来骗我们的,但是这也有一个好处我们在用LinQ时经常都是事先不知道类型的,这样我们就可以用var而不需要预先声明一个类,但是他也会给我们的带来代码阅读性的降低。每一件事情都有它的两名性,至于如何取舍还是看大家自己的了。我觉得如果不是在预先不知类型的情况下还是用当前类型来定义比较好一点,这样可以提高代码的阅读性,但是像LinQ中在未知类型的情况下当然用var会给我带来不少的方便。
说到这里.NET3.x(C#3.0)的特性基本上就定型了,下面我要慢慢的深入理解一下LinQ的各个方法以及他的查询方法,特别是对数据库的应用,欲知后事如何,且听下回分解....
posted @ 2007-09-08 11:32  网魂小兵  Views(3356)  Comments(17Edit  收藏  举报