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