c#中main函數為什麼要static

來源:互聯網
上載者:User

標籤:static

  假設沒有static關鍵字,那意味著需要用產生一個執行個體後才可以調用這個main方法,而main方法是程式進入點,你沒有進入main方法,自然無法產生一個執行個體,既然沒有執行個體,那就無法調用main函數,豈不矛盾?所以main函數被設定為static.

  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可以是任何類型

  ----------------------------

  非靜態成員又稱執行個體成員,必須作用於執行個體。在程式剛開始啟動並執行時候,未建立任何執行個體,因此無法調用執行個體成員,包括非靜態Main方法。為了能夠在程式的開始執行Main方法,必須將其聲明為靜態。

  順便說明,在Main方法中調用的成員也必須是靜態,除非建立過相應的執行個體。

  例如:

  namespace lover_P.Test {

  public class Test {

  public void InstanceMethod() {} // 執行個體成員(非靜態)

  public static void StaticMethod {} // 類型成員(靜態)

  public static void Main() {

  InstanceMethod(); // 錯誤!調用了執行個體成員,而此時並沒有建立執行個體

  StaticMethod(); // 正確!可以調用靜態成員

  Test SomeTest = new Test(); // 建立本類型的一個執行個體

  SomeTest.InstanceMethod(); // 再在這個執行個體上調用執行個體成員就對了

  SomeTest.StaticMethod(); // 附加一句,在執行個體上調用靜態成員也是錯誤的!

  }

  }

  }

 

c#中main函數為什麼要static

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.