惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

Martin Fowler
Martin Fowler
有赞技术团队
有赞技术团队
博客园_首页
H
Help Net Security
GbyAI
GbyAI
aimingoo的专栏
aimingoo的专栏
V
Visual Studio Blog
The Cloudflare Blog
腾讯CDC
Jina AI
Jina AI
Last Week in AI
Last Week in AI
月光博客
月光博客
博客园 - 叶小钗
Google DeepMind News
Google DeepMind News
B
Blog RSS Feed
Blog — PlanetScale
Blog — PlanetScale
人人都是产品经理
人人都是产品经理
Engineering at Meta
Engineering at Meta
Y
Y Combinator Blog
Hugging Face - Blog
Hugging Face - Blog
博客园 - 聂微东
爱范儿
爱范儿
N
Netflix TechBlog - Medium
F
Fortinet All Blogs

博客园 - gjcn

2011,美好生活的一年 8万亿 全球第二还是最二? CLR系列:浅析委托 CLR系列:浅析.NET的JIT编译 CLR系列:浅析泛型的本质 Linq系列:基础与本质(Part III) Linq系列:基础与本质(Part II) Linq系列:基础与本质(Part I) CLR系列:由一段代码所想到的 {Agile},{CMMI},现状 CLR系列:大型对象堆 CLR系列:窥视HashTable c#3.0系列:Object Initializer 和 Collection Initializer c#3.0系列:Extension Method c#3.0系列:Automatic Property Quiz:who win in finally vs return? Inside C#(一些内部实现的东西) Multi-Language of web application project ASP.NET应用程序的文件组成及编译过程
c#3.0系列:Anonymous Type In CLR(3.5) - gjcn
gjcn · 2008-04-09 · via 博客园 - gjcn

我们说Anonymous Type是C# 3.0的新的特性,而没有说Anonymous Type是.NET Framework 3.5的新特性。这是因为Anonymous Type仅仅是.NET Programming Language和相应的Compiler的新引入的特征。而对于.NET Framework 3.5来说,它看不到这和原来有什么不同,对于Anonymous Type和一般的Named Type,对于CLR来说他们之间没有什么本质的区别。
通过下面这样的一段简单的代码:

1var p1 = new { Name = "IORI", Age = 27 };

然后我们再看看IL:

Code

我们再这里就可以看出Compiler将会为p1这个Anonymous Type创建一个名为<>f__AnonymousType0`2<string,int32>的类型。参数将根据数据成员的具体结构,这里也是声明一个类型。这个类继承自object,并且重写了ToString() 和 GetHashCode()的实现。所有的匿名类型自动继承自System.Object ,并且重写了Equals(), GetHashCode(), and ToString(). 如下图:


结构如下:

再看看下面的例子。

Code

我们看看输出的结果。

通过以上的结果我们更能对Compiler会为Anonymous Type创建的类型更好的理解。
GetHashCode()   实现时,根据匿名类型的每个成员作为System.Collections.Generic.EqualityComparer<T>的输入,来计算hash值。因此,如果2个匿名类型有相同的属性字段,同时每个字段的值也相同,那么生成的Hash值也就相等。
ToString()   只是简单的用 属性名称/属性值 构造了一个字符串。

Equals()      结果相等,因为它使用值来比较相等。
==             结果不等,因为匿名类型没有重载 == 和 != , 这两个操作符默认情况下,比较的是对象的引用而不是值。
总结:
• Anonymous types 继承 System.Object.
• The fields and properties 是read-only.
• Anonymous types 不支持events, custom methods, custom operators, or custom overrides.
• Anonymous types 是个密封类.
• Anonymous types 用自己定义的构造方法(不可以修改)来创建的.
最重要的是
Compiler在生成Anonymous types 的时候,并不是为每个如{N=?, N2 =? , ...}的结构生成一个不同的Type,它只会为不同的参数列表的结构:参数的名称,参数的数据类型,参数的相互顺序定义不同的Type(不包含参数的值)。而具有相同的参数列表的{N=?, N2 =? , ...}会共享同一个Type。但是这种仅限于在同一个Assembly中,编译器只会生成一个匿名类型,这些对象都是该唯一的匿名类型的实例。

在同一个程序集内,两个匿名对象具有相同的属性、相同的属性顺序。编译器将认为这两个匿名对象是相同的。


版权所有归"布衣软件工作者".未经容许不得转载.