C#:如果一个类有两个构造函数,这些构造函数共享一些代码的最佳方式是啥? [复制]

Posted

技术标签:

【中文标题】C#:如果一个类有两个构造函数,这些构造函数共享一些代码的最佳方式是啥? [复制]【英文标题】:C#: if a class has two constructors, what is the best way for these constructors to share some code? [duplicate]C#:如果一个类有两个构造函数,这些构造函数共享一些代码的最佳方式是什么? [复制] 【发布时间】:2011-03-09 22:29:43 【问题描述】:

VS2005 中的 C#:如果一个类有两个构造函数,这些构造函数共享一些代码的最佳方式是什么?

例如。我怎样才能避免在以下两个构造函数中使用 x = 5y = 10 行:

public class MyObject 

int x;
int y;
int z;

public MyObject() 
    x = 5;
    y = 10;


public MyObject(int setZ) 
    x = 5;
    y = 10;
    z = setZ;

【问题讨论】:

【参考方案1】:

使用this() 语法。

public MyObject(int setZ) : this() 
    z = setZ;

【讨论】:

如果类被继承了怎么办? this() 也会调用基础构造函数吗? MyObject() 隐式调用基本无参数构造函数。 @Craig, base() 如果您不直接这样做,将被隐式调用。无论调用哪个派生构造函数,都将在派生类之前构造基类。【参考方案2】:

只需链接到通用构造函数...

public MyObject(int setZ)
  : this()

  z = setZ;

【讨论】:

如果类被继承,这会导致基构造函数被执行吗? @CJ7 是的。基类/父链的构造函数总是在当前类的构造函数执行之前先执行。你可以阅读更多here。 This 线程有更多关于构造函数链的信息。【参考方案3】:

创建另一个方法:

private setDefaultNumbers() 
    x = 5;
    y = 10;

然后让你的构造函数的两个版本都调用这个方法:

public MyObject() 
    setDefaultNumbers();


public MyObject(int setZ) 
    setDefaultNumbers();
    z = setZ;

【讨论】:

只有在 setDefaultNumbers 是您在创建对象后可以看到调用的情况下,我才会推荐这个。即使它是私有的,也无法将其标记为“仅用于构造函数”,除非它仅在构造函数中。如果可以的话,我更喜欢链接的构造函数,除非没有办法干净地链接它们。 仅供参考,与嵌套构造函数调用相比,使用设置例程有两个优点:(1)外部构造函数可以在通用设置例程之前运行任意代码; (2) setup 例程可以包装在 try/finally 块中,以确保如果 setup 例程抛出异常,在 setup 例程运行之前创建的任何 IDisposable 对象都将被清除。在某些情况下,可扩展基类让其所有公共构造函数调用受保护的设置例程可能会有所帮助,但具有不具有的受保护构造函数。派生类构造函数可以... ...调用受保护的构造函数,然后自己调用设置例程。显然这种模式需要小心,但在派生类需要创建一些 IDisposable 对象并将它们传递给内部“构造函数”的情况下,它可能是最安全的模式。请注意,调用 base.new(new SomeDisposableType) 是一种危险的模式,如果 base.new 可能抛出任何可能,则无法确保其安全。【参考方案4】:

这与您使用方法的方式非常相似。通常你会这样做:

public void SetA(int a)

    this.a = a;


public void SetAandB(int a, int b)

    this.SetA(a);
    this.b = b;

对于构造函数,它有特殊的语法:

public void MyObject()

    this.a = 5;


public void MyObject(int b)
    : this()

    this.b = 10;

【讨论】:

以上是关于C#:如果一个类有两个构造函数,这些构造函数共享一些代码的最佳方式是啥? [复制]的主要内容,如果未能解决你的问题,请参考以下文章

C#中子类构造函数中如何调用父类构造函数

如果类有两个组件类,如何使构造函数清楚

(51)C#里静态构造函数的两个作用

(51)C#里静态构造函数的两个作用

如果类有一个带有他的名字的方法(函数),为啥要调用构造函数?

java构造函数