如何正确使用:base()和:this()

本文关键字:this 何正确 base | 更新日期: 2023-09-27 18:22:25

我已经在SO和其他网站上搜索过这个问题,但我还没有找到(或找到)适合我的案例的解决方案。

我有一个名为EnteBase的抽象类,我将其用作其他两个类RegioneProvincia的基(duh!)。


EnteBase

public abstract class EnteBase
{
    public EnteBase ()
        : this( "Sconosciuto", 0 )
    {
    }
    public EnteBase ( string nome )
        : this( nome, 0 )
    {
    }
    public EnteBase ( string nome, int numeroComuni )
    {
        this.Nome = nome;
        this.NumeroComuni = numeroComuni;
    }

    private string nome;
    public string Nome
    {
        [...]
    }
    private int numeroComuni;
    public int NumeroComuni
    {
        [...]
    }
}

Regione

public class Regione : EnteBase
{
    public List<Provincia> Province
    {
        [...]
    }

    public Regione ()
        : base()
    {
        this.Province = new List<Provincia>();
    }
    public Regione ( string nome )
        : this()
    {
    }
    public Regione ( string nome, int numeroComuni )
        : this()
    {
    }

    public void AggiungiProvincia ( Provincia provincia )
    {
        Province.Add( provincia );
    }
}

Provincia

public class Provincia : EnteBase
{
    private string sigla;
    public string Sigla
    {
        [...]
    }
    public Provincia ()
        : base()
    {
    }
    public Provincia ( string nome )
        : this()
    {
        this.Nome = nome;
    }
    public Provincia ( string nome, int numeroComuni )
        : this()
    {
        this.Nome = nome;
        this.NumeroComuni = numeroComuni;
    }
    public Provincia( string nome, int numeroComuni, string sigla)
        : this()
    {
        this.Nome = nome;
        this.NumeroComuni = numeroComuni;
        this.Sigla = sigla;
    }
}

我的问题如下:

  • 在基类的所有构造函数中使用:this()是否正确,除了参数最多的构造函数,其他构造函数指向后者
  • 使用指向类ProvinciaRegione中的基构造函数的:this(),然后从方法本身内部分配给字段,这正确吗

我的问题源于我想在每种方法中同时使用:this():base()。当我发现这是不可能的时候,我寻找了一个解决方案,但我找不到一种方法来应用我在这个问题和这个问题中看到的。

附言:在构造函数中,首选this.FieldName还是仅使用FieldName

如何正确使用:base()和:this()

在基类的所有构造函数中使用:this()正确吗除了参数最多的那个,其他的都指向后者?

唯一的用例是构造函数链接,您可以将初始化工作最小化到一个构造函数,并让所有其他构造函数使用this()和导致该构造函数执行的参数——您已经在EnteBase类中这样做了。

空的base()调用通常是无用的,因为默认情况下无论如何都会调用默认的基构造函数。

一个空的this()调用走错了路,通常也没有用(除非你有一些不依赖于参数的初始化工作)-你应该传递参数一个调用了更多参数的构造函数,最终在一个完成所有工作的构造函数处结束。

使用:this()指向类Provincia和Regione中的基构造函数,然后从方法本身内部分配给字段,这正确吗?

在C#中,对:base()的调用是隐式的,因此不需要显式执行。

因此,在您的示例中,您不需要调用:this(),因为所有这些都是调用基本的无参数构造函数。

在基类的所有构造函数中使用:this()是否正确,除了参数最多的构造函数,其他构造函数指向后者?

是的,这是一种为值提供合理默认值的常见方法。

您应该将subclass中的以下Constructor更改为:

public Provincia ( string nome, int numeroComuni )
    : this()
{
    this.Nome = nome;
    this.NumeroComuni = numeroComuni;
}

收件人:

public Provincia ( string nome, int numeroComuni )
    : base(nome, numeroComuni)
{
}

AND在以下Constructor中相同,来自:

public Provincia( string nome, int numeroComuni, string sigla)
    : this()
{
    this.Nome = nome;
    this.NumeroComuni = numeroComuni;
    this.Sigla = sigla;
}

收件人:

public Provincia( string nome, int numeroComuni, string sigla)
    : base(nome, numeroComuni)
{
    this.Sigla = sigla;
}

消除了在subclass中设置superclass的属性的需要,正如superclass的实现所期望的那样。