C#之new修饰符

转自MSDN:https://msdn.microsoft.com/zh-cn/library/435f1dw2.aspx

在用作修饰符时,new关键字可以显式的隐藏从基类继承的成员。隐藏继承的成员时,该成员的派生版本将替换基类版本。虽然可以不使用new修饰符的情况下隐藏成员,但会生成警告。如果使用new显示隐藏成员,则会取消此警告,并记录要替换为派生版本这一事实。

若要隐藏继承的成员,请使用相同名称在派生类中声明该成员,并使用new修饰符修饰该成员。例如:

1 public class BaseC
2 {
3     public int x;
4     public void Invoke() { }
5 }
6 public class DerivedC : BaseC
7 {
8     new public void Invoke() { }
9 }

在此示例中,DerivedC.Invoke隐藏了BaseC.Invoke。字段x不受影响,因为它没有被类似名称的字段隐藏。

通过继承隐藏名称采用下列形式之一:

  • 引入类或结构中的常数、指定、属性或类型隐藏具有相同名称的所有基类成员。
  • 引入类或结构中的方法隐藏基类中具有相同名称的属性、字段和类型。同时也隐藏具有相同签名的所有基类方法。
  • 引入雷火结构中的索引器将隐藏具有相同名称的所有基类索引器。

对同一成员同时使用new和override是错误的做法,因为这两个修饰符的含义互斥。new修饰符会用同样的名称创建一个新成员并使原始成员变为隐藏的。override修饰符会扩展继承成员的实现。

在不隐藏继承成员的声明中使用new修饰符将会生成警告。

示例

在该例中,基类BaseC和派生类DerivedC使用相同的字段名x,从而隐藏了继承字段的值。该实例演示了new修饰符的用法。另外还演示了如何使用完全限定名访问基类的隐藏成员。

 1 public class BaseC
 2 {
 3     public static int x = 55;
 4     public static int y = 22;
 5 }
 6
 7 public class DerivedC : BaseC
 8 {
 9     // Hide field ‘x‘.
10     new public static int x = 100;
11
12     static void Main()
13     {
14         // Display the new value of x:
15         Console.WriteLine(x);
16
17         // Display the hidden value of x:
18         Console.WriteLine(BaseC.x);
19
20         // Display the unhidden member y:
21         Console.WriteLine(y);
22     }
23 }
24 /*
25 Output:
26 100
27 55
28 22
29 */

在此示例中,嵌套类隐藏了基类中同名的类。此示例演示了如何使用new修饰符来消除警告消息,以及如何使用完全限定名来访问隐藏的类成员。

 1 public class BaseC
 2 {
 3     public class NestedC
 4     {
 5         public int x = 200;
 6         public int y;
 7     }
 8 }
 9
10 public class DerivedC : BaseC
11 {
12     // Nested type hiding the base type members.
13     new public class NestedC
14     {
15         public int x = 100;
16         public int y;
17         public int z;
18     }
19
20     static void Main()
21     {
22         // Creating an object from the overlapping class:
23         NestedC c1  = new NestedC();
24
25         // Creating an object from the hidden class:
26         BaseC.NestedC c2 = new BaseC.NestedC();
27
28         Console.WriteLine(c1.x);
29         Console.WriteLine(c2.x);
30     }
31 }
32 /*
33 Output:
34 100
35 200
36 */

如果移除new修饰符,该程序仍可编译和运行,但您会收到以下警告:

The keyword new is required on ‘MyDerivedC.x‘ because it hides inherited member ‘MyBaseC.x‘
时间: 2024-10-05 04:58:44

C#之new修饰符的相关文章

静态修饰符static,类中的常量定义修饰符

static可以用来区分成员变量.方法是属于类本身还是属于类实例化后的对象.有static修饰的成员属于类本身,没有static修饰的成员属于类的实例. 静态变量仅在局部函数域中存在,但当程序执行离开此作用域时,其值并不丢失static是一个修饰符,用于修饰成员(成员变量和成员函数)静态成员随着类的加载而加载.静态成员优先于对象存在.静态成员被所有对象所共享静态成员多了一个中调用方式,可以被类名直接调用.静态的优缺点优点: 静态成员多了一种调用方式.可以直接被类名调用 格式 :类名.静态成员.也

有趣的修饰符之??、?:、?

