一个简单而简洁的定义和对C#中匿名类型的解释?

RCI*_*CIX 0 c# anonymous-types

我不知道C#中的"匿名类型"是什么,也不知道它是如何使用的.可以给我一个很好的描述它,它的使用?

[注意:我真的知道它是什么以及如何使用它,但我想要求那些不使用它的人]

Jon*_*eet 7

匿名类型是由编译器生成的类型,因为表达式如下:

new { Property1 = x.Value1, Property2 = y.Value2, z.Value3 }
Run Code Online (Sandbox Code Playgroud)

(最后一个是这样的Value3 = z.Value3).

匿名类型的名称是"不可言说的" - 即你不能在正常的C#中指定它 - 但就CLR而言,它是一个完全正常的类型.由于无法编写名称,如果要创建匿名类型的变量(或使用匿名类型作为类型参数的泛型类型),则需要使用带有关键字的隐式类型局部变量var:

var person = new { Name = "Bill", Address = "..." };
Run Code Online (Sandbox Code Playgroud)

C#匿名类型是不可变的(即属性是只读的) - 生成的类型有一个构造函数,它将所有属性的值作为参数.属性类型是从值推断的.

匿名类型覆盖GetHashCode,EqualsToString以相当明显的方式 - 每个属性类型的默认相等比较器用于散列和相等.

它们通常在LINQ中使用,就像在SQL中使用"SELECT Value1 As Property1,Value2 As Property2,Value3"一样.

每个使用相同属性名称和类型的匿名类型初始化表达式将引用相同的类型,因此您可以编写:

var x = new { Name = "Fred", Age = 10 };
x = new { Name = "Bill", Age = 15 };
Run Code Online (Sandbox Code Playgroud)

同样值得一提的是,VB匿名类型略有不同:默认情况下,它们是可变的.您可以使用"Key"关键字使每个单独的属性不可变.我个人更喜欢C#方式,但我可以看到在某些情况下可变性很有用.

  • @jasonh:括号中的逗号分隔值,例如{X = 2,Y = 10} (2认同)