【问题标题】:What is idiomatic code?什么是惯用代码?
【发布时间】:2010-09-10 04:35:28
【问题描述】:

我对一些前后的 c# 示例、一些非惯用与惯用示例感兴趣。非 c# 示例如果能理解这个想法也很好。谢谢。

【问题讨论】:

  • Hidden features of C# 充满了惯用的 C#。并非所有这些都介意您,但是许多具有大量赞成票的简单单行词可以被认为是惯用的。一些答案也描述了非惯用的替代方案。

标签: c#


【解决方案1】:

一些例子:

资源管理,非惯用语:

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

【讨论】:

  • 大括号是 Java 的惯用语 ;-)
【解决方案2】:

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

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

习惯上可以用以下方式实现:

return array_map('trim', $array);

【讨论】:

    【解决方案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】:

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

    使用带有附加的循环的非惯用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] 
    

    【讨论】:

      【解决方案5】:

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2016-03-27
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-08-13
        • 1970-01-01
        • 1970-01-01
        • 2011-06-01
        相关资源
        最近更新 更多