为什么C#4.0在匿名对象初始化代码中允许尾随逗号

本文关键字:代码 许尾随 初始化 对象 C#4 为什么 | 更新日期: 2023-09-27 18:15:49

可能重复:
内联属性初始化和尾部逗号

在我的一个项目(C#4.0,Visual Studio 2010(中,我意外地发现了类似的代码

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

编译和执行正常,没有任何错误甚至警告,工作原理与完全相同

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

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

感谢

为什么C#4.0在匿名对象初始化代码中允许尾随逗号

要确定这是否是编译器中的错误,您需要查看C#规范-在本例中是第7.6.10.6节,它清楚地允许:

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

所以不,这不是编译器错误。这种语言是故意设计出来的。

现在,关于为什么语言是这样设计的——我相信这是为了在编码时更容易添加和删除值。例如:

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, }

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

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

我想,为了更容易删除最后一个字段。这样做确实不会在语法中引入歧义,所以它只会让生活变得更轻松。