我最近在应用程序中遇到了相同的代码:
var source = new List<string>();
source.AddRange(getSomeListData());
var index = source.Count > 10 ? source.Count - 10 : 0;
var target = new TargetObject
{
Line1 = source.Count > index ? source[index++] : string.Empty,
Line2 = source.Count > index ? source[index++] : string.Empty,
Line3 = source.Count > index ? source[index++] : string.Empty,
Line4 = source.Count > index ? source[index++] : string.Empty,
.
.
.
}
这里的目标是在输出对象中包含来自源数据的 last 10项(在我们的例子中,最后一行是至关重要的)。但我们不知道会有多少行数据 - 可能只有1行。
此代码目前正常,因为VS2013以源代码顺序运行成员初始值设定项,因此每个index++
的副作用按正确的顺序发生。但是,我通读了C#5规范,我无法保证这一切都是真的。这些成员初始化的顺序是否具有确定性,或者上述代码是否会在VS和/或其他C#编译器的某些未来版本中破坏?
(如果存在风险,我现在有机会更改它,但我不想仅仅为了改变而更改代码。)