C#中的新修饰符

时间:2009-12-17 15:33:33

标签: c# modifier

MSDN说:

  

当用作修饰符时,新的   关键字显式隐藏成员   继承自基类。当你   隐藏继承的成员,派生   该成员的版本取代了   基类版本。虽然你可以   隐藏成员而不使用   新修饰符,结果是警告。   如果你使用new来明确隐藏一个   会员,它抑制了这个警告和   记录派生的事实   版本旨在替代。

示例:

class Base
{
 int value;

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

class Derived : Base
{
 int value;

 override bool Foo()
 {
  value++;
 }

}

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

4 个答案:

答案 0 :(得分: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`. 
}

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

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

您无法将方法声明为overridenew。它们是相互排斥的。

答案 1 :(得分:2)

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

答案 2 :(得分:1)

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

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

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

答案 3 :(得分:0)

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

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

class Base
{
    int value;

    public void Foo()
    {
        value++;
    }
}

class Derived : Base
{
    int value;

    new public void Foo()
    {
        value--;
    }
}

此外,在上面的示例中,我们必须假设基本Foo方法标记为publicprotected,否则virtual修饰符的使用是有点无意义,因为它不会被基地/其他班级看到。