Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/url/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# C语言中的匿名类型#_C#_Anonymous Types_Var - Fatal编程技术网

C# C语言中的匿名类型#

C# C语言中的匿名类型#,c#,anonymous-types,var,C#,Anonymous Types,Var,但是 ano创建的对象属性是只读的。我想弄明白为什么这些属性是只读的。欢迎您的建议 编辑: // ano is compiled as an anonymous type var ano = new { x1 = 10, y1 = "Hello" }; 如果新的匿名类型具有相同数量和相同顺序的属性类型,它的内部类型是否与第一个相同?var并不意味着“使用匿名类型”,而是意味着“编译器,为我找出类型!”。在前三种情况下,类型实际上是一个“命名”类型-System.Int32、System.St

但是

ano
创建的对象属性是只读的。我想弄明白为什么这些属性是只读的。欢迎您的建议

编辑:

// ano is compiled as an anonymous type 
var ano = new { x1 = 10, y1 = "Hello" };

如果新的匿名类型具有相同数量和相同顺序的属性类型,它的内部类型是否与第一个相同?

var
并不意味着“使用匿名类型”,而是意味着“编译器,为我找出类型!”。在前三种情况下,类型实际上是一个“命名”类型-
System.Int32
System.String
、和
System.Int32[]
(在最后一种情况下,编译器也会根据初始值设定项中的数组元素类型推断数组元素的类型)


最后一种情况是唯一使用匿名类型的情况。C#的匿名类型是不可变的,这是经过设计的。首先,在语言中添加它们的主要原因是引入了LINQ,在生成匿名类型的情况下,LINQ不需要可变性。一般来说,不可变类给设计人员带来的问题较少,特别是在涉及并发的情况下,因此该语言的设计人员决定使用不可变匿名类型。

匿名类型是不可变的,即不能更改


来自的有趣声明。找到了另一种选择

。。。[B] 确保成员不变,我们确保 哈希在对象的生存期内是常量。这允许匿名 与哈希表之类的集合一起使用的类型,而实际上 在修改成员时丢失它们。有很多好处 在这方面,它极大地简化了使用 对象,因为它们只能在创建和 然后刚刚使用(想想线程)


因为这就是它的本来面目——不变性很好。它允许的一个漂亮的“免费”特性是自动实现的合理的Equals/HashCode(具有一些基本的合理性,它将保持有效)。这在VB.NET中是不同的(表明它只是一个C#设计决策),其中需要
关键字来指定匿名类型的字段是不可变的。这正是C#标准中定义匿名类型的方式。如果你想让它们可变(或者只是其中一些可变),不要使用匿名类型。可能是Thankx的重复。还有一个问题。我编辑了这篇文章。是否有匿名类型的替代方案允许我在c#中设置值?@Leez是的。创建一个类型。您似乎正在走“如何在尽可能少的行中完成这一点”的道路,这虽然现在很方便,但两个月后当您尝试对代码进行故障排除时,将令人难以置信地沮丧。显式类型定义不是一件坏事。@Leez我认为使匿名类型不可变背后的逻辑是,如果您想要一个可变类型,您很可能会受益于为这种类型命名。给自定义类型一个名称可以让您自由地创建这种类型的对象,这些对象可以通过方法的边界传递,而无需跳转或使用
动态
类型。当然,您可以将匿名类型的一个对象替换为具有相同结构()类型的另一个对象。
// ano is compiled as an anonymous type 
var ano = new { x1 = 10, y1 = "Hello" };
var ano1 = new { x1 = 10, y1 = "Hello" };

var ano2 = new { x1 = 10, y1 = "Hello" };