c#3.0系列:Anonymous Type In CLR(3.5)

我们说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(). 如下图:

结构如下:
internal sealed class <>f__AnonymousType0<<Name>j__TPar, <Age>j__TPar>
{
    
// Fields    
private readonly <Age>j__TPar <Age>i__Field;
        
private readonly <Name>j__TPar <Name>i__Field;

    
// Methods    
public <>f__AnonymousType0(<Name>j__TPar Name, <Age>j__TPar Age);
    
    
public override bool Equals(object value);
        
public override int GetHashCode();
        
public override string ToString();

    
// Properties
    public <Age>j__TPar Age { get; }
    
public <Name>j__TPar Name { get; }
}
再看看下面的例子。
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中,编译器只会生成一个匿名类型,这些对象都是该唯一的匿名类型的实例。

posted on 2008-04-09 14:19 gjcn 阅读(1717) 评论(9)  编辑 收藏 所属分类: Net Framework

评论

#1楼  2008-04-09 14:30 BlueMountain      

收藏了 慢慢看   回复  引用  查看    

#2楼  2008-04-09 15:07 iori--------- [未注册用户]

顶!!   回复  引用    

#3楼  2008-04-09 15:27 李战      

翻译的吗?似乎还有些英文单词没有翻译完,要借助糍粑才看得懂。   回复  引用  查看    

#4楼 [楼主] 2008-04-09 15:30 gjcn      

@李战
不是的,那些都是基本单词啊。下次注意一下。Thx!   回复  引用  查看    

#5楼  2008-04-09 15:49 生鱼片      

不错   回复  引用  查看    

#6楼  2008-04-09 16:51 lbq1221119      

不错 呵呵
结合点msil看看都是做了些什么和如何实现的就完美了.
  回复  引用  查看    

#7楼 [楼主] 2008-04-09 17:01 gjcn      

@lbq1221119
多谢!!前段时间有点忙,没时间写。
怎么最近没上msn啊!   回复  引用  查看    

#8楼  2008-04-09 17:06 lbq1221119      

@gjcn
在培训呢,最近debug功力大增,
回头好好整几篇文章出来

写的不错,欢迎推荐到sscli圈子里面去 呵呵   回复  引用  查看    

#9楼 [楼主] 2008-04-10 09:47 gjcn      

@lbq1221119
不错啊,有很好的培训机会这很重要啊。期待你的文章。   回复  引用  查看    


标题  
姓名  
主页
Email (只有博主才能看到) 
验证码 *  看不清,换一张 [登录][注册]
内容(请不要发表任何与政治相关的内容)  
  登录  使用高级评论  新用户注册  返回页首  恢复上次提交      
该文被作者在 2008-04-11 09:54 编辑过


相关链接:
 




导航

公告

These postings are provided "AS IS" with no warranties, and confer no rights.
<2008年4月>
303112345
6789101112
13141516171819
20212223242526
27282930123
45678910

统计

与我联系

搜索

 

常用链接

留言簿

我参与的团队

随笔分类

随笔档案

文章分类

友情BLOG

最新评论

阅读排行榜

评论排行榜