C# 3.0语言新特性(语言规范):5 匿名类型

规范

原文:《C# Version 3.0 Specification》,Microsoft
翻译:lover_P
C# 3.0允许将new运算符用于一个匿名对象初始化器来创建一个匿名类型的对象。

primary-no-array-creation-expression:
...
anonymous-object-creation-expression

anonymous-object-creation-expression:
new  anonymous-object-initializer

anonymous-object-initializer:
{  member-declarator-listopt  }
{  member-declarator-list  ,  }

member-declarator-list:
member-declarator
member-declarator-list  ,  member-declarator

member-declarator:
simple-name
member-access
identifier  =  expression

一个匿名对象初始化器声明了一个匿名类型并返回了该类型的一个实例。匿名类型是一个没有名字并且直接继承自object的类类型。匿名类型的成员是一系列可读/写属性,这些属性依次通过创建该类型的实例时使用的对象初始化器进行推断。特殊地,具有下面形式的一个匿名对象初始化器:

new { p1 = e1 , p2 = e2, ... pn = en }

声明了一个具有下面形式的匿名类型:

class __Anonymous1

{

    private T1 f1;

    private T2 f2;

    ...

    private Tn fn;

 

    public T1 p1 { get { return f1; } set { f1 = value; } }

    public T2 p2 { get { return f2; } set { f2 = value; } }

    ...

    public Tn pn { get { return fn; } set { fn = value; } }

}

其中的每个Tx是对应的表达式ex的类型。如果匿名对象初始化器中的某个表达式具有空类型,会发生一个编译期错误。

匿名类型的名字由编译器自动生成,并且不能在程序文本中引用。

在同一个程序中,两个具有相同名字、相同类型和相同顺序的属性的匿名对象初始化器将产生同一个匿名类型的实例。(这个定义包括了属性的顺序,这是因为在某些环境中顺序是可见的而且是非常重要的,比如反射。)

下面的例子:

var p1 = new { Name = "Lawnmower", Price = 495.00 };

var p2 = new { Name = "Shovel", Price = 26.95 };

p1 = p2;

其中最后一行中的赋值是允许的,因为p1和p2具有相同的匿名类型。

一个成员初始化器可以缩写为一个简单名字或一个成员访问。这时称该成员初始化器为发散性初始化器(Projection Initializer),也是对具有相同名字的属性的声明和赋值的简写。特别地,具有下面形式的成员声明器:

identifier
 expr  .  identifier
 

与下面的对应形式完全等价:

identifier  =  identifier
 identifier  =  expr  .  identifier
 

因此,在一个发散性的初始化器中,identifier同时选择了所赋的值的值和域或属性。直观上看,发散性的初始化器反映出的不仅仅是一个值,还包括这个值的名字。

 

时间: 2024-08-19 20:51:49

C# 3.0语言新特性(语言规范):5 匿名类型的相关文章

在Eclipse 3.1中体验J2SE 5.0的新特性: 第一部分 :枚举类型

J2SE 5.0 (Tiger)的发布是Java语言发展史上的一个重要的里程碑, 是迄今为止在 Java 编程方面所取得的最大进步. J2SE 5.0提供了很多令人激动的特性.这些特性包括范型(generics)的支持, 枚举类型 (enumeration)的支持, 元数据(metadata)的支持, 自动拆箱(unboxing)/装箱 (autoboxing), 可变个数参数(varargs), 静态导入(static imports), 以及新的线程架 构(Thread framework)

在Eclipse 3.1中体验J2SE 5.0的新特性 第二部分 :注释类型

J2SE 5.0 (Tiger)的发布是Java语言发展史上的一个重要的里程碑, 是迄今为止在 Java 编程方面所取得的最大进步. J2SE 5.0提供了很多令人激动的特性.这些特性包括范型(generics)的支持, 枚举类 型(enumeration)的支持, 元数据(metadata)的支持, 自动拆箱(unboxing)/装箱 (autoboxing), 可变个数参数(varargs), 静态导入(static imports), 以及新的线程架 构(Thread framework)

C# 3.0新特性初步研究 Part5:匿名类型

