之前對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關於實例方法和靜態方法的文章,又有點困惑了。改天再想,先到這。