0

我正在阅读 Jon Skeet 最近的这篇文章:我如何列举你?让我数一数路…… 它是关于调查代码编译成什么。在这种情况下,他检查

foreach (char ch in text) 
{ 
 // Body here 
}

他使用的最后一个示例(对于 text 类型为 的情况string),他表明编译器将 foreach 循环转换为 while 循环,如下所示:

int index = 0; 
while (index < text.Length) 
{ 
 char ch = text[index]; 
 index++; 
 // Body here 
}

在这种情况下,从 foreach 循环转换为 while 循环可能并不费力(甚至需要进行这种转换),但从更一般的意义上说,我是否应该将我的代码编写得更类似于编译代码?

4

5 回答 5

4

不,您最好专注于编写可读、可维护的代码并将翻译留给编译器。

如果 - 随着编译器的改进 - 循环最好以另一种方式重写/编译,你实际上使编译器更难理解你正在尝试做什么,并且可能会阻止它将循环转换为最优平台的说明。

于 2012-09-30T20:13:16.003 回答
3

No - what the compiler produces shouldn't be what you base your coding style on.

You should optimize for readability first - if you do see problems with performance, then, and only after profiling should you try to optimize.

于 2012-09-30T20:11:02.413 回答
2

No, the point of high level languages is to simplify programming. The compiler will act as it should but there isn't a point in replicating it's behavior when the end result will be the same. Use the powerful features of the language instead.

于 2012-09-30T20:13:05.923 回答
2

弄清楚如何将 C# 代码转换为可以用 CIL 表示的东西是编译器的工作。正如您已经看到的,它在这方面做得很好。你相信自己能更好地完成这项工作吗?如果是这样,当然,请继续,但对于绝大多数程序员,包括我自己,可能包括你自己,这种信任将是错误的。

于 2012-09-30T20:13:52.450 回答
2

不,您应该使用编译器允许您使用的速记方式。

不仅写得更少,而且可能出现错误的代码也更少。如果你举个例子;很难在. foreach_whileindex++

编译器中的速记就在那里,因此您可以毫不费力地做正确的事情。例如属性的简写:

public int Value { get; set; }

这将扩展为一个成员变量和一个使用它的 getter 和 setter(尽管变量名是秘密的):

private int _value;
public int Value {
  get {
    return _value;
  }
  set {
    _value = value;
  }
}

在将该速记添加到编译器之前,您很想改用公共成员变量,因为它的类型要少得多:

public int Value;

现在你可以吃咖啡了。:) 只需再添加几个字符,您就拥有了完整的属性,而无需自己编写实现。

于 2012-09-30T20:14:52.323 回答