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
相关产品推荐
相关产品推荐

