初始化对象时,我经常编写如下代码:
var myObj = new MyObject
{
Number = 1,
ListOfStuff = new List<Stuff>
{
new Stuff()
}
}
但是,有时我会忘记new List<Stuff>
,而是写:
var myObj = new MyObject
{
Number = 1,
ListOfStuff =
{
new Stuff()
}
}
我不希望这会编译,但确实如此。 ListOfStuff
未按照我的预期进行初始化 - 但它是空的。这段代码究竟做了什么?
答案 0 :(得分:1)
对象初始化语法和集合初始化语法都只是编译器在编译时的语法转换insto赋值和方法调用:
Add
方法调用所以你的代码相当于:
var myObj = new MyObject();
myObj.Number = 1;
myObj.ListOfStuff.Add(new Stuff());
这是一个有效的C#代码,如果MyObject
上的默认构造函数初始化ListOfStuff
属性,它将起作用。如果没有,它将抛出NullReferenceException
。
在调用new List()
之前,您的代码的第一个版本会明确地将ListOfStuff
分配给Add
:
var myObj = new MyObject();
myObj.Number = 1;
myObj.ListOfStuff = new List<Stuff>();
myObj.ListOfStuff.Add(new Stuff());
答案 1 :(得分:0)
有趣的是,以下初始化ListOfStuff的方法会产生编译错误:
var myObj = new MyObject();
myObj.Number = 1;
myObj.ListOfStuff =
{
new Stuff()
};
};