經過長時間學習VBNET局部靜態變量於是和大家分享一下看完本文你肯定有不少收獲希望本文能教會你更多東西VBNET能夠實現很多C#不能做到的功能如When語句Optional參數局部Static變量對象實例訪問靜態方法Handles綁定事件On Error處理異常Object直接後期綁定等等VB和C#同屬NET的語言編譯出來的是同樣的CIL但為什麼VB支持很多有趣的特性呢我們一起來探究一下VBNET局部靜態變量
VBNET局部靜態變量
VB支持用Static關鍵字聲明局部變量這樣在過程結束的時候可以保持變量的數值
Public Sub Test() Static i As Integer i += 實現一個過程調用計數器 End Sub
我們實現了一個簡單的過程計數器每調用一次Test計數器的數值就增加其實還有很多情況我們希望保持變量的數值而C#的static是不能用在過程內部的因此要實現過程計數器我們必須聲明一個類級別的變量這樣做明顯不如VB好因為無法防止其他過程修改計數器變量這就和對象封裝一個道理本來應該是一個方法的局部變量現在我要被迫把它獨立出來顯然是不好的設計那麼VB是怎麼生成局部靜態變量的呢?將上述代碼返匯編我們可以清楚地看到在VB生成的CIL中i不是作為局部變量而是作為類的Field出現的
field private specialname int $STATIC$Test$$i
也就是說i被改名作為一個類的字段但被冠以specialname在代碼中試圖訪問$STATIC$Test$$i是不可能的因為它不是一個有效的標識符但是在IL中將這個變量加一的代碼卻與一般的類字段完全一樣是通過ldfld加載的我覺得這個方法十分聰明把靜態變量變成生命周期一樣的類字段但是又由編譯器來控制訪問的權限讓它成為一個局部變量同時也解釋了VB為什麼要用兩個不同的關鍵字來聲明靜態變量—— Static和Shared
由於VBNET局部靜態變量的實質是類的字段所以它和真正的局部變量還是有所不同的比如在多線程條件下對VBNET局部靜態變量的訪問就和訪問字段相同
From:http://tw.wingwit.com/Article/program/net/201311/13413.html