巢狀類型 (C# 程式設計手冊)
在類別、結構或介面內所定義的類型,在 C# 中稱為巢狀型別。 例如:
public class Container
{
class Nested
{
Nested() { }
}
}
不論外部類型是 class、interface 或 struct,巢狀型別都會預設為 private;巢狀型別只能從包含的類型中存取。 在上述範例中,外部類型無法存取 Nested
類別。
您也可以指定存取修飾詞來定義巢狀型別的存取範圍,如下所示:
類別的巢狀型別可以是 public、protected、internal、protected internal、private 或 private protected。
不過,在 sealed 類別內部定義
protected
、protected internal
或private protected
巢狀類別會產生編譯器警告 CS0628「在 sealed 類別中已宣告新的 protected 成員」。此外請注意,若讓巢狀型別在外部可見,則會違反程式碼品質規則 CA1034「巢狀型別不應可見」。
下列範例會將 Nested
類別設為 public:
public class Container
{
public class Nested
{
Nested() { }
}
}
巢狀型別或內部類型可存取包含類型或外部類型。 若要存取包含類型,請將它當作引數傳遞至巢狀型別的建構函式。 例如:
public class Container
{
public class Nested
{
private Container? parent;
public Nested()
{
}
public Nested(Container parent)
{
this.parent = parent;
}
}
}
巢狀型別可以存取其包含型別可存取的所有成員。 它可存取包含型別的 private 和 protected 成員,包括任何繼承的 protected 成員。
在先前的宣告,Nested
類別的完整名稱為 Container.Nested
。 這是用來建立巢狀類別新執行個體的名稱,如下所示:
Container.Nested nest = new Container.Nested();