我通过以下方式初始化字段来创建对象:
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] 删除。
我来说两句