虽然有多种解释,但我会根据自己的理解尝试使用各种场景的IL代码。
- 在构造函数中实例化列表
在这种情况下,当对象被这个构造函数构造时,它会首先调用 instance void [System.Runtime]System.Object::.ctor() 然后构造列表
public class ObjectA
{
public List<string> MyList { get; set; }
public ObjectA()
{
this.MyList = new List<string>();
}
}
- 在声明中实例化列表
在这种情况下,当构造对象时,它会首先构造列表,然后调用默认构造函数instance void [System.Runtime]System.Object::。 ctor() 然后初始化列表
public class ObjectA
{
public List<string> MyList { get; set; } = new List<string>();
}
- 在声明中实例化列表,但该类有一个构造函数
在这种情况下,编译器已经在构造函数中注入了列表实例化的代码
public class ObjectA
{
public List<string> MyList { get; set; } = new List<string>();
public ObjectA()
{
}
}
- 在声明处实例化列表,并使用不同的构造函数创建类
在这种情况下,我们可以看到编译器也在新的构造函数中注入了列表实例化的代码
public class ObjectA
{
public List<string> MyList { get; set; } = new List<string>();
public ObjectA(int x)
{
}
}
public class ObjectB:ObjectA
{
public ObjectB(int x):base(x)
{
}
}
- 在声明处实例化列表,calss有两个构造函数和一个派生类
在这种情况下,编译器在两个构造函数中都注入了列表实例化代码。 这不会发生在我们
在构造函数中实例化列表
public class ObjectA
{
public List<string> MyList { get; set; } = new List<string>();
public ObjectA()
{
}
public ObjectA(int x)
{
}
}
public class ObjectB:ObjectA
{
public ObjectB(int x):base(x)
{
}
}
总而言之,如果您有多个构造函数,则在列表或类似对象的情况下。开发人员有责任确保在使用之前初始化所有必需的对象。派生此类时,复杂性会增加。如果我们遵循干净的代码实践,我会在声明时使用更小的类。但是如果字段对象要大,在构造时做一些工作,我会在需要时初始化它们(这需要安全)