gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-30 12:58:45 25 4
gpt4 key购买 nike

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

例如,如果我这样做:

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

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

最佳答案

是的。

抱歉被打扰了(我必须经常做一些工作)。该规范没有明确说明,但它在第 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
}

在保持实际属性(property)执行顺序(A 和 B)的情况下,以下所有顺序都是可能的:

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

我相信第一个选项是实际采用的选项,但这只是为了证明它比表面看起来更重要。

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

关于.net - 使用对象初始化语法的操作顺序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28774646/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com