有没有办法在C#中创建匿名结构?

时间:2010-02-15 16:27:41

标签: c# anonymous-types struct

匿名类型从对象派生似乎没有任何办法。但我想我会问,因为很多时候我们在简单查询表达式中使用匿名类型来提取要在我们创建的匿名类型中使用的数据子集。在我看来,它们应该是结构(值类型),以提高内存效率与参考类型。

思想?

5 个答案:

答案 0 :(得分:29)

没有支持的C#语法会产生匿名结构

答案 1 :(得分:15)

更新:C#7现在具有值类型元组,可以在使用引用类型匿名类型的相同类型的上下文中使用。


似乎有这种普遍认为的价值类型比参考类型“更有效”。这完全是神话般的;它们对某些操作更有效,而对其他操作效率更低。

例如,如果您关注的工作单元是“将值复制到新位置”工作,则大值类型与引用类型相比效率较低。引用类型复制指针大小的引用,而不管引用数据的大小,因此复制在单个高度优化的机器指令中。值类型每次复制数据的大小,这可能非常大并且需要多个指令。

无论如何,匿名类型仅仅是一种便利功能。如果您不喜欢它们的性能特征,则不必使用它们。如果您愿意,可以定义自己的结构。

答案 2 :(得分:3)

你有没有想过你的应用程序,发现匿名类型是最慢的部分?如果是这样,我建议你手动创建所需的结构并重新测试,看看是否能解决问题。否则,我会花更多的时间来担心手头的业务问题和更少的打字时间(如功能允许)。

答案 3 :(得分:3)

对于许多用例,如果实现为公共字段结构而不是不可变类,则匿名类型和元组将更有效;特定的匿名类型或元组是否会更高效,因为这样的结构或不可变类不是特别是它的大小的函数,而是它的使用方式的函数。如果一个东西永远不会被装箱,那么使用结构与类的相对成本将取决于大小以及必须复制多少次(注意所谓的“不可变”结构通常必须比公共字段结构复制的次数多很多次。如果一个东西在构造之后只被复制一次或两次(在许多使用场景中很常见),那么几乎任何大小的公共字段结构将比不可变类的表现更好。另一方面,如果事物经常被强制转换为引用类型,则不可变类将大大优于结构,无论多小

将结构类型强制转换为引用类型的费用,以及某些用例需要经常这样做的事实,意味着即使对于大多数临时对象结构而言,比不可变类对象更有效,对所有内容使用结构也是如此效率低于使用不可变类对象的效率。结构允许整体性能提高10%或更多的用例可能太少,无法证明拥有两种不同类型的元组和两种不同类型的内置匿名类型的成本。需要开放式结构的性能优势的代码可以很容易地为其确切目的定义结构类型。

答案 4 :(得分:0)

我有时会使用匿名对象:

var x = new 
{
    itm0 = new { key = "key0", val = 0},
    itm1 = new { key = "key1", val = 1},
};