良好的程序修养在于灵活运用各类语法(修饰符).本文介绍下,在C#语言中的??(双问号操作符).?:(三元表达式).?(单问好操作符) 1,?? 为了实现Nullable数据类型转换成non-Nullable型数据,就有了一个这样的操作符"??(两个问号)",双问号操作符意思是取所赋值??左边的,如果左边为null,取所赋值??右边的. 比如int y = x ?? -1 如果x为空,那么y的值为-1. 于是这时候就可以把最上面第二段代码改成:string strParam= Reque

修饰符-包-内部类-代码块执行顺序

1.访问权限修饰符     从大到小的顺序为:public--protected--default--private     private--只能在同一类中使用;     default--不用写出来,默认不加.可以被同一包中的类使用     protected--可以被不同包的子类使用     public--可以被不同包的其它类使用 2.各种修饰符的修饰对象(可修饰哪些:类/接口/方法/属性)(多个修饰符连用是可以没有顺序的!)     1)访问权限修饰符:public/default--

访问修饰符

访问修饰符:public.protected.Default.private Public:是公共的,公有的.在任何一个地方都可以访问,一个类里面只有一个public的类,对外的公共类只有一个.成员变量可以用public.局部变量不可使用访问修饰符. Public void getName(){ } Protected:受保护的,在同一个包中可以访问,或者是不同包中的子类可以访问. Protected void getName(){} Default:默认的访问修饰符,只能在同一个包中访问. (

scala学习手记10 - 访问修饰符

scala的访问修饰符有如下几个特性: 如果不指定访问修饰符,scala默认为public: 较之Java,scala对protected的定义更加严格: scala可以对可见性进行细粒度的控制. scala的默认访问修饰符 如果没有修饰符,scala会默认把类.字段.方法的访问修饰符当做public.如果要将之调整为private或protected,只需在前面添加对应的修饰符关键字即可.就如下面的程序: class Microwave{ def start() = println("star

包、修饰符、内部类、匿名内部类(java基础知识十)

1.package关键字的概述及作用 * A:为什么要有包     * 将字节码(.class)进行分类存放  * B:包的概述     *   * C:包的作用     * 包名要定义在第一行,     * 包名.*这个包下所有的类都可见     * 具体的类比较好,能提高效率 2.包的定义及注意事项 * A:定义包的格式 * package 包名; * 多级包用.分开即可* B:定义包的注意事项 * A:package语句必须是程序的第一条可执行的代码 * B:package语句在一个jav

初来驾到学java修饰符的使用

年一过完学习起来特精神感受一下java修饰符的应用于区别 访问修饰符的使用权限:最大的是public修饰符的属性他可以在任意的地方调用 其次是protected修饰符它不除不能再非不同包的子类调用外其他的都可以 默认的修饰符不能再不同包之间调用 同包的情况下不同类子类非子类均可调用. privatie是私有的只能在本类中调用 包 同包 不同包 使用限制 关系 本类 子类 非子类 子类 非子类 private O X X X X 私有的 默认 O O O X X 默认 protected O O

JavaSE入门学习10:Java修饰符

Java语言提供了很多修饰符,主要分为以下两类: 访问修饰符 非访问修饰符 修饰符用来定义类.方法或者变量,通常放在语句的最前端.我们通过下面的例子来说明: <span style="font-size:18px;">public class className { // ... } private boolean flag; static final double weeks = 9.5; protected static final int BOXWIDTH = 42;

javascript正则表达式修饰符之multiline(/m)的使用

javascript正则表达式有3种修饰符/i./m和/g./i是我们最常用,也是最好理解的,代表正则表达式匹配的时候不区分大小写. var regex = /abc/i; alert(regex.test("aBc"));//true /m代表多行模式multiline,如果目标字符串中不含有换行符\n,即只有一行,那么/m修饰符没有任何意义. var multiline = /abc/m; var singleline = /abc/; //目标字符串不含换行符\n var tar

final修饰符

final修饰变量时,表示该变量一旦获得了初始值就不可改变, 由于final变量获得初始值之后不能被重新赋值,因此final修饰成员变量和修饰局部变量时有一定的不同. 5.4.1final成员变量 成员变量是随类初始化或对象初始化而初始化的, 当类初始化时,系统会为该类的类变量分配内存,并分配默认值: 当创建对象时,系统会为该对象的实例变量分配内存,并分配默认值. java语法规定:final修饰的成员变量必须由程序员显式地指定初始值 归纳: final修饰的类变量,实例变量 能指定初始值的地方