2011-11-24 118 views
15

可能重复:
Inline property initialisation and trailing comma为什么C#4.0容忍匿名对象初始化代码中的尾随逗号?

在我的一个项目工作(C#4.0,Visual Studio 2010中),我意外地发现,这样的代码

var obj = new { field1 = "Test", field2 = 3, } 

被编译和执行OK没有任何错误或者甚至警告并且完全像

var obj = new { field1 = "Test", field2 = 3 } 

为什么编译器会容忍第一个例子中的尾部昏迷?这是编译器中的错误还是这样的行为确实有一些目的?

谢谢

+2

问题已经回答了..两次:http://stackoverflow.com/questions/3675173/why-can-you-have -a-comma-at-end-of-a-collection-initializer和http://stackoverflow.com/questions/2147333/net-enumeration-allows-comma-in-the-last-field – nowaq

+0

@nowaq我的不好,本来应该搜索过“昏迷昏迷”,而不是为“匿名对象昏迷”。 –

+0

您是否注意到它似乎也允许使用分号分号? – Gabe

回答

35

要确定它是否是编译器中的错误,您需要查看C#规范 - 在本例中为7.6.10.6,明确允许:

anonymous-object-creation-expression:  
    new anonymous-object-initializer 

anonymous-object-initializer: 
    { member-declarator-listopt } 
    { member-declarator-list , } 

所以不,它不是编译器的bug。该语言是故意设计的,以允许它。

现在至于为什么语言是按照这种方式设计的 - 我相信这是为了在编码时更容易添加和删除值。例如:

var obj = new { 
    field1 = "test", 
    field2 = 3, 
}; 

可以成为通过添加或移除行

var obj = new { 
    field2 = 3, 
}; 

var obj = new { 
    field1 = "test", 
    field2 = 3, 
    field3 = 4, 
}; 

单独。这使得维护代码变得更简单,并且更容易编写代码生成器。

注意,这是与数组的初始化,集合初始化和枚举一致:

// These are all valid 
string[] array = { "hello", }; 
List<string> list = new List<string> { "hello", }; 
enum Foo { Bar, } 
+0

感谢您指出规范;想想如果仔细阅读,我可能会发现其他有趣的东西:) –

+1

我认为这里最强烈的一点是代码生成器。让我们都面对它,这是一个非常好的功能,我们希望所有的语言都有。 –

+0

这就是drupal等框架,人们将其标记为不好的做法。 ??? – codingbiz

10

尾随逗号是好的一个原因是源比较。如果你更新源代码并使用源代码比较工具,那么源代码比较工具将只显示1行更改(新的字段3.如果没有尾部逗号,则源代码比较将显示2行更改,因为您必须添加逗号号码后3

var obj = new { 
    field1 = "Test", 
    field2 = 3, 
    } 

var obj = new { 
    field1 = "Test", 
    field2 = 3, 
    field3 = "New", 
    } 
3

要删除最后一个字段容易,我想。实在是做这个的语法推出没有歧义,所以它只是使生活更容易一点。