有两种方法可以通过构造函数或成员初始化来初始化 C# 类中的成员

本文关键字:初始化 成员 两种 可以通过 构造函数 方法 | 更新日期: 2023-09-27 17:56:45

有两种

方法可以通过构造函数初始化 C# 类中的成员:

class MyClass{
  private int Member;
  public MyClass()
  {
    Member = 0;
  }
}

或通过成员初始化:

class MyClass
{
  private int Member = 0;
}

我的问题:一种方法与另一种方法相比是否存在问题/好处?

据我所知,如果您只有一个默认构造函数,则是一种洗涤。如果有多个构造函数,则对于所有构造函数设置为相同值的成员,成员初始化更可取。

有两种方法可以通过构造函数或成员初始化来初始化 C# 类中的成员

就程序的执行而言,您给出的两个示例是相同的。类中的成员初始化表达式执行"好像"它们是构造函数的一部分(无论哪种方式,IL 都是相同的),因此这完全是样式问题。

内联初始值设定项通常更方便,并且是查看现有 C# 代码时可能会看到的内容。大多数情况下,构造函数体中的初始值设定项仅在必要时使用,例如:

  • 如果您需要使用仅在运行时已知的数据(例如构造函数参数)计算初始值
  • 如果需要(出于某种原因)以与代码中显示的顺序不同的顺序初始化值。
  • 如果需要有条件地初始化某些字段

在这些情况下,您唯一的选择是使用构造函数。

在一种情况下,成员初始化显式优先于构造函数体:当成员static时。例如,如果包含初始化静态字段的静态构造函数,FxCop 将生成 CA1810 或 CA2207。在这些情况下,内联和构造函数主体样式之间存在差异,尽管这是相当技术性的(有关血腥细节,请参阅 CA1810 解释)。这里的建议是避免使用构造函数:如果需要,使用称为 inline 的静态成员函数初始化静态字段:

// Don't do this:
public static class Foo
{
  private static int i;
  static Foo()
  {
    i = somecomputedvalue;
  }
}
// Do this:
public static class Foo
{
  private static int i = initializeI();
  private static int initializeI()
  {
    return somecomputedvalue;
  }
}

在此特定示例中,没有区别。 构造函数主体中的初始化主要是为了您可以根据构造函数参数和/或其他自定义逻辑动态设置值。 在这种情况下,编译器将产生我相信的第一种情况,即使原始源是第二种情况。

否则,这是一个风格和/或重复的情况。

就个人而言,我更喜欢在构造函数主体中初始化,除非我有多个构造函数并且让构造函数调用其他构造函数是不合适的。