天天看點

VB.NET子產品的總結(一)

Option Explicit On

'預設就是on,意思是變量必須聲明(一般用Dim聲明變量),不聲明編譯就會出錯

'Option Explicit 語句:

'用于在檔案級強制對該檔案中的所有變量進行顯式聲明。

'Option Explicit { On | Off }

'各部分說明

'On 

'可選。啟用 Option Explicit 檢查。如果在 Option Explicit 語句後沒有指定 On 或 Off,則預設為 On。 

'Off 

'可選。禁用 Option Explicit 檢查。 

'備注

'如果使用,則 Option Explicit 語句必須出現在檔案中其他所有源語句之前。

'當 Option Explicit 出現在檔案中時,必須使用 Dim、Private、Public 或 ReDim 語句顯式聲明所有變量。試圖使用未聲明的變量名将發生編譯時錯誤。

'如果沒有使用 Option Explicit 語句,則所有未聲明的變量都是 Object 類型。

'注意   使用 Option Explicit 可避免拼錯現有變量的名稱,或避免在變量範圍不清楚的代碼中産生混淆。如果代碼中沒有指定 Option Explicit,編譯器的預設設定将是 Option Explicit On。 

'示例

'本示例使用 Option Explicit 語句強制所有變量的顯式聲明。試圖使用未聲明的變量将導緻編譯時錯誤。Option Explicit 語句隻用在子產品級。

'Option Explicit On   ' Force explicit variable declaration.

'Dim MyVar As Integer   ' Declare variable.

'MyInt = 10   ' Undeclared variable generates error.

'MyVar = 10   ' Declared variable does not generate error.

Option Strict Off

'不能窄縮轉化資料類型,例如隻能從int到long的轉換,而不能從long 到int 的轉換,預設是Option Strict Off 意思是:允許将任何資料類型隐式轉換成其他任何資料類型

'如果Option Strict On 所有的變量(包裹過程和函數的參數)和成員變量都聲明時都要加As,否則編譯會錯誤

'Option Strict 語句:

'限制隐式資料類型轉換隻能是拓寬轉換。這顯式禁止了任何會發生資料丢失的資料類型轉換和數值類型與字元串之間的任何轉換。

'Option Strict { On | Off }

'可選。啟用 Option Strict 檢查。如果在 Option Strict 語句後沒有指定 On 或 Off,則預設為 On。 

'可選。禁用 Option Strict 檢查。 

'如果使用 Option Strict 語句,則該語句必須出現在任何其他代碼之前。

'一般情況下,Visual Basic .NET 允許将任何資料類型隐式轉換成其他任何資料類型。在将一種資料類型的值轉換為精度更低或容量更小的資料類型的值時,将發生資料丢失。不過,如果在這樣的轉換中将丢失資料,會出現運作時錯誤資訊。Option Strict 確定發出這類轉換的編譯時通知,以便可以避免這類轉換。

'除了不允許收縮轉換之外,Option Strict 還将對晚期綁定生成錯誤。如果對象被賦給聲明為屬于 Object 類型的變量,該對象就是晚期綁定的。

'注意   如果代碼中沒有指定 Option Strict,編譯器的預設設定将是 Option Strict Off。

Option Compare Binary

'Option Compare 語句:

'用于在檔案級聲明當比較字元串資料時所使用的預設比較方法。

'Option Compare { Binary | Text }

'Binary 

'可選。導緻基于從字元的内部二進制表示形式導出的排序順序進行字元串比較。 

'Text 

'可選。導緻基于由系統的區域設定确定的不區分大小寫的文本排序順序進行字元串比較。 

'如果使用,則 Option Compare 語句必須出現在檔案中其他任何源語句之前。

'Option Compare 語句為類、子產品或結構指定字元串比較方法(Binary 或 Text)。如果未包括 Option Compare 語句,則預設的文本比較方法是 Binary。

