new修饰符之详讲

C#中的关键字new可用作运算符和修饰符:

new 运算符   用于在堆上创建对象和调用构造函数。 new 修饰符   用于隐藏基类成员的继承成员。


这里要说得是new作为修饰符的作用。

以下内容都是摘之MSDN:

使用 new 修饰符显式隐藏从基类继承的成员。若要隐藏继承的成员,请使用相同名称在派生类中声明该成员,并用 new 修饰符修饰它。

请看下面的类:

None.gif public   class  MyBaseC 
ExpandedBlockStart.gifContractedBlock.gif
dot.gif {
InBlock.gif   
public int x;
ExpandedSubBlockStart.gifContractedSubBlock.gif   
public void Invoke() dot.gif{}
ExpandedBlockEnd.gif}

None.gif


在派生类中用 Invoke 名称声明成员会隐藏基类中的 Invoke 方法,即:
 

None.gif public   class  MyDerivedC : MyBaseC
ExpandedBlockStart.gifContractedBlock.gif
dot.gif {
ExpandedSubBlockStart.gifContractedSubBlock.gif   
new public void Invoke() dot.gif{}
ExpandedBlockEnd.gif}

None.gif

但是,因为字段 x 不是通过类似名隐藏的,所以不会影响该字段。

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

  • 引入类或结构中的常数、指定、属性或类型隐藏具有相同名称的所有基类成员。
  • 引入类或结构中的方法隐藏基类中具有相同名称的属性、字段和类型。同时也隐藏具有相同签名的所有基类方法。有关更多信息,请参见 。
  • 引入类或结构中的索引器将隐藏具有相同名称的所有基类索引器。

在同一成员上同时使用 newoverride 是错误的。

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

示例

在该例中,基类 MyBaseC 和派生类 MyDerivedC 使用相同的字段名 x,从而隐藏了继承字段的值。该例说明了 new 修饰符的使用。同时也说明了如何使用完全限定名访问基类的隐藏成员。
 

None.gif //  cs_modifier_new.cs
None.gif
//  The new modifier
None.gif
using  System;
None.gif
public   class  MyBaseC 
ExpandedBlockStart.gifContractedBlock.gif
dot.gif {
InBlock.gif   
public static int x = 55;
InBlock.gif   
public static int y = 22;
ExpandedBlockEnd.gif}

None.gif
None.gif
public   class  MyDerivedC : MyBaseC 
ExpandedBlockStart.gifContractedBlock.gif
dot.gif {
InBlock.gif   
new public static int x = 100;   // Name hiding
InBlock.gif
   public static void Main() 
ExpandedSubBlockStart.gifContractedSubBlock.gif   
dot.gif{
InBlock.gif      
// Display the overlapping value of x:
InBlock.gif
      Console.WriteLine(x);
InBlock.gif
InBlock.gif      
// Access the hidden value of x:
InBlock.gif
      Console.WriteLine(MyBaseC.x);
InBlock.gif
InBlock.gif      
// Display the unhidden member y:
InBlock.gif
      Console.WriteLine(y);
ExpandedSubBlockEnd.gif   }

ExpandedBlockEnd.gif}

None.gif


输出
100
55
22

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

The keyword new is required on 'MyDerivedC.x' because it hides inherited member 'MyBaseC.x'.

如果嵌套类型正在隐藏另一种类型,如下例所示,也可以使用 new 修饰符修改此嵌套类型。

示例

在该例中,嵌套类 MyClass 隐藏了基类中具有相同名称的类。该例不仅说明了如何使用完全限定名访问隐藏类成员,同时也说明了如何使用 new 修饰符消除警告消息。

 
None.gif //  cs_modifer_new_nested.cs
None.gif
//  Using the new modifier with nested types
None.gif
using  System;
None.gif
public   class  MyBaseC 
ExpandedBlockStart.gifContractedBlock.gif
dot.gif {
InBlock.gif   
public class MyClass 
ExpandedSubBlockStart.gifContractedSubBlock.gif   
dot.gif{
InBlock.gif      
public int x = 200;
InBlock.gif      
public int y;
ExpandedSubBlockEnd.gif   }

ExpandedBlockEnd.gif}

None.gif
None.gif
public   class  MyDerivedC : MyBaseC 
ExpandedBlockStart.gifContractedBlock.gif
dot.gif {
InBlock.gif   
new public class MyClass   // nested type hiding the base type members
ExpandedSubBlockStart.gifContractedSubBlock.gif
   dot.gif{
InBlock.gif      
public int x = 100;
InBlock.gif      
public int y; 
InBlock.gif      
public int z;
ExpandedSubBlockEnd.gif   }

InBlock.gif
InBlock.gif   
public static void Main() 
ExpandedSubBlockStart.gifContractedSubBlock.gif   
dot.gif{
InBlock.gif      
// Creating object from the overlapping class:
InBlock.gif
      MyClass S1  = new MyClass();
InBlock.gif
InBlock.gif      
// Creating object from the hidden class:
InBlock.gif
      MyBaseC.MyClass S2 = new MyBaseC.MyClass();
InBlock.gif
InBlock.gif      Console.WriteLine(S1.x);
InBlock.gif      Console.WriteLine(S2.x);   
ExpandedSubBlockEnd.gif   }

ExpandedBlockEnd.gif}

None.gif
输出

100
200

转载于:https://www.cnblogs.com/linuxSeek/archive/2005/03/04/113214.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值