匿名类型(Anonymouse Type)--这年头什么多系都匿名了 : )在初始化的时候根据初始化列表自动产生类型的一种机制. 典型的代码:1class Program2    {3        static void Main(string[] args)4        {5            var x = new { a = 3, b = 5, c = "some text" };6            Console.WriteLine(x.a.ToString()

AS代码2.0:新的语言元素

Flash的ActionScript(简称AS)代码控制是Flash实现交互性的重要组成部分,也是区别于其他动画软件的看家本领.今年新发布的Flash MX Professional 2004的动作脚本语言已经升级到2.0,它是一种面向对象的脚本语言,执行ECMA-262脚本语言规范,支持继承.强类型和事件模型.使用动作脚本语言2.0可以编写出更加稳健的脚本. 动作脚本语言2.0的新特性包括:新的语言元素.改进的编辑和调试工具.引入更多.的面向对象编程模型. 本系列文章将向大家详细介绍AS代码2

《Visual C++ 2012 开发权威指南》——第2章 Visual C++2012语言新特性2.1 Visual C++2012的语言新特性(1)

第2章 Visual C++2012语言新特性 Visual C++ 2012 开发权威指南 有一种新的C++标准就有一种新版本的Visual C++,新的版本Visual C++将更加符合C++标准!在其发展过程中新的C++标准被(乐观)称为C++0x.它最后被发布在2011年,现在称为C++11. 对于Visual C++,它有三个不同版本的数字,有不同的内部版本和编译器版本(cl.exe和_MSC_VER宏-显示不同,因为我们C++编译器早在Visual C++中的"可视化").

《Visual C++ 2012 开发权威指南》——2.2 Visual C++2012的语言新特性(2)

2.2 Visual C++2012的语言新特性(2) Rvalue引用:N1610"Rvalues类对象的初始化的澄清"是早期尝试启用无rvalue引用move 语意. 这些新规则还没有完全实现VC11开发者预览中. Rvalue引用v3.0添加自动生成的构造函数和移动赋值运算符在一定条件下的新规则.这不会进行中VC11,还将继续遵循的永远不会自动生成move构造函数/移动页本页的行为. 移动语义 Rvalue引用支持移动语义的实现,可以显著提高应用程序的性能.移动语义使能够调用资源

《Visual C++ 2012 开发权威指南》——2.3 Visual C++2012的语言新特性(3)

2.3 Visual C++2012的语言新特性(3) 在VC12(Visual C++2012),我们打算完全支持C++11标准库,但实施编译器功能可以自定义(另外,VC12不会完全实现C99标准库,已经通过引用纳入C++11标准库.注意本页和VC12已经有).这里是我们不断的变化的非详尽列表: 新头文件:......和. 进驻:根据需要由C++11,我们已经实现了emplace()/emplacefront()/emplace_back()/ emplace hint()/emplace_a

Spring 2.0的新特性点评

Spring2.0的发布恐怕算得上2006年Java社区的一件大事了.在Spring2.0发布附带的文档里面对2.0新特性做了概要的介绍,2.0的新特性是自然是我们最关注的方面: 一.Spring的XML配置引入XML Schema语法简化配置 在Spring1.x系列中,bean的配置文件使用DTD,没有namespace的分隔.2.0的一个非常大的改进是引入了XML Schema的namespace,因而可以将bean的配置文件做大幅度的简化.这些简化包括了对bean属性的各种简化,AOP配

《Ext JS实战》——1.4 Ext JS 3.0的新特性

1.4 Ext JS 3.0的新特性 Ext JS 2.0中引入的一些变化是颠覆性的,这就导致从级到2.0相当困难.这主要是因为这一版引入了一个更加现代的布局管理器以及一个崭新的.健壮的组件层次,许多Ext JS 1.x的代码都会因此而崩溃.值得庆幸的是,由于Ext JS 2.0的良好的工艺设计,从Ext JS 2.0到3.0的移植就非常容易了.尽管Ext JS 3.0新增的内容并不怎么神奇,不过最新的版本还是可圈可点的,有些新增的特性还是值得讨论的. 1.4.1 Ext JS通过Direct完

C#7.0中新特性汇总_C#教程

以下将是 C# 7.0 中所有计划的语言特性的描述.随着 Visual Studio "15" Preview 4 版本的发布,这些特性中的大部分将活跃起来.现在是时候来展示这些特性,你也告诉借此告诉我们你的想法! C#7.0 增加了许多新功能,并专注于数据消费,简化代码和性能的改善.或许最大的特性就是元祖和模式匹配,元祖可以很容易地拥有多个返回结果,而模型匹配可以根据数据的"形"的不同来简化代码.我们希望,将它们结合起来,从而使你的代码更加简洁高效,也可以使你更加