是否应该在生产代码中使用编译器使用的相同代码?

时间:2012-09-30 20:07:25

标签: c#

我正在阅读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循环(甚至是进行转换所必需的)可能不是很费力,但从更一般的意义上说,我应该编写我的代码是更类似于编译代码?

5 个答案:

答案 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;

现在你可以吃它并吃掉它。 :)只需要几个字符,你就可以拥有一个完整的属性,而无需自己编写实现。