屬性和索引可見性
C# 2.0 允許為屬性或索引器的 get 和 set 訪問器指定不同的可見性。例如,在通常情況下,可能想將 get 訪問器公開 為 public,而把 set 訪問器公開為 protected。為此,可以為 set 關鍵字添加 protected 可見性限定符。類似地,可以將索引器的 set 方法定義為 protected (請參見圖 12)。
當使用屬性可見性時有幾項規定。首先,應用在 set 或 get 上的可見性限定詞只能是此屬性本身可見性的嚴格子集。換句話說,如果 此屬性是 public,那麼您就可以指定 internal、protected、protected internal、private。如果此屬性可見性是 protected,就不能將 get 或 set 公 開為 public。此外,只能分別為 get 或 set 指定可見性,而不能同時為它們指 定可見性。
Figure 12Public Get and Protected Set
public class MyClass
{
public string this [int index]
{
get
{
return m_Names[index];
}
protected set
{
m_Names[index] = value;
}
}
string[] m_Names;
//Rest of the class
}
圖 12
靜態類
有些類只有靜態方法或靜態成員(靜態類),這是非常常見 的。在這種情況下,實例化這些類的對象沒有意義。例如,Monitor 類或類工廠 (例如 .Net 框架 1.1 中的 Activator 類)都是靜態類。在 C# 1.1 中,如果 想要阻止開發人員實例化類的對象,您可以只提供一個私有的默認構造函數。如 果沒有任何公共的構造函數,就不可以實例化類的對象:
public class MyClassFactory
{
private MyClassFactory()
{}
static public object CreateObject()
{...}
}
然而,因為 C# 編譯器仍然允許您添加實例成員(盡管可能從來都不 使用它們),所以是否在類中只定義靜態成員完全由您決定。C# 2.0 通過允許將 類限定為 static 來支持靜態類:
public static class MyClassFactory
{
static public T CreateObject<T>()
{...}
}
C# 2.0 編譯器不允許您將一個非靜態成員添 加到一個靜態類中,也不允許您創建此靜態類的實例,就好像它是一個抽象類一 樣。此外,您不能從一個靜態類派生子類。這就如同編譯器在靜態類定義中加入 了 abstract 和 sealed 一樣。注意,可以定義靜態類而不能定義靜態結構,並 且可以添加靜態構造函數。