C# 中 `new` 关键字的用法
在 C# 中,new
关键字用于修饰方法、属性、索引器或事件声明时,表示当前成员隐藏基类中同名的成员。它们之间的具体区别如下:
-
不加
new
:- 如果子类定义了一个与父类同名的方法,但没有使用
new
关键字,编译器会发出警告,提示你可能无意中隐藏了基类的方法。 - 这种情况下,子类的方法仍然会隐藏基类的方法,但调用时如果使用的是基类引用,将调用基类的方法。
- 如果子类定义了一个与父类同名的方法,但没有使用
-
加
new
:- 明确表示子类的方法有意隐藏基类中的同名方法。
- 编译器不会发出警告,因为你知道自己在做什么。
- 调用时如果使用的是基类引用,仍然会调用基类的方法;如果使用的是子类引用,则会调用子类的方法。
下面是一个示例代码:
using System;
class BaseClass {
public void show() {
Console.WriteLine("BaseClass show");
}
}
class DerivedClass : BaseClass {
// 使用 new 关键字隐藏基类方法
public new void show() {
Console.WriteLine("DerivedClass show");
}
}
class Program {
static void Main(string[] args) {
BaseClass baseObj = new DerivedClass();
baseObj.show(); // 输出: BaseClass show
DerivedClass derivedObj = new DerivedClass();
derivedObj.show(); // 输出: DerivedClass show
}
}
在这个例子中:
- 当使用
BaseClass
类型的引用调用show
方法时,即使对象是DerivedClass
的实例,也会调用基类的show
方法。 - 当使用
DerivedClass
类型的引用调用show
方法时,会调用子类的show
方法。