列表创建和对象初始化
本文关键字:初始化 对象 创建 列表 | 更新日期: 2023-09-27 17:50:36
我正在努力弄清楚下面例子中的List发生了什么:
public class DataObject
{
public List<object> SomeObjects { get; set; }
}
class Program
{
static void Main(string[] args)
{
var dataObj = new DataObject()
{
SomeObjects = { new object() },
};
Console.ReadKey();
}
}
dataOjb
的创建显然失败,因为SomeObjects
属性没有被实例化。我假设没有编译错误,因为DataObject
可以有一个实例化SomeObjects
的构造函数。鉴于此,如果我尝试这样做:
List<int> SomeObjects;
SomeObjects = {1, 2, 3, 4};
这个显然不行,
List<int> SomeObjects = new List<int>();
SomeObjects = {1, 2, 3, 4};
所以要得到我的实际问题,在第一个对象初始化器中调用的是什么(我试着查找它但找不到它),为什么它的行为不同,还有其他地方可以这样使用它吗?
回到我的问题,第一个对象初始化式
中叫什么?
等效代码:
var tmp = new DataObject();
tmp.SomeObjects.Add(new object());
var dataObj = tmp;
(显然,由于tmp.SomeObjects
在您的情况下为空,第二行失败。)
这个= { ... }
语法只适用于对象初始化器,这就是为什么后两个代码片段无效的原因。更具体地说,在规范术语中,成员初始化式的形式为
identifier = initializer-value
,其中initializer-value是表达式或对象或集合初始化器中的一个。这不仅适用于集合…您也可以设置现有成员的属性:
var foo = new Foo {
Bar = {
X = 2,
Y = 3
}
};
相当于:
var tmp = new Foo();
tmp.Bar.X = 2;
tmp.Bar.Y = 3;
var foo = tmp;