• <label id="pxtpz"><meter id="pxtpz"></meter></label>
      1. <span id="pxtpz"><optgroup id="pxtpz"></optgroup></span>

        當前位置:雨林木風下載站 > 技術開發教程 > 詳細頁面

        VB.net是怎樣做到的(一、二)

        VB.net是怎樣做到的(一、二)

        更新時間:2022-05-01 文章作者:未知 信息來源:網絡 閱讀次數:

        VB.net是怎樣做到的(一)

        VB.net能夠實現很多C#不能做到的功能,如When語句、Optional參數、局部Static變量、對象實例訪問靜態方法、Handles綁定事件、On Error處理異常、Object直接后期綁定等等。VB和C#同屬.net的語言,編譯出來的是同樣的CIL,但為什么VB支持很多有趣的特性呢。我們一起來探究一下。

        首先是局部Static變量。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支持一項很有意思的功能——MyClass。大部分人使用MyClass可能僅限于調用本類其他構造函數時。其實MyClass可以產生一些很獨特的用法。MyClass永遠按類的成員為不可重寫的狀態進行調用,即當類的方法被重寫后,用MyClass仍能得到自身的版本。下面這個例子和VB幫助中所舉的例子非常相似

        Public Class MyClassBase
        Protected Overridable Sub Greeting()
        Console.WriteLine("Hello form Base")
        End Sub

        Public Sub UseMe()
        Me.Greeting()
        End Sub

        Public Sub UseMyClass()
        MyClass.Greeting()
        End Sub
        End Class

        Public Class MyClassSub
        Inherits MyClassBase

        Protected Overrides Sub Greeting()
        Console.WriteLine("Hello form Sub")
        End Sub
        End Class

        我們用一段代碼來測試:

        Dim o As MyClassBase = New MyClassSub()

        o.UseMe()
        o.UseMyClass()

        結果是UseMe執行了子類的版本,而UseMyClass還是執行了基類本身的版本,盡管這是一個虛擬方法。觀其IL,可以看到其簡單的實現原理:

        Me用的調用指令是callvirt

        IL_0001: callvirt instance void App1.MyClassBase::Greeting()

        而MyClass調用的是call

        IL_0001: call instance void App1.MyClassBase::Greeting()

        奇怪的是,如此簡單的一個功能,我竟然無法用C#實現,C#怎樣也不允許我按非虛函數的方式調用一個虛函數。C++可以用類名::方法名的方式訪問自身版本的函數,但C#的類名只能用來訪問靜態的成員。這真是C#一個奇怪的缺陷。

        溫馨提示:喜歡本站的話,請收藏一下本站!

        本類教程下載

        系統下載排行

        主站蜘蛛池模板: 91大神在线免费观看| 国产精品成人免费视频网站京东 | 国产禁女女网站免费看| 青青青国产免费一夜七次郎| 永久中文字幕免费视频网站| 亚洲?v女人的天堂在线观看| 亚洲人成精品久久久久| 亚洲天堂一区二区三区| 国产亚洲午夜精品| 四虎永久精品免费观看| 国产日韩亚洲大尺度高清| 亚洲精品不卡视频| 免费毛片a在线观看67194| 免费一级大黄特色大片| 久久精品国产精品亚洲蜜月| 在线综合亚洲欧洲综合网站| caoporn国产精品免费| 久久笫一福利免费导航| 国产AV无码专区亚洲AV漫画| 亚洲精品国产福利在线观看| 另类图片亚洲校园小说区| 久艹视频在线免费观看| 国产又黄又爽又刺激的免费网址 | 亚洲中文字幕无码久久精品1| 亚洲AV日韩AV天堂一区二区三区 | 一个人免费播放在线视频看片| 久久午夜伦鲁片免费无码| 美女黄网站人色视频免费国产| 亚洲大成色www永久网站| 天天综合亚洲色在线精品| 777成影片免费观看| 日韩一卡2卡3卡4卡新区亚洲| 中文字幕 亚洲 有码 在线| 免费h视频在线观看| 亚洲av高清在线观看一区二区| 亚洲欧洲日产韩国在线| aa在线免费观看| 亚洲av永久综合在线观看尤物 | 午夜视频在线免费观看| 亚洲美日韩Av中文字幕无码久久久妻妇| selaoban在线视频免费精品|