什么是惯用代码?

时间:2008-09-17 14:54:16

标签: c#

我会对一些前后c#例子,一些非惯用语和惯用语例子感兴趣。非c#示例也可以,如果他们得到了想法。感谢。

5 个答案:

答案 0 :(得分:91)

惯用语意味着遵循该语言的惯例。您希望找到完成任务的最简单,最常用的方法,而不是将您的知识从其他语言移植。

使用带附加的循环的非惯用python:

mylist = [1, 2, 3, 4]
newlist = []
for i in mylist:
    newlist.append(i * 2)

使用列表推导的惯用python:

mylist = [1, 2, 3, 4]
newlist = [(i * 2) for i in mylist] 

答案 1 :(得分:27)

一些例子:

资源管理,非惯用语:

string content;
StreamReader sr = null;
try {
    File.OpenText(path);
    content = sr.ReadToEnd();
}
finally {
    if (sr != null) {
        sr.Close();
    }
}

习语:

string content;
using (StreamReader sr = File.OpenText(path)) {
    content = sr.ReadToEnd();
}

迭代,非惯用语:

for (int i=0;i<list.Count; i++) {
   DoSomething(list[i]);
}

也是非惯用语:

IEnumerator e = list.GetEnumerator();
do {
   DoSomenthing(e.Current);
} while (e.MoveNext());

习语:

foreach (Item item in list) {
   DoSomething(item);
}

过滤,非惯用语:

List<int> list2 = new List<int>();
for (int num in list1) {
  if (num>100) list2.Add(num);
}

惯用:

var list2 = list1.Where(num=>num>100);

答案 2 :(得分:11)

惯用语代码是以您的语言的常用方式执行常见任务的代码。它类似于设计模式,但规模要小得多。成语因语言而异。 C#中的一个习惯用法可能是使用迭代器迭代集合而不是循环遍历它。没有迭代器的其他语言可能依赖于循环习语。

答案 3 :(得分:6)

在PHP中,我有时会遇到如下代码:

foreach ($array as $value) {
    $trimmed[] = trim($value);
}
return $trimmed;

可以通过以下方式实现:

return array_map('trim', $array);

答案 4 :(得分:3)

实际上,它意味着以一致的方式编写代码,即在编写类似代码结构时,所有在代码库上工作的开发人员都应遵循相同的约定。

所以惯用的方式是匹配其他代码的风格,非惯用的方式意味着你正在以不同的方式编写这种函数。

e.g。如果你循环一定数量的项目,你可以用几种方式编写循环:

for (int i = 0; i < itemCount; i++)

for (int i = 1; i <= itemCount; i++)

for (int i = 0; i < itemCount; ++i)

最重要的是所选择的风格始终如一。这样人们对如何使用它变得非常熟悉和自信,并且当你窥探看起来不同的用法时,它可能是错误被引入的标志,也许是一个错误,例如。

for (int i = 1; i < itemCount; i++)