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 方法。
相关推荐
泉-java7 分钟前
第56条:为所有导出的API元素编写文档注释 《Effective Java》
java·开发语言
0思必得07 分钟前
[Web自动化] Selenium处理滚动条
前端·爬虫·python·selenium·自动化
Misnice10 分钟前
Webpack、Vite、Rsbuild区别
前端·webpack·node.js
青茶36011 分钟前
php怎么实现订单接口状态轮询(二)
前端·php·接口
初级代码游戏27 分钟前
套路化编程 C# winform 自适应缩放布局
开发语言·c#·winform·自动布局·自动缩放
zfoo-framework35 分钟前
帧同步和状态同步
java
charlotte1024102437 分钟前
高并发:关于在等待学校教务系统选课时的碎碎念
java·运维·网络
亓才孓42 分钟前
[JDBC]PreparedStatement替代Statement
java·数据库
大橙子额1 小时前
【解决报错】Cannot assign to read only property ‘exports‘ of object ‘#<Object>‘
前端·javascript·vue.js
_F_y1 小时前
C++重点知识总结
java·jvm·c++