Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/299.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 基本关键字在构造函数初始化中实际起什么作用?_C#_Constructor - Fatal编程技术网

C# 基本关键字在构造函数初始化中实际起什么作用?

C# 基本关键字在构造函数初始化中实际起什么作用?,c#,constructor,C#,Constructor,我被C#中的base关键字弄糊涂了。假设我有如下代码: ​class A { ​// member declaration.... A(int s, int t, int x) { ​// assign the values of members } } class B : A { // member declaration.... ​B(int a, int b, int c, int d) : base(a,b,c)

我被C#中的
base
关键字弄糊涂了。假设我有如下代码:

​class A
{
    ​// member declaration....
    A(int s, int t, int x)
    {
        ​// assign the values of members
    }
}

class B : A
{
    // member declaration....
    ​B(int a, int b, int c, int d) : base(a,b,c)
    {
        // does the base keyword play a role in
        // this constructor?
    }
}
​
现在,在
B
的构造函数中
base
关键字的确切用法是什么?我有几个问题要澄清:

  • 使用
    base
    关键字将调用基类
    A
    构造函数(在我们的示例中)?这是正确的吗
  • 在派生类中提供
    base
    关键字会更改派生类构造函数的行为吗
  • 基本上,当构造函数中应该使用
    base
    关键字时(一些示例会很好)

    编辑: 我还有一个问题。我如何通过
    base
    关键字通知
    base
    类我们的
    派生的


    提前感谢。

    是-
    base
    链接到基类中的构造函数

    如果不指定
    base
    this
    (链接到同一类中的另一个构造函数),其效果就如同将
    base()
    链接到基类中的无参数构造函数一样。在您的示例中,这将导致编译失败,因为您的基类没有无参数构造函数

    有关更多信息,请参阅我的

  • 是的,这将调用基类构造函数

  • 派生构造函数总是调用基类构造函数;如果不指定,它将尝试调用无参数构造函数(如果存在)。此语法允许您将参数传递给特定的基类构造函数。请注意,在本例中,没有不带参数的公共或受保护的基类构造函数,因此需要使用带参数的“base”语法

  • 我认为基本原则非常明确

    base关键字用于从派生类中访问基类的成员:

    • 对已被另一个方法重写的基类调用方法

    • 指定在创建派生类的实例时应调用哪个基类构造函数



    我有一个疑问,那么通过
    base
    关键字向
    base
    类通知我们的
    派生的
    类的基本用途是什么呢,通过在派生类中添加其他功能,然后在派生类中执行该功能,您正在扩展基构造函数。@Ant:派生类实例初始化的一部分是运行基类的初始化步骤。想象一下,如果它没有这样做,但是您的示例中
    A
    的构造函数正在设置一些字段-突然您会尝试使用
    B
    的一个实例(这是
    A
    的一个实例),而没有完全初始化。派生构造函数可能会间接调用它,通过同一类中的另一个构造函数,使用
    this
    @Jon,很好;您是否知道这是否在抖动/验证级别强制执行?我知道您需要显式地向基类构造函数发出IL调用,但我从来没有尝试过发出一个没有发出调用的构造函数。
    public class BaseClass
    {
        int num;
    
        public BaseClass()
        {
            Console.WriteLine("in BaseClass()");
        }
    
        public BaseClass(int i)
        {
            num = i;
            Console.WriteLine("in BaseClass(int i)");
        }
    
        public int GetNum()
        {
            return num;
        }
    }
    
    public class DerivedClass : BaseClass
    {
        // This constructor will call BaseClass.BaseClass()
        public DerivedClass() : base()
        {
        }
    
        // This constructor will call BaseClass.BaseClass(int i)
        public DerivedClass(int i) : base(i)
        {
        }
    
        static void Main()
        {
            DerivedClass md = new DerivedClass();
            DerivedClass md1 = new DerivedClass(1);
        }
    }
    
    /*
    Output:
    in BaseClass()
    in BaseClass(int i)
    */