Share via


new 修飾詞 (C# 參考)

當 new 關鍵字做為修飾詞時,會明確隱藏繼承自基底類別的成員。 當您隱藏繼承的成員時,該成員的衍生版本就會取代基底類別版本。 雖然您可以不用 new 修飾詞來隱藏成員,但是這樣會產生警告。 如果您使用 new 來明確隱藏成員,此關鍵字就會隱藏這類警告,並會記錄企圖使用衍生版本做為替代的事實。

若要隱藏繼承的成員,請在衍生類別 (Derived Class) 中使用相同名稱為其宣告,並且以 new 修飾詞加以修飾。 例如:

public class BaseC
{
    public int x;
    public void Invoke() { }
}
public class DerivedC : BaseC
{
    new public void Invoke() { }
}

在此範例中,BaseC.Invoke 是由 DerivedC.Invoke 加以隱藏。 x 欄位不會受到影響,因為它不是由類似的名稱所隱藏。

經由繼承 (Inheritance) 進行名稱隱藏可採取下列之一種格式:

  • 類別或結構所引入的常數、欄位、屬性或型別可隱藏所有具相同名稱的基底類別成員。

  • 類別或結構所引入的方法可隱藏基底類別中具相同名稱的屬性、欄位和型別。 它也可隱藏所有具相同簽章 (Signature) 的基底類別成員。

  • 類別或結構所引入的索引子可隱藏所有具相同簽章的基底類別成員。

在相同的成員上同時使用 new 和 override 會造成錯誤,這是因為這兩個修飾詞在意義上是互斥 (Mutually Exclusive) 的。 new 修飾詞會以相同名稱建立新成員,並使原始成員變為隱藏。 override 修飾詞會擴充繼承成員的實作。

在未隱藏繼承的成員之宣告中使用 new 修飾詞會產生警告。

範例

在這個範例中,基底類別 BaseC 以及衍生類別 DerivedC 會使用相同的欄位名稱 x,而該欄位會隱藏繼承之欄位的值。 範例中示範了 new 修飾詞的用法。 同時還示範如何使用完整限定名稱存取基底類別的隱藏成員。

public class BaseC
{
    public static int x = 55;
    public static int y = 22;
}

public class DerivedC : BaseC
{
    // Hide field 'x'.
    new public static int x = 100;

    static void Main()
    {
        // Display the new value of x:
        Console.WriteLine(x);

        // Display the hidden value of x:
        Console.WriteLine(BaseC.x);

        // Display the unhidden member y:
        Console.WriteLine(y);
    }
}
/*
Output:
100
55
22
*/

在這個範例中,巢狀類別會隱藏基底類別中具有相同名稱的類別。 此範例會示範如何使用 new 修飾詞來消除警告訊息,以及如何使用隱藏類別成員的完整限定名稱來對其進行存取。

public class BaseC 
{
    public class NestedC 
    {
        public int x = 200;
        public int y;
    }
}

public class DerivedC : BaseC 
{
    // Nested type hiding the base type members.
    new public class NestedC   
    {
        public int x = 100;
        public int y; 
        public int z;
    }

    static void Main() 
    {
        // Creating an object from the overlapping class:
        NestedC c1  = new NestedC();

        // Creating an object from the hidden class:
        BaseC.NestedC c2 = new BaseC.NestedC();

        Console.WriteLine(c1.x);
        Console.WriteLine(c2.x);   
    }
}
/*
Output:
100
200
*/

如果您移除 new 修飾詞,程式仍然可以編譯和執行,但會得到下列警告:

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

C# 語言規格

如需詳細資訊,請參閱 C# 語言規格。語言規格是 C# 語法和用法的限定來源。

請參閱

參考

C# 關鍵字

運算子關鍵字 (C# 參考)

修飾詞 (C# 參考)

使用 Override 和 New 關鍵字進行版本控制 (C# 程式設計手冊)

了解使用 Override 和 New 關鍵字的時機 (C# 程式設計手冊)

概念

C# 程式設計手冊

其他資源

C# 參考