对于new()或Clear(),这就是问题所在

Joh*_*aft 2 .net

在我目前的工作场所,我遇到了很多类似于以下示例的代码:

private void GetWidgets(ref List<Widget> widgets){
  if(widgets == null){
    widgets = new List<Widget>();
  }
  else{
    widgets.Clear();
  }
  ... code to fill widget list
}    
Run Code Online (Sandbox Code Playgroud)

public class Widgets{
  private List <Widget> widgets;
  ... other private members

  public Widgets(){    
    Clear();
  }

  public void Clear(){
    if(widgets == null){
      widgets = new List<Widget>();
    }
    else{
      widgets.Clear();
    }
    ... initialize other private members
  }
}    
Run Code Online (Sandbox Code Playgroud)

我个人发现在这些例子中使用Clear方法会使代码变得更加丑陋和复杂.我不知道使用Clear方法而不是仅仅创建一个新List会有性能提升,但我更喜欢这样的代码:

private List<Widget> GetWidgets(){
  widgets = new List<Widget>();
  ... code to fill widget list;
  return widgets;
}
Run Code Online (Sandbox Code Playgroud)

public class Widgets{
  private readonly List<Widgets> widgets = new List<Widget>();
  ... other private members

  public Widgets(){        
    ... initialize other private members
  }

  public Clear(){
    widgets.Clear();
  }
}
Run Code Online (Sandbox Code Playgroud)

像这样的代码会强迫您稍微改变您的开发模式,但我认为它使代码更具可读性并降低了复杂性.

除了这是一段匆忙编写的示例代码之外,我还大量使用具体类而不是接口等; 你有什么看法?各自的优点和缺点是什么?

Mic*_*ows 12

如果您有一个其他类可以访问的列表的共享引用,则Clear是一个更好的选项.在这种情况下,新建它将创建一个新的空列表,但是已创建对旧列表的引用的任何其他类仍将看到填充列表.

想象一下这种情况:

List<Widget> first;
myWidgets.GetWidgets(ref first);
List <Widget> second = first;
myWidgets.GetWidgets(ref second);
Run Code Online (Sandbox Code Playgroud)

在上面的例子中,如果Clear被使用,first并将second连接到相同的列表.如果new被雇用,他们将连接到两个完全不同的列表.任何一种方法都会产生后果,而使用一种方法的决定取决于您要完成的任务.

所以我想你问题的答案是:

  • new当你想确保每次调用GetWidgets创建一个独立的,基本上不可变的列表时,会更好.这在多线程应用程序中更好.如果将列表作为只读列表返回,您的服务会更好.
  • Clear如果要表示单个列表,则更好,并且引用它的所有类都会看到对该列表的更改.如果您是多线程,这会产生许多争用问题.