C#中的新修饰符

Cap*_*mic 1 c# modifier

MSDN说:

当用作修饰符时,new关键字显式隐藏从基类继承的成员.隐藏继承的成员时,该成员的派生版本将替换基类版本.虽然您可以在不使用new修饰符的情况下隐藏成员,但结果是警告.如果使用new来显式隐藏成员,则会抑制此警告并记录派生版本旨在替代的事实.

例:

class Base
{
 int value;

 virtual bool Foo()
 {
   value++;
 }
}

class Derived : Base
{
 int value;

 override bool Foo()
 {
  value++;
 }

}
Run Code Online (Sandbox Code Playgroud)

我是否必须new向Derived.value声明添加修饰符?有什么变化?

Meh*_*ari 14

由于该value字段是private,它在派生类中是不可访问的.因此,派生类中的声明并不真正隐藏任何内容.您不应该添加new到声明中.如果你这样做,没有任何改变,除了编译器会警告你使用new不正确.如果该value字段在派生类中是可访问的(例如它是public),那么您应该习惯于new表达隐藏基本成员的意图:

class A {
    public int field;
}
class B : A {
    public int field; // warning. `B.field` hides `A.field`. 
}
Run Code Online (Sandbox Code Playgroud)

使用new将沉默警告(它将没有其他影响):

class B : A {
    public new int field; // Dear compiler, shut up please.
}
Run Code Online (Sandbox Code Playgroud)

您不能将方法声明为overridenew.它们是相互排斥的.