C# 关于构造函数中 base 和this 区别

72 阅读2分钟

今天在项目中看到一构造函数base,于是让我想起前天的this重载,于是把他们两个放到一起做一个对比,加深印象。

在 C# 中,base 和 this 关键字在构造函数中使用时,具有不同的用途和含义,以下是对它们的详细解释:

1. base 关键字:

  • 作用

    • base 关键字用于调用基类的构造函数或成员(方法、属性或字段)。
    • 在派生类的构造函数中,使用 base 关键字可以显式调用基类的构造函数,以确保基类的成员得到正确的初始化。

示例代码:

class BaseClass
{
    public BaseClass()
    {
        Console.WriteLine("BaseClass default constructor");
    }

    public BaseClass(int value)
    {
        Console.WriteLine($"BaseClass constructor with value: {value}");
    }
}

class DerivedClass : BaseClass
{
    public DerivedClass() : base()
    {
        Console.WriteLine("DerivedClass default constructor");
    }

    public DerivedClass(int value) : base(value)
    {
        Console.WriteLine($"DerivedClass constructor with value: {value}");
    }
}

class Program
{
    static void Main()
    {
        DerivedClass obj1 = new DerivedClass();
        DerivedClass obj2 = new DerivedClass(42);
    }
}

代码解释:

  • BaseClass 有两个构造函数:

    • 无参构造函数:输出 "BaseClass default constructor"。
    • 带一个 int 参数的构造函数:输出 "BaseClass constructor with value: {value}"。
  • DerivedClass 有两个构造函数:

    • 无参构造函数 DerivedClass()

      • 使用 : base() 调用基类 BaseClass 的无参构造函数。
      • 输出 "BaseClass default constructor" 然后输出 "DerivedClass default constructor"。
    • 带一个 int 参数的构造函数 DerivedClass(int value)

      • 使用 : base(value) 调用基类 BaseClass 带参数的构造函数。
      • 输出 "BaseClass constructor with value: 42" 然后输出 "DerivedClass constructor with value: 42"。

2. this 关键字:

  • 作用

    • this 关键字用于调用当前类的其他构造函数。
    • 在一个类的构造函数中,使用 this 可以调用该类的另一个构造函数,以便重用代码和简化构造函数的实现。

示例代码:

class MyClass
{
    public MyClass() : this(0)
    {
        Console.WriteLine("MyClass default constructor");
    }

    public MyClass(int value)
    {
        Console.WriteLine($"MyClass constructor with value: {value}");
    }
}

class Program
{
    static void Main()
    {
        MyClass obj1 = new MyClass();
        MyClass obj2 = new MyClass(42);
    }
}

代码解释:

  • MyClass 有两个构造函数:

    • 无参构造函数 MyClass()

      • 使用 : this(0) 调用 MyClass(int value) 构造函数,传递 0 作为参数。
      • 输出 "MyClass constructor with value: 0" 然后输出 "MyClass default constructor"。
    • 带一个 int 参数的构造函数 MyClass(int value)

      • 输出 "MyClass constructor with value: 42"。

总结:

  • base 关键字

    • 用于在派生类的构造函数中调用基类的构造函数或成员。
    • 确保基类的构造函数被调用,以便基类的成员得到正确初始化。
    • 帮助实现派生类与基类之间的构造函数调用链。
  • this 关键字

    • 用于在同一类的构造函数中调用该类的其他构造函数。

    • 帮助减少代码重复,使构造函数之间可以相互调用,简化代码实现。

使用 base 和 this 关键字可以提高代码的可读性和可维护性,确保对象的构造过程遵循预期的逻辑,并且可以有效地管理类的层次结构中的构造函数调用。