我正在阅读Jon Skeet最近的这篇文章:How can I enumerate thee? Let me count the ways...。它是关于调查编码的代码。在这种情况下,他会检查
foreach (char ch in text)
{
// Body here
}
他使用的最后一个例子(对于文本类型为string
的情况),他表明编译器将foreach循环转换为这样的while循环:
int index = 0;
while (index < text.Length)
{
char ch = text[index];
index++;
// Body here
}
在这种情况下,将foreach循环转换为while循环(甚至是进行转换所必需的)可能不是很费力,但从更一般的意义上说,我应该编写我的代码是更类似于编译代码?
答案 0 :(得分:4)
不,您最好专注于编写可读,可维护的代码并将翻译留给编译器。
如果 - 通过编译器改进 - 循环最好以另一种方式重写/编译,你实际上让编译器更难以理解你想要做什么,并且可能阻止它转换循环达到平台的最佳说明。
答案 1 :(得分:3)
不 - 编译器生成的内容不应该是您编写样式的基础。
您应该首先优化可读性 - 如果您确实看到了性能问题,那么,只有在进行性能分析后才应该尝试进行优化。
答案 2 :(得分:2)
不,高级语言的目的是简化编程。编译器将按预期运行,但是当最终结果相同时,没有必要复制它的行为。请改用该语言的强大功能。
答案 3 :(得分:2)
确定如何将C#代码转换为可在CIL中表示的代码是编译器的工作。正如你已经看到的那样,它做得很好。你相信自己更好地完成这项工作吗?如果是这样,当然,请继续,但对于绝大多数程序员,我自己和可能包括你自己,这种信任将是错误的。
答案 4 :(得分:2)
不,你应该使用编译器允许的简写方式。
写入不仅更少,而且可能存在错误的代码也更少。如果你举个例子;在foreach
中很难犯错误,但是如果你将它转换为while
,你可以做几个小错误让它无法正常工作,例如忘记index++
}。
编译器中的缩写是存在的,这样您就可以轻松地做正确的事情。例如,属性的简写:
public int Value { get; set; }
这将扩展为成员变量以及使用它的getter和setter(尽管变量名是secret):
private int _value;
public int Value {
get {
return _value;
}
set {
_value = value;
}
}
在将该简写添加到编译器之前,您很想使用公共成员变量,只是因为键入的内容要少得多:
public int Value;
现在你可以吃它并吃掉它。 :)只需要几个字符,你就可以拥有一个完整的属性,而无需自己编写实现。