Module Module1Module Module1

    Public aNew As String  '全局公共成員變量,可以在目前項目的任何類和子產品中引用

    'Dim aNew As String  '子產品的成員變量(字段)絕對不會出現形如:Public Dim aNew As String 的聲明

    Dim c = 5  '在Option Strict Off的前提下,Option Explicit Off或者On 都可以編譯可以通過,但不能去掉Dim,去掉 後會産生錯誤,提示錯誤為:應為聲明

    Sub Main()Sub Main()

        'b = 10  '在Option Strict Off的前提下,Option Explicit Off 時編譯可以通過,而Option Explicit On 時編譯産生錯誤,提示錯誤為:未聲明名稱"b"

        Console.WriteLine("hello, word!")

        aMethod()

        Console.WriteLine(addTwoNumber(1, 9))

        textInputBoxAndMsgBox()

        'Console.WriteLine(c)   前面的聲明c的語句不管改成什麼,都列印不出c的值,為什麼呢?留個疑問給大家

        Dim TestWu As New SubNew()

        Console.WriteLine(TestWu.testSubNew)

        Dim TestYou As New SubNew("調用有參數構造器")

        Console.WriteLine(TestYou.testCanShuSubNew)

        Console.ReadKey()

    End Sub

    'Protected Sub aMethod()  '錯誤

    'Shared Sub aMethod()     '錯誤

    Sub aMethod()Sub aMethod()

        Console.WriteLine("aMethod")

    Sub New()Sub New() '構造函數

        aNew = "用構造函數初始化aNew成員變量(字段)"

        Console.WriteLine(aNew)

    'Private Function addTwoNumber(ByVal a, ByVal b) As Integer  '如果在子產品的開始加上了Option Strict On ,則會産生錯誤,錯誤提示為: Option Strict On 要求所有變量聲明都有“As”子句,如果在子產品的開始加上了Option Strict Off或者什麼都不加, 則可以通過。

    Public Function addTwoNumber()Function addTwoNumber(ByVal a As Integer, ByVal b As Integer) As Integer  '和過程一樣,同樣不能用Protected和Private修飾函數

        'Return a + b '與下面等價

        addTwoNumber = a + b '與上面等價,這個是VB6傳回值的文法,直接讓函數名等于傳回值

    End Function

    Sub textInputBoxAndMsgBox()Sub textInputBoxAndMsgBox() '測試InputBox和MsgBox函數

        Dim userName As String

        userName = InputBox("請輸入一個名字:", "測試InputBox和MsgBox")

        MsgBox(userName, , "測試InputBox和MsgBox")

End Module

Class SubNewClass SubNew

    Private _testSubNew As String = "調用預設構造函數(即無參數構造函數)" '為配合屬性定義的

    Public testCanShuSubNew As String '一個公共字段,可以在該類外面被通路

    Sub New()Sub New() '無參數構造器

    Sub New()Sub New(ByVal X As String) '有參數構造器

        Me.testCanShuSubNew = X

    Public Property testSubNew()Property testSubNew() As String  '定義一個屬性

        Get

            Return _testSubNew

        End Get

        Set(ByVal value As String)

            _testSubNew = value

        End Set

    End Property

End Class

'VB中的過程包裹子過程(Sub)和函數過程(Function),其實完全可以把過程稱為方法或者函數

'過程和函數都可以接受參數

'過程(又稱子過程)不能有傳回值 

'函數(又稱函數過程)可以有傳回值,而且傳回值加在函數聲明的後面,用As實作

'VB中的類預設提供一個無參數構造器,是以你不必在代碼裡顯示定義一個無參數構造器就可以用無參數構造器執行個體化該類。但一旦在類中定義了一個有參數構造器,你就必須顯示定義一個

'無參數構造器,才能用無參數構造器執行個體化該類

'子產品不能執行個體化 子產品不可繼承 子產品被隐式的共享(内部成員都是Shared類型,相當與C#中的static)

'子產品的成員不用提供Module名稱就可以被通路。既你可以直接用成員的名字通路該成員

'子產品的成員是全局共享的,你可以在程式的任意位置通路這些成員

'帶有Mani()方法的子產品可被編譯成EXE檔案,而不需要提供任何額外的資訊指定應用程式的入口點

'子產品可以有Main()函數也可以沒有Main()函數

'通過子產品的全局成員變量,我們可以實作B/S結構裡面的Session,來判斷使用者的登陸狀态,這個我已經在一個項目實作

'後記:因為以前有過VB6的開發經驗,我覺得VB.NET中的子產品是為了最大限度的相容VB6而保留的,不過就子產品式程式設計來說,我還是比較喜歡,C#中沒有子產品的實作,而VB.NET滿足了的體驗

本文轉自terryli51CTO部落格,原文連結:http://blog.51cto.com/terryli/520600 ,如需轉載請自行聯系原作者

繼續閱讀