網頁

Visual Basic -- 區域型別推斷

區域型別推斷(Local Type Inference)


區域型別推斷是讓你在宣告區域變數時,可以不必使用As宣告其明確型別的一種語法。

程式一:區域型別推斷
Dim Name = "KKBruce"
Dim Height = 173
Dim Friends = New String() {"Mary", "Kelly", "Cindy"}

在Dim之後沒有As Type的宣告,Visual Basic的Compiler會透過後面的或運算式(Expression)來判斷型別,例如"KKBruce"這個值很明顯是"字串(String)型別",所以Name變數的型別就會是"String"。所以這樣判斷的動作我們稱「區域型別推斷(Local Type Inference)」。

隱含型別(Implicitly Type)

程式一裡的Dim Name與Dim Height稱它「隱含型別區域變數」,因為從宣告程式碼本身是看不出型別,而必須經過"區域型別推斷"的動作後才能判定型別,所以稱"隱含"不是沒有型別

程式一裡的Dim Friends稱它「隱含型別陣列」,單從Dim Friends是無法判定,因為後面的值是「數值陣列」,經過"區域型別推斷"後,Dim Friends就會成為「數值陣列」型別。

匿名型別(AnonyMous Type)

匿名型別會與隱含型別一起使用。

程式二:匿名型別
'Dim person為隱含型別
'New With {...}為匿名型別
Dim person = New With {.Name = "KKBruce", .Height = 173}
Response.Write(person.Name) '結果為KKBruce
Response.Write(person.GetType())

你會發現New With本身沒有"型別(Type)"所以稱「匿名型別」。別外可以發現此person物件,裡面包含了String型別和Integer型別(它到底是String還是Integer?),這在以前是做不到的。而person到底是什麼型別?我們可以從person.GetType()得知,Visual Basic會在Compiler時給它一個「VB$AnonymousType_0`2[System.String,System.Int32]」的匿名型別,此匿名型別裡有String及Int32兩個複合型別。


實例

以上不論是區域型別推斷、隱含型別、匿名型別,有很大一部份都是為了LINQ及.NET Framework 4所準備,但在一般情況下,也是可以使用。

程式三:隱含型別取得所有網頁上控制項
'c是隱含型別
For Each c In Me.Form.Controls
    If TypeOf c Is TextBox Then
        ' Do Some thing ...
    End If
Next

原始的c應該是「c As Control」(或是使用c As Object),但這裡使用了隱含型別來替代,透過這個For Each方法,可以取得目前網頁上所有控制項,然後再進行應用。

沒有留言:

張貼留言

感謝您的留言,如果我的文章你喜歡或對你有幫助,按個「讚」或「分享」它,我會很高興的。