Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/304.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/asp.net/30.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
有两种方法可以通过构造函数或通过成员初始化来初始化C#类中的成员_C#_Asp.net_Constructor - Fatal编程技术网

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

有两种方法可以通过构造函数或通过成员初始化来初始化C#类中的成员,c#,asp.net,constructor,C#,Asp.net,Constructor,有两种方法可以通过构造函数初始化C#类中的成员: class MyClass{ private int Member; public MyClass() { Member = 0; } } 或通过成员初始化: class MyClass { private int Member = 0; } 我的问题:一种方法与另一种方法相比是否存在问题/好处? 从我所看到的,如果你只有一个默认的构造函数,那就太糟糕了。如果您有多个构造函数,则对于所有构造函数都设置为相同值的成员

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

class MyClass{
  private int Member;
  public MyClass()
  {
    Member = 0;
  }
}
或通过成员初始化:

class MyClass
{
  private int Member = 0;
}
我的问题:一种方法与另一种方法相比是否存在问题/好处?


从我所看到的,如果你只有一个默认的构造函数,那就太糟糕了。如果您有多个构造函数,则对于所有构造函数都设置为相同值的成员,成员初始化更可取。

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

否则就是风格和/或重复


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

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

否则就是风格和/或重复


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

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

否则就是风格和/或重复


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

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

否则就是风格和/或重复


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

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

内联初始值设定项通常更方便,如果您查看现有的C#代码,您可能会看到它。通常,构造函数主体中的初始值设定项仅在必要时使用,例如:

  • 如果需要使用仅在运行时已知的数据计算初始值,例如构造函数参数
  • 如果您需要(出于某种原因)以不同于代码中显示的顺序初始化值
  • 如果需要有条件地初始化某些字段
在这些情况下,您唯一的选择就是拥有一个构造函数

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

// 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;
  }
}

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

内联初始值设定项通常更方便,如果您查看现有的C#代码,您可能会看到它。通常,构造函数主体中的初始值设定项仅在必要时使用,例如:

  • 如果需要使用仅在运行时已知的数据计算初始值,例如构造函数参数
  • 如果您需要(出于某种原因)以不同于代码中显示的顺序初始化值
  • 如果需要有条件地初始化某些字段
在这些情况下,您唯一的选择就是拥有一个构造函数

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

// 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;
  }
}

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

内联初始值设定项通常更方便,如果您查看现有的C#代码,您可能会看到它。大多数情况下,构造函数体中的初始值设定项