如果我有一个默认的初始化程序集,并在创建对象时定义一个匿名初始化程序集。是默认跳过,还是只是之前运行?我想知道的原因是因为在下面的情况下,如果它们被运行,默认情况下创建的List对象将立即被丢弃,从而产生不必要的垃圾。
class ArrangedPanel : RectElement
{
public List<RectElement> arrangedChildren = new List<RectElement>();
public int Padding = 2;
}
//Somewhere else
new ArrangedPanel()
{
Padding = 5,
arrangedChildren = new List<RectElement>()
{
new ButtonToggle(),
new ButtonToggle()
}
}
答案 0 :(得分:2)
在您的示例代码中,Padding = 2
出现在Padding = 5
之前。
您不必要地创建List<RectElement>
,但我要求您创建一个场景,其中此类不必要的分配会导致任何明显的性能损失。
答案 1 :(得分:1)
arrangedChildren
将设置为您创建的最后一个实例
例如:
arrangedChildren = new List<RectElement>();
arrangedChildren = new List<RectElement>()
{
new ButtonToggle(),
new ButtonToggle()
}
arrangedChildren
将指向第二个列表。
如果没有其他对象引用第一个对象,它将消失(GC)。
但是,如果某些1将保留对第一个实例的引用,它将保持活动状态,并且您可能有重复项或两个不同的列表,您正在处理它们。
这可能会导致一些问题
答案 2 :(得分:1)
来自C# Specification,第17.4.5.2节
类的实例字段变量初始值设定项对应于a 进入后立即执行的分配顺序 该类的任何一个实例构造函数(第17.10.2节)。该 变量初始值设定项以它们的文本顺序执行 出现在类声明中。类实例创建和 初始化过程在§17.10中进一步描述。
因此,首先执行body类声明中的初始化,然后在构造函数中进行初始化。这可以通过查看IL输出直接观察到。