列表创建和对象初始化

本文关键字:初始化 对象 创建 列表 | 更新日期: 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;