【问题标题】:The difference between new List() {...} and new List {...} [duplicate]new List() {...} 和 new List {...} 之间的区别 [重复]
【发布时间】:2015-07-01 06:06:47
【问题描述】:

在 C# 中初始化一个新的 List 时,以下两个都将编译:

(1)List<string> s = new List<string>() { "value" };

(2)List<string> s = new List<string> { "value" };

案例1和案例2有什么区别?

【问题讨论】:

  • 没有。只是 () 对于该声明是可选的。 (Resharper 警告多余的()。)
  • 参见duplicate(它谈到对象初始化器,它们在同一个球场),它链接到Ambiguous Optional Parentheses, Part One。 Eric Lippert 的博客很好地解释了语言设计背后的“为什么”基本原理。

标签: c# list


【解决方案1】:

后者称为对象初始化。你也可以使用MyClass m = new MyClass { MyVar = 3 };

【讨论】:

  • 后者是使用Field Initializer ?什么? Field Initialization
  • 不叫字段初始化。它被称为集合初始化器。您提供的替代方法称为对象初始值设定项。字段初始值设定项是您为类声明中的字段提供的默认值。
  • @Rawling 确实,我已经改变了这一点。
【解决方案2】:

从7.6.10.1 C# reference 5.0的对象创建表达式:

对象创建表达式可以省略构造函数参数列表和括号,前提是它包含对象初始化器或集合初始化器。省略构造函数参数列表并用括号括起来等效于指定一个空参数列表。

【讨论】:

  • 我已将我的回复(添加链接)合并到您的回复中
  • 谢谢 xanatos,我找不到章节号。
【解决方案3】:

这对任何类型都是正确的。通常,如果您需要将某些内容传递给类型构造函数,而该构造函数不会公开设置以进行公开设置,则可以指定 ()。如果不需要任何参数,() 只是绒毛。

考虑您可能想要对属性进行一些额外的验证/逻辑并且不允许直接操作它的场景:

public class Foo
{
    private string Bar { get; set; }

    public string FooBar { get; set; }

    public Foo (string bar)
    {
        Bar = bar + "foo";
    }
}

所以这是允许的:

var foo = new Foo("bar")
{
    FooBar = "foobar"
};

但这不是:

var foo = new Foo
{
    Bar = "bar",
    FooBar = "foobar"
};

有些 C# 类型只允许您在构造函数中设置某些属性。

【讨论】:

  • 如果您不在 Field Initializer 中初始化属性,您可以指定括号仍然是强制性的。
【解决方案4】:

没有区别。它将被翻译为:

List<string> s1 = new List<string>();
s1.Add("value");
List<string> s2 = new List<string>();
s2.Add("value");

【讨论】:

    猜你喜欢
    • 2019-03-15
    • 2011-06-03
    • 2014-01-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-07-22
    • 2017-05-08
    • 2016-10-04
    相关资源
    最近更新 更多