30

我使用对象初始化器语法设置属性的顺序是否以完全相同的顺序执行?

例如,如果我这样做:

var s = new Person { FirstName = "Micah",
                     LastName = "Martin",
                     IsLoaded = true
                   }

每个属性都会以相同的顺序设置吗?

4

1 回答 1

48

是的。

很抱歉被打扰(我实际上必须经常做一些工作)。规范没有明确说明,但它在第 7.6.10.2 节中清楚地说明了 IMO:


对象初始化器由一系列成员初始化器组成,由 { 和 } 标记括起来并用逗号分隔。

(注意这里的“序列”一词,而不是“集合”。我个人认为这很重要,因为序列是有序的。)

以下类表示具有两个坐标的点:

public class Point
{
    int x, y;
    public int X { get { return x; } set { x = value; } }
    public int Y { get { return y; } set { y = value; } }
}

可以按如下方式创建和初始化 Point 的实例:

Point a = new Point { X = 0, Y = 1 };

具有相同的效果

Point __a = new Point();
__a.X = 0;
__a.Y = 1; 
Point a = __a;

其中 __a 是一个不可见且不可访问的临时变量。


编辑:我收到了 Mads Torgersen 的回应,他基本上说现在可以做的任何事情都会保持秩序。将来可能会出现一些奇怪的情况,在奇怪的情况下,如果您正在做一些事情不是设置属性/字段,那么订单不会被保留,但这将取决于语言的去向。

值得指出的是,这里实际上有很多步骤——参数求值的执行顺序(即 RHS 位)和赋值的执行顺序。例如,如果您有:

new Foo
{
    A = X,
    B = Y
}

以下所有顺序都是可能的,同时仍保持实际属性执行的顺序(A 和 B):

  • 评估 X,分配给 A,评估 Y,分配给 B
  • 评估 X,评估 Y,分配给 A,分配给 B
  • 评估 Y,评估 X,分配给 A,分配给 B

我相信第一个选项是实际采用的选项,但这只是为了证明它的作用远不止眼前所见。

我也会非常警惕实际编写依赖于此的代码......

于 2009-01-30T14:16:27.297 回答