C# - 对象初始化程序的语法

时间:2016-06-03 22:27:03

标签: c#

所以,我正在修改我的一个代码,最后写了这样的东西,

class TestClass
{
    static void Main(string[] args)
    {
        var lstObj = new List<List<string>>()
        {
            new List<string>() { "ABC","DEF", },
            new List<string>() {"GHI","JKL" },
        };
    }
}

请注意以下行中的额外逗号(&#34;,&#34;)

  

new List(){&#34; ABC&#34;,&#34; DEF&#34;,},//&#34; DEF&#34;

     
    

new List(){&#34; GHI&#34;,&#34; JKL&#34; },//在&#39;}&#39;

之后   

在意识到错字之后,我决定取消Build,更正它并重新启动Build。但是我太晚了,令我惊讶的是,Build已经成功完成了。

我只是想知道这是否是正确的语法或者它是否具有任何特殊含义。

尝试查找支持此功能的文档,但无法找到。尝试查找C#语言规范,理解与此相关的任何内容都超出了我的能力。

3 个答案:

答案 0 :(得分:5)

C#允许在多个地方使用额外的逗号。考虑对象初始化器,C#5.0语言规范在7.6.10.2节中提到:

object-initializer:
    {   member-initializer-list_opt   }
    {   member-initializer-list   ,   }

member-initializer-list:
    member-initializer
    member-initializer-list   ,   member-initializer

请注意,明确允许使用额外的逗号。

我认为这是设计决定摆脱无用的编译器错误。允许使用额外的逗号不会给语言添加任何歧义。

答案 1 :(得分:4)

C#忽略括号初始值设定项中的尾随逗号。除了Martin引用的规范部分之外,在官方Microsoft示例中存在此at least one示例(请参阅student2示例)。在你的情况下:

new List<string>() { "ABC","DEF", },
new List<string>() {"GHI","JKL" },

完全等同于

new List<string>() { "ABC","DEF"},
new List<string>() {"GHI","JKL"}

正如MK87所指出的,这是一件方便的事情。它允许您复制和粘贴列表元素,而无需担心添加和删除尾随逗号。

答案 2 :(得分:2)

如果您之前没有使用过它会让人感到困惑,但它会使所有项目在语法上相同,排序更好,从而更容易阅读。此外(更重要的是),此语法使您的代码更容易更改。

例如,假设您有一个5元素列表,则必须剪切最后一个元素并将其放在第1位。

使用last-without-comma sintax,你必须:

  1. 剪切最后一个元素
  2. 粘贴到位置1
  3. 为此商品添加逗号
  4. 删除新的最后一个元素中的逗号
  5. 使用all-with-逗号语法,您必须只执行第1点和第2点。