new修饰符之详讲

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

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

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

    以下内容都是摘之MSDN:

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

    请看下面的类:

    public class MyBaseC 
    {
       
    public int x;
       
    public void Invoke() {}
    }


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

    public class MyDerivedC : MyBaseC
    {
       
    new public void Invoke() {}
    }

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

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

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

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

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

    示例

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

    // cs_modifier_new.cs
    // The new modifier
    using System;
    public class MyBaseC 
    {
       
    public static int x = 55;
       
    public static int y = 22;
    }


    public class MyDerivedC : MyBaseC 
    {
       
    new public static int x = 100;   // Name hiding
       public static void Main() 
       
    {
          
    // Display the overlapping value of x:
          Console.WriteLine(x);

          
    // Access the hidden value of x:
          Console.WriteLine(MyBaseC.x);

          
    // Display the unhidden member y:
          Console.WriteLine(y);
       }

    }


    输出

    100
    55
    22

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

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

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

    示例

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

     
    // cs_modifer_new_nested.cs
    // Using the new modifier with nested types
    using System;
    public class MyBaseC 
    {
       
    public class MyClass 
       
    {
          
    public int x = 200;
          
    public int y;
       }

    }


    public class MyDerivedC : MyBaseC 
    {
       
    new public class MyClass   // nested type hiding the base type members
       {
          
    public int x = 100;
          
    public int y; 
          
    public int z;
       }


       
    public static void Main() 
       
    {
          
    // Creating object from the overlapping class:
          MyClass S1  = new MyClass();

          
    // Creating object from the hidden class:
          MyBaseC.MyClass S2 = new MyBaseC.MyClass();

          Console.WriteLine(S1.x);
          Console.WriteLine(S2.x);   
       }

    }

    输出

    100
    200
    

    posted on 2005-03-04 20:46  linuxSeek  阅读(738)  评论(0编辑  收藏  举报