從Main函數引發的static思考

從Main函數引發的static思考
關鍵詞: Main    static    const    readonly                                          

   Main()函數在C#裏非常特殊,它是編譯器規定的所有可執行程序的入口點。由於其特殊性,對Main()函數我們有以下幾條準則:
Main()函數必須封裝在類或結構裏來提供可執行程序的入口點。C#採用了完全的面向對象的編程方式,C#中不可以有像C++那樣的全局函數。
 
Main()函數必須爲靜態函數(static)。這允許C#不必創建實例對象即可運行程序。
 
Main()函數保護級別沒有特殊要求, public,protected,private等都可,但一般我們都指定其爲public。
 
Main()函數名的第一個字母要大寫,否則將不具有入口點的語義。C#是大小寫敏感的語言。
 
Main()函數的參數只有兩種參數形式:無參數和string 數組表示的命令行參數,即static
 void Main()或static void Main(string[]args) ,後者接受命令行參數。一個C#程序中只能有一個Main()函數入口點。其他形式的參數不具有入口點語義,C#不推薦通過其他參數形式重載Main()函數,這會引起編譯警告。
 
Main()函數返回值只能爲void(無類型)或int(整數類型)。其他形式的返回值不具有入口點語義。

  在C#中,static變量表示該變量屬於類,而不是類的實例。"static"修飾符聲明一個靜態元素,而該元素屬於類型本身而不是指定的對象,可以說是該類的所有實例共享一個static變量。

  看看什麼是 static class 吧,剛開始我就爲不能聲明一個 abstract sealed class
而苦惱不已,abstract 和 sealed一起用?定義abstract的目的就是抽象基類,seal表示不能繼承的實體類,完全是兩回事,怎麼可能一起用呢?abstract表明必須要被繼承,sealed表明不可以被繼承,這兩個是矛盾的,怎麼可以一起用呢。

  通過查看 IL 代碼,我們會發現 static class 實際上就是 abstract sealed class,
只不過編譯器在編譯時順便對 static class 的成員修飾符進行檢查而已。讓我們再來猜測一下 MS 開發人員的想法:他們的目的是想獲得 abstract sealed class 的效果,但卻爲語義上的矛盾而苦惱不已,大家想獲得一個優美的解決方式,於是就爲 C 2.0 新增了一個 static 關鍵字,完美的解決了這個問題。

  也許有人會問:爲什麼不是 static class = abstract class + static member limit
而要加上 sealed 的限制呢?理由是繼承一個只有 static 成員的類和重新寫一個類完
全沒有區別。爲什麼這麼說呢?因爲 static 必然是not virtual,繼承它又能有什麼
用呢?

  static class 還有一個限制,那就是隻能從 System.Object 繼承,爲什麼會有這個限
制,理由和上面差不多。

  每每提到 static 關鍵字,我就想起了 static constructor,感謝 MS 的開發人員提
供了這麼好的一個特性。但是 C 提供了 static constructor 卻沒有提供static destructor,不過在 Applied Microsoft .NET Framework Programming 一書中
Jeffery Richter 給我們提供了一個辦法就是通過 System.AppDomain.DomainUnload
事件去達到同樣的效果。使用 static constructor 要注意的就是這裏拋出任何異常都會導致該類型在重新加載AppDoamin 之前不再可用,所以要加倍小心,另外 static contructor 中很容易有兩個類型死鎖的情況發生,在編寫代碼的時候一定要想清楚。
 
  const與 readonly的區別 const==static readonly

   const 的概念就是一個包含不能修改的值的變量。
常數表達式是在編譯時可被完全計算的表達式。因此不能從一個變量中提取的值來初始化常量。如果 const int a = b+1;b是一個變量,顯然不能再編譯時就計算出結果,所以常量是不可以用變量來初始化的。

 readonly 允許把一個字段設置成常量,但可以執行一些運算,可以確定它的初始值。
因爲 readonly 是在計算時執行的,當然它可以用某些變量初始化。
readonly 是實例成員,所以不同的實例可以有不同的常量值,這使readonly更靈活。

readonly 關鍵字與 const 關鍵字不同。

1. const 字段只能在該字段的聲明中初始化。
readonly 字段可以在聲明或構造函數中初始化。因此,根據所使用的構造函數,readonly 字段可能具有不同的值。
2. const 字段是編譯時常數,而 readonly 字段可用於運行時常數。
3. const 默認就是靜態的,而 readonly 如果設置成靜態的就必須顯示聲明。
4.const 對於引用類型的常數,可能的值只能是 string 和 null。
readonly可以是任何類型

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章