C#static

愛笑的小宇宙發表於2019-02-14
有時候寫程式時常常遇到這樣的情況:
 
1、定義了變數和方法不知道什麼時候該加上static修飾符。
2、static變數和方法與非static變數和方法有什麼區別?
3、在一個類的靜態方法裡為什麼不能訪問該類的非靜態成員變數和方法?
4、在一個類的非靜態方法中為什麼可以訪問該類的靜態變數和方法?
5、在靜態方法中為什麼不能用this?
6、靜態建構函式有什麼作用?
 
基於以上問題,我發表自己的看法如下:
 
1、static變數及方法不用例項化物件就可以用類名.靜態變數和類名.靜態方法這種方式進行訪問,這使得訪問更加方便,不用手工例項化物件。對於某些只讀變數和方法來說很適合共享。
2、static與非static最大的區別就是static型別的變數及方法在呼叫的時候就在記憶體中分配了地址,且這個地址只有一份,故static可以直接訪問。而非static必需手工去例項化該類,以物件的方式去訪問變數和方法。
3、在一個靜態方法裡去訪問該類的非靜態變數或方法,由於static是屬於類本身的,是在類被呼叫的時候,static型別就已經生成,而非static此時並沒有生成,它不屬於這個類本身,它是屬於這個類的物件。故在沒有例項化成物件的時候,在靜態方法中訪問非靜態是根本找不到它們的,它不屬於這個類。
4、在非靜態方法中去訪問靜態,由於類被呼叫時,靜態變數和方法就已經生成,也就是說它們屬於這個類。既然已經存在,故不管是在靜態方法中,還是非靜態方法中都可以訪問到它們。
5、this表明物件本身,而在靜態方法中並沒有物件概念存在,它只有類本身這個概念,它和物件是屬於兩種互拆的狀態,即我中無你,你中無我的情況。也就是說你用物件名.靜態變數或物件名.靜態方法是不可訪問的。
6、每個類都必須有建構函式,否則此類無法例項化成物件。而我們有時定義的類可以不寫它的建構函式,這是因為編譯器會幫我們加上一個靜態的空建構函式。這樣才能例項化。也可以用靜態建構函式去初始化靜態變數。