C#中的this()和base()构造函数

时间:2011-01-31 19:13:27

标签: .net multiple-constructors

似乎没有用于指定this()和base()构造函数的语言语法。给出以下代码:

public class Bar : Foo
{
    public Bar()
      :base(1)
      //:this(0)
    { }
    public Bar(int schmalue)
      :Foo(1)
    {
       //Gobs of initialization code
       ...
       Schmalue = schmalue;
    }

    public int Schmalue { get; private set; }
}

public class Foo
{
    public Foo()
    {
        Value = 0;
    }

    public class Foo(int value)
    {
        Value = value;
    }

    public int Value { get; private set; }
}

编译器给出了一个错误,指出在取消注释:this(0)调用时需要'{'。这很麻烦,因为它导致我将我的代码分解为私有方法,当明确提供此功能以防止这样的事情。

我只是做错了吗?我试过没有分隔符,分号,逗号......这似乎只是开发团队的疏忽。我很感兴趣为什么这个被忽略了,如果我以错误的方式解决这个问题,或者是否有人对替代方案提出了很好的建议。

5 个答案:

答案 0 :(得分:9)

您可以通过调用链末尾的基础构造函数来完成此任务:

public Bar(): this(0) {}
public Bar(int schmalue): base(1) {
    // ... initialize
}

答案 1 :(得分:3)

不,你只能链接到一个构造函数 - 同一个类中的另一个构造函数或基础构造函数。

你要做的事情并不是很清楚。通常我发现值得在派生类中创建一个“主要”构造函数:派生类中的所有其他构造函数都使用“this”来调用主要构造函数,它调用“base”来调用相应的基础构造函数。

虽然该模型不适合每个场景 - 特别是当你想从不同的派生构造函数调用不同的基础构造函数时 - 它通常是 一个好的模型。

答案 2 :(得分:3)

考虑如果你可以在一个构造函数中同时调用thisbase作为构造函数会发生什么。让我们假设首先调用基础构造函数。然后,将调用this构造函数 - 它本身将调用基础构造函数。因此,基类将被实例化两次。这打破了构造函数的语义 - 即,对象构造一次。

因此,禁止同时调用basethis。如果需要,让您的委托this构造函数使用特定参数调用基础。

答案 3 :(得分:1)

在您的设计中,我看不到BarFoo类之间的许多常见内容。当你重新实现所有内容时,Foo为什么会从Bar派生出来?这两个类都有一个带有公共getter和private setter的整数属性,这两个类都有默认的构造函数和一个允许初始化整数属性的构造函数。那么为什么这两个类仍然存在呢?

答案 4 :(得分:0)

Bar的第二位律师完全错了。尝试:

public Bar(int schmalue)
  :base(1) //would call Foo(1)
{
   //Gobs of initialization code
   ...
   Schmalue = schmalue;
}

第一个ctor中的评论似乎意味着类似

  • 使用schmalue = 0初始化Bar

  • 呼叫基地ctor Foo,其值为1

右?

要做到这一点,请更换第二个ctor,然后添加另一个可以处理这两个值的私有ctor

public Bar(int schmalue)
  :this(1, schmalue) //would call Bar(1, schmalue)
{
}

private Bar(int value, int schmalue)
 :base(value)
{
    //Gobs of initialization code
   ...
   Schmalue = schmalue;
}