因為實在是寫的太好了,所以我貼過來
一秒看破 static
static 靜態 是個很奇妙的 關鍵字
早在 哈囉,世界 的時候就看到 static void Main() 這個 加了 static 關鍵字的方法
但是在真正了解 static 的意義卻又是很久以後的事了
最基本 也大家都知道的是
靜態的成員 不需要實體(Instance) 就能進行訪問
非靜態的成員 必須 new 一個 實體(Instance) 才能進行訪問
但這不算解釋 反而是混亂的開始
在單一使用者 單一執行 簡單功能 的情況下 這2種寫法 跑的結果一模一樣
這時就會有人覺得 那就都用靜態就好了呀 不用 new 多方便
但是隨即就嚐到苦頭 因為 靜態並非 沒有實體 而是只有一個實體 在程式執行之初就建立 並佔用記憶體位置 而且一直存在
當程式用上一堆靜態成員的時候 就造成不必要的記憶體浪費
但是現在硬體都不錯 也許這隱藏殺機不是那麼明顯 但是另一個問題就頭大囉
那就是牽一髮而動全身 靜態成員是唯一的 只要是宣告成 static 且同名的成員 都是共用一區記憶體位置
即使你這麼做
雖然 new 了三個物件 但是只要設定其中一個 其他三個 也會跟著改變
相對於 變數 屬性 這種顯而易見的差異 靜態方法 跟 非靜態方法 就顯得有些曖昧
靜態方法 屬於 類別所有
非靜態方法 屬於 實體所有
靜態方法 只能以類別名叫用 即使是 非靜態類別
非靜態方法 只能以實體叫用 所以 靜態類別 內無法有 非靜態方法 (靜態類別內一切都是靜態的)
從執行效能來看 靜態方法 比較好 因為是共用的 省去建立 跟 銷毀 物件的效能
但是也代表 靜態方法 永遠存在 不論這方法 會不會被執行
即使這樣說也很難判斷到底何時要用 靜態方法 何時不用
但是如果從物件導向的角度 - 封裝 出發 就很明確
例如一個公開的類別的 公開靜態方法 跟 公開非靜態方法 就有意義上的不同
公開的類別的公開靜態方法 即使不屬於此類別 也能叫用 因為都是公開的
公開的類別的公開非靜態方法 卻只能是 屬於此類別的 實體 才能叫用
例如一個公開類別名叫 男人 有個方法叫 站著小便
如果他是 非靜態方法 那麼可以確定 只有男人可以站著小便
如果他是 靜態方法 那就好玩了 就算是女人類別 也能 執行 男人.站著小便() 方法
好吧我知道這例子很鳥 或許真的有女人喜歡站著小便?!
那再舉一例吧 跟錢有關的 都比較有深刻體驗
例如一個公開類別名叫 我 有個方法叫 花光我的積蓄當月光仙子
如果他是 非靜態方法 那麼可以確定 只有我可以花光我的積蓄當月光仙子
如果他是 靜態方法 那就好玩了 就算是路人類別 也能 執行 我.花光我的積蓄當月光仙子() 方法
然後我的薪水就被花光了 而且花光的人 還不是我
WTF,怎麼每個聽起來都很可怕 那又什麼時候該用 靜態方法?
例如一個公開類別名叫 學生 有個方法叫 作弊
如果他是 靜態方法 那真棒 誰都可以幫助學生作弊
如果他是 非靜態方法 那有點糟 學生只能自立自強 備妥小抄望遠鏡
好吧我知道這例子很鳥 鼓吹作弊 違反社會善良風俗
例如一個公開類別名叫 我 有個方法叫 叫我起床
如果他是 靜態方法 那真棒 誰都可以叫我起床
如果他是 非靜態方法 那有點糟 只有我可以叫我自己起床 沒人幫的了我
原始網頁
http://weisnote.blogspot.com/2012/08/static.html
留言列表