共用方式為


新修飾詞 (C# 參考)

當做宣告修飾詞使用時, new 關鍵詞會明確隱藏繼承自基類的成員。 當您隱藏繼承的成員時,成員的衍生版本會取代基類版本。 這假設成員的基類版本是可見的,因為如果成員標示為 private 或,在某些情況下 internal,它已經隱藏。 雖然您可以在不使用 修飾詞的情況下new隱藏publicprotected成員,但會收到編譯程式警告。 如果您使用 new 明確隱藏成員,則會隱藏此警告。

您也可以使用 new 關鍵詞來 建立型別的實例 ,或做為 泛型型別條件約束

若要隱藏繼承的成員,請使用相同的成員名稱在衍生類別中宣告它,並使用 關鍵詞加以修改 new 。 例如:

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

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

透過繼承隱藏的名稱會採用下列其中一種形式:

  • 一般而言,類別或結構中引進的常數、欄位、屬性或類型會隱藏共用其名稱的所有基類成員。 有特殊情況。 例如,如果您宣告名稱為的新欄位 N 具有不可叫用的類型,而基底類型宣告 N 為方法,則新字段不會隱藏基底宣告的調用語法。 如需詳細資訊,請參閱 C# 語言規格的成員查閱一節。

  • 類別或結構中引進的方法會隱藏在基類中共用該名稱的屬性、欄位和類型。 它也會隱藏具有相同簽章的所有基類方法。

  • 類別或結構中引進的索引器會隱藏具有相同簽章的所有基類索引器。

因為兩個修飾詞具有互斥的意義,所以在同 new 一個成員上使用 和 覆寫 是錯誤的。 修飾 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# 語言規格的新修飾詞一節。

另請參閱