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

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

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

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

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

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

        VB除了可以用C#那樣的方法來處理事件響應以外,還有從VB5繼承下來的獨特的事件處理方式——WithEvents。

        我喜歡稱這種事件處理方式為靜態的事件處理,書寫響應事件的方法時就已經決定該方法響應的是哪一個事件,而C#則是在代碼中綁定事件的。比如下面這個最簡單的例子:

        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

        我們來復習一下,這段代碼隱式地給EventClass編寫了兩個方法——Add_MyEvent(EventHandler)和Remove_MyEvent(EventHandler),實際上任何使用事件的上下文都是通過調用這兩個方法來綁定事件和解除綁定的。C#還允許你書寫自己的事件綁定/解除綁定的代碼。

        那么WithEvents是怎么工作的呢?VB.net的編譯器在編譯時自動將

        Public WithEvents MyObj As EventClass

        翻譯成下面這個過程:

        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

        由此可見,當對WithEvents變量賦值的時候,會自動觸發這個屬性以綁定事件。我們所用的大部分事件響應都是1對1的,即一個過程響應一個事件,所以這種WithEvents靜態方法是非常有用的,它可以顯著增強代碼可讀性,同時也讓VB.net中的事件處理非常方便,不像C#那樣離開了窗體設計器就必須手工綁定事件。

        不過在分析這段IL的時候,我也發現了VB.net在翻譯時小小的問題,就是ldarg.0出現得過多,這是頻繁使用Me或this的表現,所以我們在編碼過程中一定要注意,除了使用到Me/this本身引用以外,使用它的成員時不要帶上Me/this,比如Me.MyInt = 1就改成MyInt = 1,這樣的小習慣會為你帶來很大的性能收益。


        VB.net是怎樣做到的(四)——類型轉換


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

        1、在轉換成引用類型時,兩者沒有什么區別,都是直接調用castclass指令,除非重載了類型轉換運算符(當然VB.NET還不行,但我沒有VB 2005,所以沒法試驗)。

        2、轉換成值類型時,CType會調用VB指定的類型轉換函數(如果有的話),比如將String轉換為Int32時,就會自動調用VisualBasic.CompilerServices.IntegerType.FromString,而將Object轉換為Int32則會調用FromObject。其他數值類型轉換為Int32時,CType也會調用類型本身的轉換方法實施轉換。DirectCast運算符則很簡單,直接將對象拆箱成所需類型。

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

        由于as有很多優點,Visual Basic 2005將這一特性吸收了過來,用TryCast運算符就可以獲得和as一樣的效果,而且語法與DirectCast或CType一樣。

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

        本類教程下載

        系統下載排行

        主站蜘蛛池模板: 亚洲第一视频在线观看免费| 免费鲁丝片一级观看| 久久亚洲色一区二区三区| 色天使亚洲综合一区二区| 丁香花免费完整高清观看| 亚洲精品动漫在线| 4455永久在线观免费看| 亚洲精品网站在线观看你懂的| 秋霞人成在线观看免费视频| 久久噜噜噜久久亚洲va久| 免费A级毛片在线播放| 久久精品国产亚洲AV嫖农村妇女 | 国产成人精品日本亚洲语音| 国产精品无码免费视频二三区 | 亚洲午夜国产精品无卡| 青娱分类视频精品免费2| 亚洲人成图片网站| 日韩成人免费aa在线看| 一区二区三区免费在线视频| 在线观看亚洲天天一三视| 免费视频精品一区二区三区| 亚洲第一成年人网站| 好男人视频社区精品免费| 免费的黄色的网站| 精品久久香蕉国产线看观看亚洲| 免费国产叼嘿视频大全网站 | 国产亚洲一区二区在线观看| 男人进去女人爽免费视频国产| 亚洲韩国在线一卡二卡| 午夜电影免费观看| 久久久WWW免费人成精品| 亚洲激情中文字幕| 日本高清免费网站| 成人久久免费网站| 久久亚洲精品国产精品婷婷| 久久亚洲国产精品123区| 可以免费看的卡一卡二| 一级做a爰全过程免费视频毛片| 亚洲AV成人无码久久精品老人| 国产在线国偷精品产拍免费| 国产免费MV大全视频网站|