0

C# 中哪个更传统?

class Foo
{
  private string _first;
  private string _second;

  public Foo(string first)
  {
    _first = first;
    _second = string.Empty;
  }
}

或者

class Foo
{
  private string _first;
  private string _second = string.Empty;

  public Foo(string first)
  {
    _first = first;
  }
}
4

9 回答 9

2

不了解约定,但更安全的方法是像第二个示例中那样初始化成员。您可能有多个构造函数并且忘记在其中一个中进行初始化。

于 2009-07-20T07:17:53.420 回答
2

从技术上讲,当从基类的构造函数调用虚函数时,代码片段之间的行为存在细微差异,但是在构造过程中调用虚函数无论如何都是不好的做法,所以让我们忽略这一点。

我更喜欢第二种。如果您有重载的构造函数,它会节省一些复制/粘贴,并且没有人需要记住编写赋值语句 - 编译器会处理所有这些。

如果分配值的计算过于复杂或无法分配给字段初始值设定项,我将有一个受保护(或私有)的默认构造函数

class Foo
{
    private Foo() { _second = SomeComplexCalculation(); }
    public Foo(string first) : this()
    {
       _first = first;
    }
}

如果分配顺序很重要,那么我将有一个私有函数进行初始化。

于 2009-07-20T07:25:53.623 回答
0

Microsoft 最佳做法是在声明成员时对其进行初始化。所以:

class Foo
{
  private string _first;
  private string _second = string.Empty;

  public Foo(string first)
  {
    _first = first;
  }
}

将是这里的答案。

它还告诉您不要使用默认值初始化成员。

于 2009-07-20T08:06:03.013 回答
0

我正在使用默认关键字

// local variable
var x = default(Action);

// member variable
this.FieldX = default(Action);

更新:添加了 msdn 的链接

于 2009-07-20T07:50:36.477 回答
0

我通常使用在构造函数中作为构造函数参数传递的值来初始化变量(当然),并通过在成员变量的定义点直接分配相应的值来进行默认初始化(就像你在第二个解决方案中所做的那样)

private string _second = string.Empty;

连同属性,我有一个如下构造:

 public class Foo
 {

    public Foo(...)
    {
      ...
    }

    private string _Second = string.Emtpy;
    public string Second
    {
      get
      {
        return _Second;
      }
      set
      {
        _Second = value;
      }
    }

 }
于 2009-07-20T07:30:44.753 回答
0

您给出的第二个示例通常是首选方式,因为它可以节省查看任何构造函数的时间,并且所有字段都在一个地方初始化(从开发人员的角度来看)。

但是,当使用第二种样式时,C# 编译器会为类中存在的每个构造函数中的每个字段生成相同的初始化值。

于 2009-07-20T07:34:45.760 回答
0

我喜欢第二种方式。它看起来更自然。

于 2009-07-20T07:16:01.973 回答
0

对于原始类型(String、int 等),我会选择第二种方式。

对于复杂类型,我更喜欢在构造函数内部进行初始化。

于 2009-07-20T07:19:28.677 回答
0

第二种方式有几个优点:首先它更容易阅读,其次它更干燥,当你有多个构造函数时,你不必手动链接它们或重复初始化,这给我们带来了第三个优点 - 它是不易出错。

于 2009-07-20T07:22:07.860 回答