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 方法。
相关推荐
YOU OU1 分钟前
SpringBoot
java·spring boot·spring
北冥有鱼2 分钟前
解决DTO泛滥的问题
java·java ee
LPieces2 分钟前
【LPieces-UI】01-从零开始搭建 Vue3 组件库
前端
国强_dev5 分钟前
如何提升canal吞吐量
java·大数据·python
时空自由民.5 分钟前
C/C++ volatile关键字原理及应用介绍
java·c语言·c++
学习使我快乐015 分钟前
AI时代下,前端如何破局
前端·人工智能
Henray20246 分钟前
三个线程交替打印ABC
java·面试
凯瑟琳.奥古斯特8 分钟前
SpringBoot快速入门指南
java·开发语言·spring boot·后端·spring
是席木木啊14 分钟前
Tomcat CVE-2026-34483安全漏洞警告问题总结与修复方案
java·tomcat·firefox
代码漫谈15 分钟前
基于 Spring Boot 3.2.x 的 Actuator 监控指南:从健康检查到企业级监控体系
java·spring boot·actuator 监控