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

C#:如果一个类有两个构造函数,那么这些构造函数共享代码的最佳方式是什么?,c#,constructor,C#,Constructor,VS2005中的C#:如果一个类有两个构造函数,那么这些构造函数共享代码的最佳方式是什么 例如,我如何避免在以下两个构造函数中都有x=5和y=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; } 使用语法 只需链接到公共构

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

例如,我如何避免在以下两个构造函数中都有
x=5
y=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;
}
使用语法


只需链接到公共构造函数

public MyObject(int setZ)
  : this()
{
  z = setZ;
}
创建另一个方法:

private setDefaultNumbers() {
    x = 5;
    y = 10;
}
然后让两个版本的构造函数调用此方法:

public MyObject() {
    setDefaultNumbers();
}

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

这与使用方法的方式非常相似。通常,您会执行以下操作:

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

如果类是继承的呢?this()也将调用基构造函数吗?
MyObject()
隐式调用基无参数构造函数。@Craig,
base()
将隐式调用,如果您不直接这样做。无论调用哪个派生构造函数,基类都将在派生类之前构造。只有在创建对象后可以看到调用setDefaultNumbers时,我才建议这样做。即使它是私有的,也无法将其标记为“仅限构造函数”,除非它仅位于构造函数中。如果可以的话,我更喜欢链式构造函数,除非没有办法清晰地链接它们。仅供参考,与嵌套构造函数调用相比,使用安装例程有两个优点:(1)外部构造函数可以在公共安装例程之前运行任意代码;(2) 可以将安装例程包装在try/finally块中,以确保在运行安装例程之前创建的任何IDisposable对象在安装例程引发异常时都将被清除。在某些情况下,让可扩展基类的所有公共构造函数调用受保护的设置例程,但让受保护的构造函数调用不受保护的设置例程,这可能会有所帮助。派生类构造函数可以……调用受保护的构造函数,然后自己调用安装例程。显然,这个模式需要一些注意,但是在派生类需要创建一些IDisposable对象并将它们传递给内部“构造函数”的场景中,它可能是最安全的模式。请注意,调用base.new(new SomeDisposableType)是一种危险的模式,如果base.new有可能抛出,则无法使其安全。如果继承该类,这会导致执行基构造函数吗?@CJ7 Yes。基类/父链的构造函数总是在当前类的构造函数执行之前先执行。你可以更多地了解它。线程有更多关于构造函数链接的信息。
public void MyObject()
{
    this.a = 5;
}

public void MyObject(int b)
    : this()
{
    this.b = 10;
}