为什么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#规范-在本例中是第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",
}
我想,为了更容易删除最后一个字段。这样做确实不会在语法中引入歧义,所以它只会让生活变得更轻松。