【问题标题】:.NET Enumeration allows comma in the last field.NET 枚举允许在最后一个字段中使用逗号
【发布时间】:2011-01-09 23:30:06
【问题描述】:

为什么允许这个 .NET 枚举在最后一个字段中有逗号?
这有什么特殊含义吗?

[FlagsAttribute]
public enum DependencyPropertyOptions : byte
{
           Default = 1,
           ReadOnly = 2,
           Optional = 4,
           DelegateProperty = 32,
           Metadata = 8,
           NonSerialized = 16,
}

【问题讨论】:

  • 因为 C# 是由真正的程序员设计的,而不是委员会。
  • 而且,C 是由一个委员会设计的 :)
  • 我希望丹尼斯·里奇不会看到这条评论。
  • 我注意到在object inline initialization/object initializers 中可以观察到相同的情况。 (同样注意到 Sergey Teplyakov 在下面提到了这一点。)
  • 只有我一个人,还是如果所有语言都允许这样做会更好吗?例如SQL、JSON 等

标签: c# .net enums


【解决方案1】:

没有什么特殊含义,只是编译器的工作方式,主要是这个原因:

[FlagsAttribute]
public enum DependencyPropertyOptions : byte
{
           Default = 1,
           ReadOnly = 2,
           Optional = 4,
           DelegateProperty = 32,
           Metadata = 8,
           NonSerialized = 16,
           //EnumPropertyIWantToCommentOutEasily = 32
}

根据评论请求:此信息直接来自C# Specification (Page 355/Section 17.7)

与标准 C++ 一样,C# 允许在数组初始化程序的末尾使用尾随逗号。此语法提供了在此类列表中添加或删除成员的灵活性,并简化了此类列表的机器生成。

【讨论】:

  • 编译器按照语言规范工作(我认为有一些例外)。语言语法指定在这种情况下多余的逗号是合法的(以及在其他一些情况下,例如对象初始化程序、集合初始化程序和数组初始化程序)。此外,除非您知道语法是为此目的而设计的,否则说它提供了您列出的好处可能更正确。如果没有第一手的知识,我不会声称知道语言委员会的动机。
  • @jason - 这很有意义
  • @Jason 澄清一下,这不是我的想法,它实际上已在 C# 规范中注明:ecma-international.org/publications/files/ECMA-ST/Ecma-334.pdf(第 363 页/第 19.7 节)“与标准 C++ 一样,C# 允许在数组初始化器的末尾。这种语法提供了在此类列表中添加或删除成员的灵活性,并简化了此类列表的机器生成。"
  • 然而,该列表并未初始化数组,而是定义了一个枚举。它仍然被认为是一个数组初始化器吗?或者标准中是否有其他一些特定于枚举的规定?
  • 啊,对于枚举 ECMA-334,第 21.1 节最后说:“[注意:C# 允许在枚举主体中使用尾随逗号,就像它允许在数组初始化器中使用逗号一样(§ 19.6). 结束注]".
【解决方案2】:

另外(对 Nick Craver 的帖子)添加新的枚举要容易得多。

这种行为不仅仅适用于枚举。考虑以下:

var list = new int[] { 1, 2, 3, };

【讨论】:

    【解决方案3】:

    另一个原因:它使 gen 编码更容易。

    【讨论】:

      【解决方案4】:

      我知道这是一个老话题,但是,另一种对这个问题有意义的方法是代码版本控制系统。

      考虑以下示例:

      //version 1
      var myArray = {
          "item 1",
          "item 2"
      };
      //version 2
      var myArray = {
          "item 1",
          "item 2", //will be considered a change, it may be considered an erroneous approach
          "item 3"
      }
      

      现在考虑这种方法:

      //version 1
      var myArray = {
          "item 1",
          "item 2",
      };
      //version 2
      var myArray = {
          "item 1",
          "item 2", //will not be considered a change, it may be considered an erroneous approach too, but, means that the code wasn't changed intrinsically
          "item 3",
      };
      

      无论如何,视情况而定,这两种方法都可能被认为是不正确或正确的。我特别喜欢第二种方法,它在处理代码版本控制系统时更有意义。

      无论如何希望这会有所帮助。

      【讨论】:

        【解决方案5】:

        为什么要添加逗号

        为什么在手动编写代码时应该利用此功能?

        1. 生成的补丁所受影响的线条较少。这使它们更易于阅读和审查。
        2. 自动合并和冲突解决更准确,因为没有额外的噪音来混淆算法。

        示例

        没有尾随逗号(好的)

        前一个开发者没有留下逗号的情况下添加一行的示例:

        @@ -119,7 +119,8 @@ namespace SomeApp.Example
           {
             NameTitle = contact.NameTitle,
             GivenName = contact.GivenName,
        -    FamilyName = contact.FamilyName
        +    FamilyName = contact.FamilyName,
        +    ProperName = contact.ProperName
           },
           ContactTelephone1 = contact.ContactTelephone1,
           ContactType = contact.ContactType,
        

        不带逗号(更好)


        前一个开发者留下逗号时添加一行的示例:

        @@ -122,2 +122,3 @@ namespace SomeApp.Example
             FamilyName = contact.FamilyName,
        +    ProperName = contact.ProperName,
           },
        

        请注意,后者添加了一行,而删除了一行,添加了两行。这对人和机器来说都更容易处理。

        他们为什么将它添加到 C# 中?

        至于为什么允许,根据其他答案:

        C# 规范(第 355 页/第 17.7 节)指出:

        与标准 C++ 一样,C# 允许在数组初始化程序的末尾使用尾随逗号。此语法提供了在此类列表中添加或删除成员的灵活性,并简化了此类列表的机器生成。


        这适用于数组初始化器、对象初始化器和枚举。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2010-10-22
          • 2017-04-13
          • 1970-01-01
          • 2016-11-26
          • 1970-01-01
          • 2016-04-05
          • 1970-01-01
          • 2012-03-01
          相关资源
          最近更新 更多