使用对象初始化程序语法设置属性的顺序是否以完全相同的顺序执行?
例如,如果我这样做:
var s = new Person { FirstName = "Micah",
LastName = "Martin",
IsLoaded = true
}
每个属性都会以相同的顺序设置吗?
答案 0 :(得分:44)
是
抱怨中断(我必须经常做一些工作)。规范并没有明确地说出来,但它在第7.6.10.2节中明确表达了IMO:
对象初始值设定项由一系列成员初始值设定项组成,由{和}标记括起并用逗号分隔。
(注意这里的“序列”这个词,而不是“set”。我个人认为这很重要,因为序列是有序的。)
以下类表示具有两个坐标的点:
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是一个不可见且无法访问的临时变量。
值得指出的是,这里实际上有很多步骤 - 执行参数评估的顺序(即RHS位)和赋值的执行顺序。例如,如果您有:
new Foo
{
A = X,
B = Y
}
在保持实际属性执行顺序(A和B)的同时,所有以下命令都是可能的:
我认为第一个选项是实际使用的选项,但这只是为了证明它不仅仅是为了满足它的目的。
我也非常警惕实际编写依赖于此的代码......