.net 使用对象初始值设定项语法的操作顺序

.net 使用对象初始值设定项语法的操作顺序,.net,syntax,object-initializers,.net,Syntax,Object Initializers,使用对象初始值设定项语法设置属性的顺序是否以完全相同的顺序执行 例如,如果我这样做: var s = new Person { FirstName = "Micah", LastName = "Martin", IsLoaded = true } 每个属性的设置顺序是否相同?是 抱歉被打断(我不得不经常做一些工作)。规范中没有明确说明,但在第7.6.10.2节中明确指出:

使用对象初始值设定项语法设置属性的顺序是否以完全相同的顺序执行

例如,如果我这样做:

var s = new Person { FirstName = "Micah",
                     LastName = "Martin",
                     IsLoaded = true
                   }
每个属性的设置顺序是否相同?

抱歉被打断(我不得不经常做一些工作)。规范中没有明确说明,但在第7.6.10.2节中明确指出:


对象初始值设定项由一系列成员初始值设定项组成,由{和}标记包围,并用逗号分隔

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

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

公共类点
{
int x,y;
公共int X{get{return X;}set{X=value;}}
公共int Y{get{return Y;}set{Y=value;}}
}
可以按如下方式创建和初始化Point的实例:

点a=新点{X=0,Y=1};
这和

点uu a=新点();
__a、 X=0;
__a、 Y=1;
a点=_uA;
其中_a是一个不可见且不可访问的临时变量


编辑:我收到了Mads Torgersen的回复,他基本上说现在可以做的任何事情都会维护秩序。将来可能会有一些奇怪的情况,在奇怪的情况下,顺序不会被保留下来,在这种情况下,除了设置属性/字段之外,您还需要做其他事情,但这取决于语言的发展方向

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

new Foo
{
    A = X,
    B = Y
}
在保持实际财产执行顺序(A和B)的同时,可以执行以下所有顺序:

  • 计算X,分配给A,计算Y,分配给B
  • 计算X,计算Y,分配给A,分配给B
  • 计算Y,计算X,分配给A,分配给B
我相信第一个选择是实际采取的,但这只是为了证明它有更多的东西,而不是乍一看


我也会非常谨慎地编写依赖于此的代码…

我最大的担心是作业是按照我列出它们的顺序发生的。我关心的不是右侧的评估顺序,而是实际的左侧分配顺序。就我而言,我的担忧正好相反。赋值顺序对我来说无关紧要,因为我只需要初始化对象/结构。但是,求值顺序很重要,因为我使用BinaryReader,每个字段都由ReadSingle()调用设置。如果不能保证顺序,我最好完全避免使用对象初始值设定项。安全总比后悔好。如果没有正确地指定^^,那么这种语法糖是非常无用的。是否有任何记录在案的案例没有保留评估顺序?@Bunny83:我不知道,而且我非常有信心保留了评估顺序,这就是规范的意图——只是没有尽可能明确。