使用对象初始化语法的操作顺序

2024-06-21

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

例如,如果我这样做:

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

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


Yes.

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


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

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

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

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 的回复,他基本上说现在可以做的任何事情都将维持秩序。将来可能会出现一些奇怪的情况,在您正在做某事的奇怪情况下,顺序不会保留other比设置属性/字段更重要,但这取决于语言的走向。

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

new Foo
{
    A = X,
    B = Y
}

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

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

我相信第一个选项是实际采取的选项,但这只是为了证明它的内容比表面上看到的要多。

我也会是very对实际编写依赖于此的代码持谨慎态度......

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

使用对象初始化语法的操作顺序 的相关文章

随机推荐