【问题标题】:What is the best way to return a list<t> via a method?通过方法返回 list<t> 的最佳方法是什么?
【发布时间】:2012-05-11 19:14:51
【问题描述】:

假设我有一个返回字符串名称列表的方法。

public List<String> buildNamesList(){
   List<String> namesList = new List<String>();
   //add several names to the list
   return namesList;
}

现在,如果我有一个需要 namesList 的方法,那么返回它是最好的方法吗?

public void someMethod(){
  List<String> namesList = new List<String>();
  namesList = buildNamesList();
  //traverse namesList
}

【问题讨论】:

  • 而不是返回 List 返回 IEnumerable。 IEnumerable 是安全的,因为它是只读的。您可以使用 ToList() 将其转换为列表。还要避免 String 并使用 string。另一个最佳实践

标签: c# .net c#-4.0 collections


【解决方案1】:

如果您在 buildNamesList 方法中创建一个新列表,我只想说:

var namesList = buildNamesList(); 

【讨论】:

  • 最适合像我这样的懒程序员
  • 只是要注意var被强类型化为buildNamesList()的返回类型
  • 我真的很喜欢这种简单!非常感谢!
【解决方案2】:

如何返回列表真的取决于你在做什么。

如果您只需要内存中的整个列表,那么您的方法很好,尽管我会这样称呼它:

public void someMethod(){
  List<String> namesList = buildNamesList();
}

无需将变量初始化为将立即替换的空列表。

如果列表很大或者你只需​​要遍历它,你可以使用yield关键字并将函数的返回类型更改为IEnumerable&lt;string&gt;,尽管你当前的设计不适合这种模式。

【讨论】:

  • 我个人会使用隐式类型 'var' 而不是 'List' 因为如果您更改实现,它会使重构更容易。我也会让 buildNamesList 返回一个接口而不是一个具体的类
  • @DeneB - 出于说明原因(考虑问题的级别),我决定在我的示例中不使用 var
  • 我明白了,我同意这种方法。 :) 我只是为了 OP 而扩展。
【解决方案3】:

不要将您的变量分配给new List&lt;T&gt;(),只是为了立即将其替换为您的返回值。

【讨论】:

    【解决方案4】:

    你不需要初始化它两次,只需这样做:

    public void someMethod(){
        List<String> namesList = buildNamesList();
    }
    

    虽然如果您是 FxCop 爱好者,但严格来说,让方法返回具体类型(在本例中为 List)并不是一个好习惯,您应该返回接口(@98​​7654324@)

    编辑:作为参考,它是 FxCop 规则 CA1059 :)

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2022-07-21
      • 2010-09-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多