C# static


之前對static一直有點困惑,看了忘,忘了看,其實是很基本的知識了,百度百科對static總結的非常具體全面,http://baike.baidu.com/link?url=XUDwsH_upXsWuGOPoRONNoYVgby_Ws_BtRbCiKP0oZyFG0qz0JkB9nyr66RJOguo還有一部分總結來源於《Visual C# 2010從入門到精通》,個人感覺這本書很好。

自己在這里再整理一下思緒,就當復習了。

1.靜態變量(VS 非靜態變量)//原文稱面向過程的static

特點   靜態全局變量 全局變量      靜態局部變量 局部變量    
作用域

聲明它的整個文件;

不能被其他文件所用,即使using 相同的namespace

其他文件可定義相同名字的變量,不會發生沖突

整個工程

始終駐留在全局數據區,直到程序運行結束;

但作用域為局部作用域,當定義它的函數或

語句塊結束時,其作用域隨之結束

聲明它的函數體:程序運行到

該句會給局部變量分配棧內存,

程序退出函數體時,系統收回棧內存

內存分配   存放於全局數據區:堆heap 存放於全局數據區:堆heap 存放於全局數據區:堆heap 棧stack
其他特點    

1被首次初始化之后,以后的函數調用不再

進行初始化

2.一般在聲明處初始化,若沒有顯式初始化

會被程序自動初始化為0

C#不允許未賦值的局部變量

PS:const字段也是靜態字段,但聲明時不使用static關鍵字

2. 靜態函數

靜態函數只能在聲明它的文件當中可見,不能被其它文件使用;其它文件中可以定義相同名字的函數,不會發生沖突。

3. 面向對象的static,只針對C#

  • 如果把一個方法或字段聲明為static,就可以使用類名來調用方法或訪問字段。
  • 在static方法中,不能訪問類中定義的任何非實例字段,只能訪問static字段;只能直接調用類中其他的static方法,非static方法要求先創建一個對象,然后才能在那個對象上調用非static方法。

4. static的作用(我認為是百科整篇精華的地方)

  • 隱藏(the most important)

         同時編譯多個文件時,所有未見static的全局變量和函數都具有全局可見性,但是不論函數還是變量,當加上static修飾符時,就會對其它源文件隱藏,作用域僅在聲明它們的文件中。對於變量來說,還有以下兩個作用。

  • 保持變量內容的持久

         存儲在靜態數據區的變量會在程序剛開始運行時就完成初始化,也是唯一的一次初始化。又因為static變量存放在靜態存儲區(堆),所以static可以控制變量的可見范圍。

  • 默認初始化為0。根據百科中講到,全局變量也具備這一屬性,因為全局變量也存儲在靜態存儲區中。在靜態數據區,內存中所有的字節默認值都是0X00。有些情況下會給編程帶來方便

再P了個S:據我目前所知,C#中的入口函數都必須是static的,因為刪掉static關鍵字會報錯:project'...' does not contain a static 'Main' method suitable for an entry point. 了解完static的特性之后就比較好解釋這個問題了。根據上面第3點,當把方法聲明為static時,該方法可以被直接調用,而不需要進行實例化。C#中的Main()方法也是包含在一個class中的,它是整個project的入口函數,在它之前沒有任何代碼能夠去對它實例化,所以就有必要使用一個不需要實例化就能執行程序的方法。至於靜態方法為什么不需要實例化,我覺得和內存分配方式有關,但是看了一篇http://www.cnblogs.com/chinhr/archive/2008/04/03/1135561.html關於實例方法和靜態方法的文章,又有點困惑了。改天再想,先到這。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM