这不是更具可读性。你的例子代码显示了这个。
在我看来这两套代码之间的区别是混乱:
XmlElement header = list[0] as XmlElement;
if (header == null)
{
XmlElement subHeader = null; // ...
}
XmlElement header = list[0] as XmlElement;
if (header == null) throw new Exception("Corrupt header.");
{
XmlElement subHeader = null; // ...
}
另外,如果你的代码是“相对较长”,那么它应该被分解成不同的方法,而不是由范围块分组。
现在,就表现而言。这里有一个简单的例子:
var text = "Hello";
Console.WriteLine(text);
这变成这个IL:
IL_0001: ldstr "Hello"
IL_0006: stloc.0 // text
IL_0007: ldloc.0 // text
IL_0008: call System.Console.WriteLine
如果我写这样的代码:
var text = "Hello";
{
Console.WriteLine(text);
}
的IL变为:
IL_0001: ldstr "Hello"
IL_0006: stloc.0 // text
IL_0007: nop
IL_0008: ldloc.0 // text
IL_0009: call System.Console.WriteLine
IL_000E: nop
请注意nop
操作离子。
对于每个范围块,我在IL中获得一对新的nop
操作。但是这只发生在调试模式下。在发布模式下,nop
操作被删除。
为了测试在调试模式下的性能差异,我写这个代码:
var sw = Stopwatch.StartNew();
var x = 0L;
for (var y = 0; y < 1000000000L; y++)
{
{
x += y;
}
}
sw.Stop();
Console.WriteLine(x);
Console.WriteLine(sw.ElapsedMilliseconds);
随着额外的范围是在大约3550毫秒持续跑。没有额外的范围是大约3,500毫秒。所以性能差异约1.5%。这只是在调试模式!
但考虑到我的操作x += y
是如此微不足道,并且性能下降很小,您可能会忽略正常代码中的性能差异。显然在发布模式代码中完全忽略它。
不,没有性能影响。尽管如此,您可能会考虑将代码分解为方法。 – Blorgbeard 2014-09-29 23:02:06
但是,如果你真的在可读性之后,考虑* not *包括'if'行为('throw new Exception ...')与条件相同的行。特别是在这种情况下,第一眼看到下面的代码块会被附加到'if' – 2014-09-29 23:04:39
快速扫描代码,我会将您的代码块读取为属于if语句。这是一种非常规的格式。所以对我来说这当然不是“明显更好”。希望你不要以为短时间总是意味着更好。 – itsme86 2014-09-29 23:05:40