C# 中 `new` 关键字的用法

在 C# 中,new 关键字用于修饰方法、属性、索引器或事件声明时,表示当前成员隐藏基类中同名的成员。它们之间的具体区别如下:

  1. 不加 new

    • 如果子类定义了一个与父类同名的方法,但没有使用 new 关键字,编译器会发出警告,提示你可能无意中隐藏了基类的方法。
    • 这种情况下,子类的方法仍然会隐藏基类的方法,但调用时如果使用的是基类引用,将调用基类的方法。
  2. new

    • 明确表示子类的方法有意隐藏基类中的同名方法。
    • 编译器不会发出警告,因为你知道自己在做什么。
    • 调用时如果使用的是基类引用,仍然会调用基类的方法;如果使用的是子类引用,则会调用子类的方法。

下面是一个示例代码:

csharp 复制代码
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 方法。
相关推荐
Surprisec9 分钟前
动手实践YJS:构建你的第一个实时协作文档编辑器
前端·javascript·面试
晴殇i10 分钟前
JavaScript新一代异步写法:不用await,性能提升80%
前端·面试
患得患失94911 分钟前
【前端】【React】useCallback的作用与使用场景总结
前端·javascript·react.js
wordbaby13 分钟前
TanStack Query :现代 Web 应用的异步状态管理利器
前端
清霜之辰13 分钟前
详解 kotlin 相对 Java 特有的关键字及使用
android·java·kotlin
江沉晚呤时15 分钟前
深入解析策略模式在C#中的应用与实现
java·服务器·开发语言·前端·.netcore
Hamm17 分钟前
如何在TypeScript里使用类封装枚举来实现Java的枚举形参倒置
java·前端·typescript
mikey棒棒棒35 分钟前
使用RabbitMQ实现异步秒杀
java·分布式·rabbitmq·mq
无情的搬砖机器35 分钟前
idea 打不开terminal
java·ide·intellij-idea
avi911137 分钟前
问问lua怎么写DeepSeek,,,,,
java·junit·lua·deepseek