2008-09-17 76 views
51

我会对一些前后c#示例感兴趣,一些非惯用与习惯用法的例子。非C#的例子会很好,如果他们能够实现这个想法的话。谢谢。什么是惯用代码?

+4

我如何得到一个负数,这是一个不错的问题! – MrBoJangles 2008-09-17 15:13:18

+1

同意,一些很好的答案很好的问题。 – 2008-09-17 15:57:41

+3

[C#隐藏功能](http://stackoverflow.com/q/9033/4830)充满了惯用的C#。并不是所有的人都在意你,但是许多有点赞赏的简单单线球员可以被认为是惯用的。有些答案也描述了非惯用的选择。 – 2013-01-16 21:23:21

回答

68

习惯的意思是遵循语言的约定。你想找到完成任务的最简单和最常用的方法,而不是从不同的语言移植你的知识。

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] 
10

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

23

一些例子:

资源管理,非惯用

使用带有附加一个循环

非惯用蟒蛇:

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); 
3

实事求是地讲,这意味着以一致的方式编写代码,即谁对你的代码基础工作,所有开发人员都应该遵循编写类似的代码结构时使用相同的约定。

因此,习惯用法是与其他代码风格相匹配的方式,非惯用方式意味着您正在以不同的方式编写函数类型。

例如如果你是一个循环一定数量的物品,你可以写在几个方面的循环:

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++) 
4

在PHP中我有时会遇到这样的代码:

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

哪些惯用可以实现:

return array_map('trim', $array);