You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

C#中属性类名前使用new关键字的作用?Rider频繁提示添加该关键字

在C#中成员前加new关键字的用途(针对Rider的提示)

嘿,这个场景我太熟了!Rider给你提示加new,本质是帮你处理**名称隐藏(Name Hiding)**的问题,我给你拆解明白:

为什么会出现这个提示?

你的MyClass肯定是继承了某个父类,而这个父类里刚好也有一个叫attribute的成员(不管是字段还是属性),类型可能是AttributeClass或者它的基类。这时候你在子类里又定义了同名的成员,就会“隐藏”掉父类的那个成员——编译器默认会觉得你可能是不小心写错了,所以抛出警告,Rider就是在提醒你处理这个情况。

new关键字到底有啥用?

简单说,它就是给编译器递个“明确指令”:

  • 告诉编译器:我就是故意要隐藏父类的这个成员,不是疏忽,这样警告就会消失。
  • 它和override完全不是一回事:override是重写父类的虚成员,保持多态性;而new是在子类里重新定义一个完全独立的同名成员——当你用父类引用指向子类实例时,访问这个成员会拿到父类的版本;只有用子类引用时,才会用到你用new定义的这个版本。

举个实际的例子你就懂了:

// 父类
public class ParentClass
{
    public AttributeClass attribute = new AttributeClass("父类成员");
}

// 子类
public class MyClass : ParentClass
{
    // 不加new的话,编译器/Rider会警告你隐藏了父类的attribute
    new public AttributeClass attribute = new AttributeClass("子类成员");
}

// 调用测试
ParentClass parent = new MyClass();
Console.WriteLine(parent.attribute.Name); // 输出:父类成员

MyClass child = new MyClass();
Console.WriteLine(child.attribute.Name); // 输出:子类成员

要不要加new?

  • 如果你的意图就是要在子类里搞一个和父类同名但独立的成员,那就加上new,消除警告也让代码意图更清晰。
  • 如果是想重写父类的虚成员(比如父类的attribute是virtual属性),那别用new,应该用override,这才是多态的正确写法。

内容的提问来源于stack exchange,提问作者cutMeDown

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.15 07:49:05