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 方法。
相关推荐
zabr13 小时前
花了 100+ 篇笔记,我整理出 了一套 AI Agent 工程完全指南
前端·后端·agent
jing-ya13 小时前
day 59 图论part10
java·开发语言·数据结构·算法·图论
软弹13 小时前
深入理解 React Ref 机制:useRef 与 forwardRef 的协作原理
前端·javascript·react.js
YaHuiLiang13 小时前
Ai Coding浪潮下的前端:“AI在左,裁员在右”
前端
短剑重铸之日13 小时前
《ShardingSphere解读》16 改写引擎:如何理解装饰器模式下的 SQL 改写实现机制?
java·数据库·后端·sql·shardingsphere·分库分表·装饰器模式
雪碧聊技术13 小时前
前端vue代码架子搭建
前端·javascript·vue.js·前端项目代码框架搭建
爱学习的程序媛13 小时前
【Web前端】前端用户体验优化全攻略
前端·ui·交互·web·ux·用户体验
q54314708713 小时前
VScode 开发 Springboot 程序
java·spring boot·后端
han_13 小时前
JavaScript设计模式(二):策略模式实现与应用
前端·javascript·设计模式
x***r15113 小时前
Notepad++ 8.6 安装教程:详细步骤+自定义安装路径(附注意事项)
linux·前端·javascript