C# C语言中的新修饰语#

C# C语言中的新修饰语#,c#,modifier,C#,Modifier,MSDN说: 当用作修改器时,新的 关键字显式隐藏成员 从基类继承的。当你 隐藏继承的成员、派生的 成员的版本将替换 基类版本。虽然你可以 隐藏成员而不使用 新的修改器,结果是一个警告。 如果使用“新建”显式隐藏 成员,它将抑制此警告并 记录了以下事实: 该版本旨在作为替代品 例如: class Base { int value; virtual bool Foo() { value++; } } class Derived : Base { int value; ove

MSDN说:

当用作修改器时,新的 关键字显式隐藏成员 从基类继承的。当你 隐藏继承的成员、派生的 成员的版本将替换 基类版本。虽然你可以 隐藏成员而不使用 新的修改器,结果是一个警告。 如果使用“新建”显式隐藏 成员,它将抑制此警告并 记录了以下事实: 该版本旨在作为替代品

例如:

class Base
{
 int value;

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

class Derived : Base
{
 int value;

 override bool Foo()
 {
  value++;
 }

}

是否必须向派生的.value声明添加
新的
修饰符?有什么变化?

由于
字段是
私有的
,因此在派生类中无法访问该字段。因此,派生类中的声明并不真正隐藏任何内容。您不应该在声明中添加
new
。如果您这样做,除了编译器会警告您错误使用
new
之外,没有任何变化。如果在派生类中可以访问
字段(例如,它是
公共
),那么您应该使用
新建
来表示隐藏基本成员的意图:

class A {
    public int field;
}
class B : A {
    public int field; // warning. `B.field` hides `A.field`. 
}
使用
new
将使该警告静音(不会产生其他效果):


不能将方法同时声明为
覆盖
新建
。它们是互斥的。

由于
字段是
私有的
,因此在派生类中无法访问该字段。因此,派生类中的声明并不真正隐藏任何内容。您不应该在声明中添加
new
。如果您这样做,除了编译器会警告您错误使用
new
之外,没有任何变化。如果在派生类中可以访问
字段(例如,它是
公共
),那么您应该使用
新建
来表示隐藏基本成员的意图:

class A {
    public int field;
}
class B : A {
    public int field; // warning. `B.field` hides `A.field`. 
}
使用
new
将使该警告静音(不会产生其他效果):


不能将方法同时声明为
覆盖
新建
。它们是互斥的。

以您的示例为例,Derived.value不是“隐藏”Base.value。C#的默认访问修饰符为Private。如果将Base.value设置为公共,则“是”,使用新的修改器将删除警告。

举个例子,Derived.value不是“隐藏”Base.value。C#的默认访问修饰符为Private。如果将Base.value设置为公共,则使用新的修改器将删除警告。

否您不这样做,因为在这种情况下,基类将标记为
virtual
,因此基类将覆盖此方法

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

class Base
{
    int value;

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

class Derived : Base
{
    int value;

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

此外,在上面的示例中,我们必须假设base
Foo
方法被标记为
public
protected
,否则使用
virtual
修饰符是毫无意义的,因为它对base/其他类不可见。

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

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

class Base
{
    int value;

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

class Derived : Base
{
    int value;

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

此外,在上面的示例中,我们必须假设基本
Foo
方法标记为
public
protected
,否则,使用
virtual
修饰符是毫无意义的,因为它对基类/其他类不可见。

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

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


使用virtual和override修饰符总是与使用new修饰符类似,只是当使用virtual和override时,不能调用基类,除非从子类本身内部调用

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

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


使用virtual和override修饰符将始终与使用新修饰符类似,只是当使用virtual和override时,不能调用基类,除非从子类本身内部调用

不是默认的访问修饰符
private
?对于除在
名称空间
级别声明的类型,对于这些类型,
私有
没有意义,默认值为
内部
。。。。顺便说一下,如果
受保护
,您应该使用
new
受保护的
字段在其派生类中可见,如果用相同的名称声明一个字段,您将隐藏它。@Broam:啊,我想您是对的。vb.net的默认值是受保护的。默认访问修饰符不是
private
吗?默认访问修饰符是
private
,除了在
命名空间
级别声明的类型之外,其他任何类型的访问修饰符都是
private
没有意义,默认值是
internal
。。。。顺便说一下,如果
受保护
,您应该使用
new
受保护的
字段在其派生类中可见,如果用相同的名称声明一个字段,您将隐藏它。@Broam:啊,我想您是对的。vb.net的默认设置受保护。@Meh