C#字段初始化的顺序

维亚切斯拉夫·斯皮林(Vyacheslav Spirin)

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

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
};
彼得·杜尼奥

恕我直言,C#语言规范的相关部分相当清楚。可能不那么模糊,但是我看不到一种解释它的方法,该方法将允许乱序初始化:

对象初始化程序由一系列成员初始化程序组成

[强调我的]。单词“顺序”必然意味着顺序。也许这似乎并不规范,但他们的示例做到了:

Point的实例可以如下创建和初始化:

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

效果与

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

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

更笼统地说,在该部分中介绍其余语言是有益的,因为语言设计人员会竭尽全力确保该功能直观地进行,包括使用对象初始值设定项进行嵌套分配,以便仅将完整格式的对象分配给父级属性。

这么说,真的没关系如果您有一个班级,对两个或更多属性的分配顺序会影响最终结果,那么您手上就有一个相当危险的班级。应该不惜一切代价避免这种设计,因为在任何情况下,即使编译器用于对象初始化的规则很明确,也太容易破坏。

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章