匿名初始化覆盖默认值,还是后续运行?

时间:2011-10-04 11:00:36

标签: c# initialization

如果我有一个默认的初始化程序集,并在创建对象时定义一个匿名初始化程序集。是默认跳过,还是只是之前运行?我想知道的原因是因为在下面的情况下,如果它们被运行,默认情况下创建的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()
   }
}

3 个答案:

答案 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输出直接观察到。