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

        當(dāng)前位置:雨林木風(fēng)下載站 > 技術(shù)開(kāi)發(fā)教程 > 詳細(xì)頁(yè)面

        VB.net是怎樣做到的(4、5)

        VB.net是怎樣做到的(4、5)

        更新時(shí)間:2022-05-01 文章作者:未知 信息來(lái)源:網(wǎng)絡(luò) 閱讀次數(shù):

        VB.net是怎樣做到的(三)——Handles和WithEvents

        VB除了可以用C#那樣的方法來(lái)處理事件響應(yīng)以外,還有從VB5繼承下來(lái)的獨(dú)特的事件處理方式——WithEvents。

        我喜歡稱(chēng)這種事件處理方式為靜態(tài)的事件處理,書(shū)寫(xiě)響應(yīng)事件的方法時(shí)就已經(jīng)決定該方法響應(yīng)的是哪一個(gè)事件,而C#則是在代碼中綁定事件的。比如下面這個(gè)最簡(jiǎn)單的例子:

        Public Class HandlerClass
        Public WithEvents MyObj As EventClass


        Private Sub MyObj_MyEvent(ByVal sender As Object, ByVal e As System.EventArgs) Handles MyObj.MyEvent
        MsgBox("hello")
        End Sub

        Public Sub New()
        MyObj = New EventClass
        End Sub
        End Class

        代碼中用到的EventClass是這樣的:

        Public Class EventClass
        Public Event MyEvent As EventHandler

        Protected Overridable Sub OnMyEvent(ByVal e As EventArgs)
        RaiseEvent MyEvent(Me, e)
        End Sub

        Public Sub Test()
        OnMyEvent(New EventArgs)
        End Sub
        End Class

        我們來(lái)復(fù)習(xí)一下,這段代碼隱式地給EventClass編寫(xiě)了兩個(gè)方法——Add_MyEvent(EventHandler)和Remove_MyEvent(EventHandler),實(shí)際上任何使用事件的上下文都是通過(guò)調(diào)用這兩個(gè)方法來(lái)綁定事件和解除綁定的。C#還允許你書(shū)寫(xiě)自己的事件綁定/解除綁定的代碼。

        那么WithEvents是怎么工作的呢?VB.net的編譯器在編譯時(shí)自動(dòng)將

        Public WithEvents MyObj As EventClass

        翻譯成下面這個(gè)過(guò)程:

        Private _MyObj As EventClass

        Public Property MyObj() As EventClass
        Get
        Return _MyObj
        End Get
        Set(ByVal Value As EventClass)

        If Not (Me._MyObj Is Nothing) Then
        RemoveHandler _MyObj.MyEvent, New EventHandler(AddressOf MyObj_MyEvent)
        End If

        Me._MyObj = Value

        If Me._MyObj Is Nothing Then Exit Property

        AddHandler _MyObj.MyEvent, New EventHandler(AddressOf MyObj_MyEvent)

        End Set
        End Property

        由此可見(jiàn),當(dāng)對(duì)WithEvents變量賦值的時(shí)候,會(huì)自動(dòng)觸發(fā)這個(gè)屬性以綁定事件。我們所用的大部分事件響應(yīng)都是1對(duì)1的,即一個(gè)過(guò)程響應(yīng)一個(gè)事件,所以這種WithEvents靜態(tài)方法是非常有用的,它可以顯著增強(qiáng)代碼可讀性,同時(shí)也讓VB.net中的事件處理非常方便,不像C#那樣離開(kāi)了窗體設(shè)計(jì)器就必須手工綁定事件。

        不過(guò)在分析這段IL的時(shí)候,我也發(fā)現(xiàn)了VB.net在翻譯時(shí)小小的問(wèn)題,就是ldarg.0出現(xiàn)得過(guò)多,這是頻繁使用Me或this的表現(xiàn),所以我們?cè)诰幋a過(guò)程中一定要注意,除了使用到Me/this本身引用以外,使用它的成員時(shí)不要帶上Me/this,比如Me.MyInt = 1就改成MyInt = 1,這樣的小習(xí)慣會(huì)為你帶來(lái)很大的性能收益。


        VB.net是怎樣做到的(四)——類(lèi)型轉(zhuǎn)換


        今天在www.aspx.cn看到了一篇帖子,看到wyhw大俠真的希望dotnet blog成為.NET的精品技術(shù)Blog。所以我也不能偷懶了,趕快學(xué)習(xí),并且多發(fā)技術(shù)帖子。
        回到正題來(lái),我今天在Visual Basic社區(qū)上看到在Visual Basic 2005中將加入一個(gè)新的運(yùn)算符——TryCast,相當(dāng)于C#的as運(yùn)算符。我一直希望VB有這樣一個(gè)運(yùn)算符,既然今天看到了,就順便研究一下VB和C#的類(lèi)型轉(zhuǎn)換。先說(shuō)VB,類(lèi)型轉(zhuǎn)換運(yùn)算符主要有CType和DirectCast。他們的用法幾乎一樣。我詳細(xì)比較了一下這兩個(gè)運(yùn)算符,得出以下結(jié)論:

        1、在轉(zhuǎn)換成引用類(lèi)型時(shí),兩者沒(méi)有什么區(qū)別,都是直接調(diào)用castclass指令,除非重載了類(lèi)型轉(zhuǎn)換運(yùn)算符(當(dāng)然VB.NET還不行,但我沒(méi)有VB 2005,所以沒(méi)法試驗(yàn))。

        2、轉(zhuǎn)換成值類(lèi)型時(shí),CType會(huì)調(diào)用VB指定的類(lèi)型轉(zhuǎn)換函數(shù)(如果有的話),比如將String轉(zhuǎn)換為Int32時(shí),就會(huì)自動(dòng)調(diào)用VisualBasic.CompilerServices.IntegerType.FromString,而將Object轉(zhuǎn)換為Int32則會(huì)調(diào)用FromObject。其他數(shù)值類(lèi)型轉(zhuǎn)換為Int32時(shí),CType也會(huì)調(diào)用類(lèi)型本身的轉(zhuǎn)換方法實(shí)施轉(zhuǎn)換。DirectCast運(yùn)算符則很簡(jiǎn)單,直接將對(duì)象拆箱成所需類(lèi)型。

        所以在用于值類(lèi)型時(shí),CType沒(méi)有DirectCast快速但可以支持更多的轉(zhuǎn)換。在C#中,類(lèi)型轉(zhuǎn)換則為(type)運(yùn)算符和as運(yùn)算符。(type)運(yùn)算符的工作方式與VB的DirectCast很相似,也是直接拆箱或castclass的,但是如果遇到支持的類(lèi)型轉(zhuǎn)換(如long到int),(type)運(yùn)算符也會(huì)調(diào)用相應(yīng)的轉(zhuǎn)換方法,但不支持從String到int的轉(zhuǎn)換。C#另一個(gè)運(yùn)算符as則更加智能,它只要判斷對(duì)象的運(yùn)行實(shí)例能否轉(zhuǎn)成目標(biāo)類(lèi)型,然后就可以省略castclass指令,直接按已知類(lèi)型進(jìn)行操作,而且編譯器還可以自動(dòng)對(duì)as進(jìn)行優(yōu)化,比如節(jié)省一個(gè)對(duì)象引用等。所以在將Object轉(zhuǎn)換成所需的類(lèi)型時(shí),as是最佳選擇。

        由于as有很多優(yōu)點(diǎn),Visual Basic 2005將這一特性吸收了過(guò)來(lái),用TryCast運(yùn)算符就可以獲得和as一樣的效果,而且語(yǔ)法與DirectCast或CType一樣。

        溫馨提示:喜歡本站的話,請(qǐng)收藏一下本站!

        本類(lèi)教程下載

        系統(tǒng)下載排行

        主站蜘蛛池模板: 亚洲丰满熟女一区二区哦| 丁香亚洲综合五月天婷婷| 国产aⅴ无码专区亚洲av| 日韩在线观看免费完整版视频| 性色av无码免费一区二区三区| 亚洲福利视频一区二区三区| 18禁无遮挡无码国产免费网站| 亚洲天堂中文字幕| 97热久久免费频精品99| 亚洲国产91在线| 日本一道高清不卡免费| 美女啪啪网站又黄又免费| 亚洲性日韩精品国产一区二区| 国产美女视频免费观看的网站| 亚洲人成影院在线观看 | 亚洲四虎永久在线播放| 久久综合国产乱子伦精品免费| 亚洲男人电影天堂| 最新中文字幕免费视频| 麻豆亚洲AV成人无码久久精品 | 亚洲爱情岛论坛永久| 最近的中文字幕大全免费8| 亚洲中文无码av永久| 日韩人妻无码免费视频一区二区三区 | 在线涩涩免费观看国产精品| 亚洲午夜久久久精品影院| 无码国产精品久久一区免费| 美女扒开尿口给男人爽免费视频| 久久亚洲精品无码观看不卡| 在线日本高清免费不卡| 亚洲欧洲无码AV不卡在线| 亚洲一级片免费看| 3344永久在线观看视频免费首页| 亚洲色无码专区一区| 亚洲中文字幕无码中文字在线| 131美女爱做免费毛片| www亚洲精品久久久乳| 亚洲av一综合av一区| 免费涩涩在线视频网| 精品国产免费一区二区三区香蕉| 亚洲色偷偷av男人的天堂|