gpt4 book ai didi

C# 字段初始化的顺序

转载 作者:行者123 更新时间:2023-11-30 15:55:48 25 4
gpt4 key购买 nike

我通过以这种方式初始化字段来创建对象:

class Example
{
public int a;
public int b;
}

var obj = new Example
{
a = stream.ReadInt(),
b = stream.ReadInt()
};

是否总是在字段“b”之前初始化字段“a”?否则,当以不同的顺序从流中减去值时,可能会发生不愉快的错误。谢谢!

UPD:在评论中,很多人不明白我的意思。我会澄清这个问题。这些记录在不同(.NET、Mono 等)编译器上的行为是否始终相同?

首先:

var obj = new Example
{
a = stream.ReadInt(),
b = stream.ReadInt()
};

第二个:

var a = stream.ReadInt();
var b = stream.ReadInt();

var obj = new Example
{
a = a,
b = b
};

最佳答案

恕我直言,the relevant part of the C# language specification相当清楚。它可能不那么模糊,但我没有看到一种允许乱序初始化的方法来解释它:

An object initializer consists of a sequence of member initializers

[强调我的]。 “顺序”一词必然意味着顺序。也许这看起来并不规范,但他们的例子确实如此:

An instance of Point can be created and initialized as follows:

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

which has the same effect as

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

如果编译器作者重新排序分配,他们输出的程序将不符合上述示例。

更一般地说,查看该部分中的其余语言会提供更多信息,因为语言设计者竭尽全力确保该功能直观地工作,包括使用对象初始化程序的嵌套赋值仅分配一个完整的形式反对父属性。

综上所述,真的应该无关紧要。如果你有一个类,其中两个或更多属性的分配顺序会影响最终结果,那么你手上的类就非常危险。应该不惜一切代价避免这种设计,因为它在任何情况下都太容易被破坏,即使对象初始化的编译器规则相当明确。

关于C# 字段初始化的顺序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47959111/

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