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 方法。
相关推荐
boooooooom8 分钟前
Vue3 provide/inject 跨层级通信:最佳实践与避坑指南
前端·vue.js
一颗烂土豆8 分钟前
Vue 3 + Three.js 打造轻量级 3D 图表库 —— chart3
前端·vue.js·数据可视化
linweidong8 分钟前
C++ 中避免悬挂引用的企业策略有哪些?
java·jvm·c++
青莲8439 分钟前
Android 动画机制完整详解
android·前端·面试
用户937611475816110 分钟前
并发编程三大特性
java·后端
阿在在11 分钟前
Spring 系列(二):加载 BeanDefinition 的几种方式
java·后端·spring
iReachers11 分钟前
HTML打包APK(安卓APP)中下载功能常见问题和详细介绍
前端·javascript·html·html打包apk·网页打包app·下载功能
颜酱13 分钟前
前端算法必备:双指针从入门到很熟练(快慢指针+相向指针+滑动窗口)
前端·后端·算法
lichenyang45314 分钟前
从零开始:使用 Docker 部署 React 前端项目完整实战
前端
明月_清风16 分钟前
【开源项目推荐】Biome:让前端代码质量工具链快到飞起来
前端