1. 程式人生 > >CLR via C#學習筆記-第六章-靜態類

CLR via C#學習筆記-第六章-靜態類

eth clas cme rop () 接口 bstr field icm

6.4 靜態類

有一些永遠不需要實例化的類,例如Console,Math等。

這些類只有static成員。事實上,這種類的唯一作用就是組合一組相關的成員。

例如Math類就定義了一組執行數學運算的方法。

在C#中,要用static關鍵字定義不可實例化的類。該關鍵字只能用於類,不能用於結構(值類型)。

因為CLR總是允許值類型實例化,這是沒辦法阻止的。

C#編譯器對靜態類進行了如下限制。

  • 靜態類必須直接從街壘System.Object派生,從其他任何基類派生都沒有意義。繼承只適用於對象,而你不能創建靜態類的實例。
  • 靜態類不能實現任何接口,只有使用類的實例時,才可調用類的接口方法。
  • 靜態類只能定義靜態成員(字段,方法,屬性,事件),任何實例成員都會導致編譯器報錯。
  • 靜態類不能作為字段、方法參數或局部變量使用,因為他們都代表引用了實例的變量,不允許,會報錯。

下面是一個定義了靜態成員的靜態類。代碼雖然能通過編譯,有一個警告,但該類沒有做任何有意義的事情。

public static class AStaticClass
{
    public static void AStaticMethod(){}
    public static String AStaticProperty()
    {
        get{return s_AStaticField;}
        set{s_AStaticField=value;}
    }
    
private static String s_AStaticField; public static event EventHandler AStaticEvent; }

使用關鍵字static定義類,將導致C#編譯器將該類標記為abstract和sealed。

此外,編譯器不在類型中生成實例構造器方法。

CLR via C#學習筆記-第六章-靜態類