【问题标题】:Why C# 4.0 tolerates trailing comma in anonymous objects initialization code? [duplicate]为什么 C# 4.0 允许匿名对象初始化代码中的尾随逗号? [复制]
【发布时间】:2011-11-24 07:18:05
【问题描述】:

可能重复:
Inline property initialisation and trailing comma

在我的一个项目(C# 4.0,Visual Studio 2010)上工作时,我偶然发现了类似的代码

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

编译和执行正常,没有任何错误甚至警告,并且工作方式与

完全一样
var obj = new { field1 = "Test", field2 = 3 }

为什么编译器会容忍第一个示例中的尾随逗号?这是编译器中的错误还是这种行为确实有某种目的?

谢谢

【问题讨论】:

标签: c# compilation


【解决方案1】:

要确定它是否是编译器中的错误,您需要查看 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, }

【讨论】:

  • 感谢您指出规范;如果仔细阅读,我想我可能会在那里找到一些其他有趣的东西:)
  • 我认为这里最强的一点是代码生成器。让我们都面对现实吧,这是我们希望所有语言都拥有的一个非常好的功能。
  • drupal 等框架就是这样做的,人们将其标记为不好的做法。 ???
  • @codingbiz:谁将究竟是什么标记为不好的做法?
  • @codingbiz:同样的人完全有可能不喜欢在 C# 中使用它。您不应该认为这只是平台偏见。
【解决方案2】:

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

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

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

【讨论】:

    【解决方案3】:

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

    【讨论】:

      猜你喜欢
      • 2011-10-25
      • 2015-01-08
      • 2012-07-20
      • 2018-02-14
      相关资源
      最近更新 更多