C# 构造函数中的Base()和This()。(链式施工人员)

C# 构造函数中的Base()和This()。(链式施工人员),c#,constructor,C#,Constructor,我有一个关于链接构造函数的问题,我读了一些关于StackOverflow的问题和一些c#文章,但我不能完全理解这个主题。所以我有一个基类,它是由DerivedClass继承的。在DerivedClass中,我没有参数构造函数,但它使用:base()调用基构造函数,并传递一个值。这是构造器中使用的base关键字的主要目的,用于将值从派生类传递给继承类,还是其他一些。在派生类中,我们还有第二个构造函数,它接受1个参数及其用法:this()。我不明白为什么当我从这个构造函数中删除:this()时“VS

我有一个关于链接构造函数的问题,我读了一些关于StackOverflow的问题和一些c#文章,但我不能完全理解这个主题。所以我有一个基类,它是由DerivedClass继承的。在DerivedClass中,我没有参数构造函数,但它使用:base()调用基构造函数,并传递一个值。这是构造器中使用的base关键字的主要目的,用于将值从派生类传递给继承类,还是其他一些。在派生类中,我们还有第二个构造函数,它接受1个参数及其用法:this()。我不明白为什么当我从这个构造函数中删除:this()时“VS”告诉我“没有给定的参数对应于BaseClass.BaseClass(int)所需的形式参数“I”?为什么我不能在DerivedClass中只有一个参数构造函数而不使用this()

公共类基类
{
受保护整数;
公共基类(int i)
{
_Num=i;
}
public int Num{get=>this.\u Num;set=>\u Num=value;}
}
公共类DerivedClassA:基类
{
私有字符串\u名称;
私人国际价值;
公共字符串名称{get=>this.\u Name;set=>this.\u Name=value;}
public int-AnotherValue{get=>this.\u-AnotherValue;set=>this.\u-AnotherValue=value;}
public-DerivedClassA():base(123)
{
_Name=“测试”;
}

public-DerivedClassA(int-param2):this()我找不到完全匹配的副本,因此我将提供一个答案

想象一下这些类:

public class Base
{
    public Base()
    {
    }
}

public class Derived : Base
{
    public Derived()
    {
    }
}

初始化派生类时,必须首先初始化基类。在上面的示例中,基类有一个无参数构造函数,因此派生类可以隐式调用它。如果添加第二个基类构造函数,则此逻辑保持为真,无参数构造函数仍将隐式调用:

public class Base
{
    public Base()
    {
    }

    public Base(int a)
    {
    }
}

public class Derived : Base
{
    public Derived()
    {
    }
}

但是如果我们去掉无参数构造函数,派生构造函数现在必须显式调用基构造函数:

public class Base
{       
    public Base(int a)
    {
    }
}

public class Derived : Base
{
    public Derived() : base(1)
    {
    }
}

那么,如果我们添加一个额外的派生类构造函数会发生什么呢?那么,这也必须调用基类(直接或间接):

请注意,当没有定义其他构造函数时,所有类都有一个无参数构造函数,因此以下两个示例是等效的:

public class BaseA
{

}

public class BaseB
{
    public BaseB()
    {
    }
}
您将注意到,这显示编译器从
BaseB()
中删除了空构造函数,因为它是多余的

最后,没有显式定义构造函数的派生类仍将隐式调用基类构造函数:

public class Base
{       
    public Base()
    {
        // this method body is executed first
        Console.WriteLine("Base constructor");
    }
}

public class Derived : Base
{
}


总结一下:除非基类有无参数构造函数,否则派生类构造函数必须直接调用基类构造函数,或通过另一个派生类构造函数间接调用。显然,与任何其他类实例化一样,您只需要调用单个基类构造函数方法。您不需要匹配的派生类构造函数每个基类方法都有d个方法,只要你能用你拥有的值构造基类。

因为你必须调用基类构造函数。在这种情况下,你总是需要调用基类构造函数。你要么需要调用
:base(value)
,要么调用
:this()
,后者依次调用
:base(123)
。我确信已经有人问过这个问题。因为只有当基本构造函数没有参数时,才会隐式调用它。您不能隐式调用带有参数的基本构造函数。只要指定一个参数构造函数,那么默认的无参数构造函数将不再自动提供。(您仍然可以自己指定一个).子类只能使用可用的。但是,它们不必使用所有超类构造函数(但至少一个)。您不需要匹配的构造函数。如果基中有5个构造函数,则派生中不需要有5个。只需添加您想要派生的任何一个即可。@John很好的示例和答案。非常感谢。
public class BaseA
{

}

public class BaseB
{
    public BaseB()
    {
    }
}
public class Base
{       
    public Base()
    {
        // this method body is executed first
        Console.WriteLine("Base constructor");
    }
}

public class Derived : Base
{
}