在C#中初始化一个新List时,以下两个都将编译:
(1)List<string> s = new List<string>() { "value" };
和
(2)List<string> s = new List<string> { "value" };
案例1和案例2有什么区别?
答案 0 :(得分:1)
这适用于任何类型。通常,如果需要将某些内容传递给它不公开进行公开设置的类型构造函数,则指定()
。如果不需要参数,()
只是松散的。
考虑一下你可能想要对一个属性做一些额外的验证/逻辑并且你不允许直接操纵它的场景:
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#类型只允许您在构造函数中设置某些属性。
答案 1 :(得分:1)
没有区别。它将被翻译为:
List<string> s1 = new List<string>();
s1.Add("value");
List<string> s2 = new List<string>();
s2.Add("value");
答案 2 :(得分:1)
从7.6.10.1 C# reference 5.0的对象创建表达式:
对象创建表达式可以省略构造函数参数列表并括起括号,前提是它包含对象初始值设定项或集合初始值设定项。省略构造函数参数列表并括起括号等同于指定空参数列表。
答案 3 :(得分:0)
后者称为对象初始化。您也可以使用MyClass m = new MyClass { MyVar = 3 };