c# :this() 和 :base()区别
在 C# 中,:this()
和 :base()
都用于构造函数的重载和继承,但它们有不同的用途和上下文:
1. :this()
- 用途:用于调用当前类中的其他构造函数(构造函数重载)。
- 场景:当你希望一个构造函数先执行另一个构造函数中的逻辑时使用。
- 示例:
输出(当调用public class MyClass {public MyClass() : this("default") // 调用下面的构造函数{Console.WriteLine("无参构造函数");}public MyClass(string name){Console.WriteLine($"带参构造函数,name: {name}");} }
new MyClass()
时):带参构造函数,name: default 无参构造函数
2. :base()
- 用途:用于调用基类(父类)的构造函数。
- 场景:在继承关系中,子类构造函数需要初始化基类的成员时使用。
- 示例:
输出(当调用public class BaseClass {public BaseClass(){Console.WriteLine("基类构造函数");} }public class DerivedClass : BaseClass {public DerivedClass() : base() // 显式调用基类构造函数(可省略){Console.WriteLine("子类构造函数");} }
new DerivedClass()
时):基类构造函数 子类构造函数
关键区别
特性 | :this() | :base() |
---|---|---|
调用目标 | 当前类的其他构造函数 | 基类的构造函数 |
使用场景 | 构造函数重载(简化代码) | 继承(初始化基类成员) |
是否可选 | 可选(根据需要) | 可选(如果基类有无参构造函数,可省略) |
其他注意事项
- 如果省略
:base()
,编译器会自动调用基类的无参构造函数(如果基类没有无参构造函数,则必须显式调用)。 :this()
和:base()
必须出现在构造函数声明之后,且只能选择其中之一(不能同时使用)。- 它们可以带参数,例如
:this("hello")
或:base(42)
。
示例(结合使用)
public class Animal
{public Animal(string name){Console.WriteLine($"Animal: {name}");}
}public class Dog : Animal
{public Dog() : this("Buddy") // 调用当前类的其他构造函数{Console.WriteLine("Dog()");}public Dog(string name) : base(name) // 调用基类构造函数{Console.WriteLine($"Dog(name: {name})");}
}
输出(当调用 new Dog()
时):
Animal: Buddy
Dog(name: Buddy)
Dog()