程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> 更多編程語言 >> 更多關於編程 >> VB.NET局部靜態變量介紹

VB.NET局部靜態變量介紹

編輯:更多關於編程

      經過長時間學習VB.NET局部靜態變量,於是和大家分享一下,看完本文你肯定有不少收獲,希望本文能教會你更多東西。VB.NET能夠實現很多C#不能做到的功能,如When語句、Optional參數、局部Static變量、對象實例訪問靜態方法、Handles綁定事件、On Error處理異常、Object直接後期綁定等等。VB和C#同屬.NET的語言,編譯出來的是同樣的CIL,但為什麼VB支持很多有趣的特性呢。我們一起來探究一下VB.NET局部靜態變量。

      VB.NET局部靜態變量

      VB支持用Static關鍵字聲明局部變量,這樣在過程結束的時候可以保持變量的數值:

      Public Sub Test1() Static i As Integer i += 1 '實現一個過程調用計數器 End Sub

      我們實現了一個簡單的過程計數器。每調用一次Test,計數器的數值就增加1。其實還有很多情況我們希望保持變量的數值。而C#的static是不能用在過程內部的。因此要實現過程計數器,我們必須聲明一個類級別的變量。這樣做明顯不如VB好。因為無法防止其他過程修改計數器變量。這就和對象封裝一個道理,本來應該是一個方法的局部變量,現在我要被迫把它獨立出來,顯然是不好的設計。那麼VB是怎麼生成局部靜態變量的呢?將上述代碼返匯編,我們可以清楚地看到在VB生成的CIL中,i不是作為局部變量,而是作為類的Field出現的:

      .field private specialname int32 $STATIC$Test1$2001$i

      也就是說,i被改名作為一個類的字段,但被冠以specialname。在代碼中試圖訪問$STATIC$Test1$2001$i是不可能的,因為它不是一個有效的標識符。但是在IL中,將這個變量加一的代碼卻與一般的類字段完全一樣,是通過ldfld加載的。我覺得這個方法十分聰明,把靜態變量變成生命周期一樣的類字段,但是又由編譯器來控制訪問的權限,讓它成為一個局部變量。同時也解釋了VB為什麼要用兩個不同的關鍵字來聲明靜態變量—— Static和Shared。

      由於VB.NET局部靜態變量的實質是類的字段,所以它和真正的局部變量還是有所不同的。比如在多線程條件下,對VB.NET局部靜態變量的訪問就和訪問字段相同。

    1. 上一頁:
    2. 下一頁:
    Copyright © 程式師世界 All Rights Reserved