为什么.NET中的匿名类型实现为引用类型?

cod*_*nix 9 .net linq performance anonymous-types value-type

因为无论如何匿名类型是只读的,如果它们作为结构实现它们会更有效,因此linq查询不需要创建大量的临时对象:

// This doesn't make any sense, it is just for demonstration
var result = thingies
.Select(x=> new {A = 1, B = 2, C = 3});
Run Code Online (Sandbox Code Playgroud)

顺便说一句.读这篇文章时,我有了这个想法

编辑:

最好的事情是,如果编译器将根据变量的大小和用法(必须传递给许多方法),决定是否生成值类型或引用类型.

但是,我在msdn中找到的以下句子会导致问题:

如果同一程序集中的两个或多个匿名类型具有相同的数量和类型的属性,则按相同的顺序,编译器将它们视为相同的类型.

由于匿名对象(及其关联类型)不能离开它所定义的方法,我们在这里没有问题,是吗?

Mik*_*keP 6

完整的.NET垃圾收集器针对两种情况进行了特别优化:持续大量时间的大型长寿命对象,以及快速消亡的小型,短期对象.Gen0系列实际上是免费的,因为它们有多快(如此快速和频繁,事实上,许多剖析器甚至不打扰显示它们或它们的内容),所以没有理由避免临时工作在范围内消失创建它们的功能.

匿名类型几乎完美地适合第二种情况; 它们并不意味着比创建它们的功能更长(尽管你可以用一些技巧来做).鉴于这个模型,并且鉴于大多数值类型的复制相对昂贵,并且鉴于许多LINQ查询涉及需要另一个副本的长链函数,我认为设计师选择制作他们引用类型.