C#中的新修饰符

MSDN说:

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

例:

class Base { int value; virtual bool Foo() { value++; } } class Derived : Base { int value; override bool Foo() { value++; } } 

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

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

 class A { public int field; } class B : A { public int field; // warning. `B.field` hides `A.field`. } 

使用new将使该警告静音(它将没有其他效果):

 class B : A { public new int field; // Dear compiler, shut up please. } 

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

举个例子,Derived.value不是“隐藏”Base.value。 C#的默认访问修饰符是Private。 如果你使Base.value公开,那么是的,使用new modifer将删除警告。

new修饰符主要用于隐藏非虚方法。 与覆盖修饰符不同,它不仅用于隐藏所有类成员(即变量和属性)。

主要目的是当你使用它隐藏一个方法而不是使用覆盖时(顺便说一句,隐藏一个方法,你不能同时使用覆盖和新的。这会给你一个错误而不仅仅是一个渐弱)。

使用virtual和override修饰符总是类似于使用new修饰符,除了当你使用virtual和override时你不能调用Base类,除了从Child类本身内部

不,你不这样做,因为在这种情况下,基本方法被标记为virtual ,因此基本类会覆盖此方法。

您可能需要使用new修饰符的情况是基本方法未标记为virtual ,例如:

 class Base { int value; public void Foo() { value++; } } class Derived : Base { int value; new public void Foo() { value--; } } 

此外,在上面的示例中,我们必须假设基本Foo方法被标记为publicprotected ,否则virtual修饰符的使用无论如何都是无意义的,因为它对于base / other类是不可见的。