WEB开发网
开发学院软件开发C语言 C#3.0语言新特性之匿名变量 阅读

C#3.0语言新特性之匿名变量

 2009-03-09 08:19:52 来源:WEB开发网   
核心提示: 如果像这样封装的成员太多,代码量还是很可怕的,C#3.0语言新特性之匿名变量(2),并且维护的工作量也相当大,针对于这些问题,这两个特性很多时候是一起作用的,如:var book = new { Name = "C#", Price = 100};上面的book就是一个

如果像这样封装的成员太多,代码量还是很可怕的,并且维护的工作量也相当大。针对于这些问题,在C# 3.0中,我们有了一个解决这种问题的捷径,称之为匿名类型,它是C#匿名方法语法的扩展。

20.2.2 创建和使用引入匿名变量

var与new关键字一起使用时,可以创建匿名类型。匿名类型只是一个继承了object的、没有名称的类。该类的定义从初始化器中推断,类似于隐式类型化的变量。看下面的例子:

如果需要一个对象包含名字和价格,则可以声明如下:

// 代表一些书的一个匿名对象

var book = new { Name = "C#", Price = 100};

这会生成一个包含Name和Price属性的对象。如果创建另一个对象,如下所示:

var bookA = new { Name = "C# 3.0", Price = 80 };

其中,book和bookA的类型就是相同的。例如,我们可以这样设置:

book = bookA;

 

如果所设置的值来自于另一个对象,初始化器就可以简化。如果已经有一个包含Name和Price属性的类,且有一个该类的实例b,则book对象就可以初始化为:

BookAsGood b = new BookAsGood();

var book = new { b.Name, b.Price };

在上面的代码中,b对象的属性名应投射为新对象名book。所以book对象应有Name和Price属性。

定义好之后,我们就可以这样来访问它的属性,如:

// 像普通实例那样访问其中的属性

Console.WriteLine(book.Name);

如果换成这样访问呢?如:

book.Name = "C# 3.0";

编译器会报错:无法对属性或索引器“AnonymousType#1.Name”赋值 -- 它是只读的。因为在这里book的各个属性只实现了get而没有实现set。所谓“匿名类型”,可以看到,我们有了一个叫做book的实例,但却没有它的强类型名称,在定义的时候将其定义为隐式类型(事实上这也是强制的)。在给它指定属性的时候也采用的对象初始化器的语法。在实际运行的时候,C#编译器会为它生成一个隐藏的类型名称,我们在程序中是不能对它进行访问的。

一个匿名类型也是它的生存周期,那就是在生成它的方法之内。如果要向另一个方法以参数的形式传递它,那就必须先将其转换为object类型(匿名类型也是从object直接派生而来的)。但是这样会毁坏它内部属性的强类型。如果需要保持内部属性的强类型,所以建议在大多数情况下,还是采用传统的类或者结构体来存储数据比较可靠。

20.2.3 匿名变量与隐式类型变量的区别

l         隐式类型变量是指我们可以通过等号右边的表达式,推断出等号左边该是那种类型。如:

var Name = "C#";

我们可以根据等号右边的表达式“C#”,推断出等号左边的变量Name是string类型。

l         匿名变量则是指根据这个类型的初始化函数,我们可以推导出和创建出这个类型的实例。这两个特性很多时候是一起作用的。如:

var book = new { Name = "C#", Price = 100};

上面的book就是一个匿名变量。其中的Name = "C#"和Price = 100又可以分别看作是隐式类型变量。

上一页  1 2 

Tags:语言 特性 匿名

编辑录入:爽爽 [复制链接] [打 印]
赞助商链接