麻豆小视频在线观看_中文黄色一级片_久久久成人精品_成片免费观看视频大全_午夜精品久久久久久久99热浪潮_成人一区二区三区四区

首頁 > 編程 > Visual Basic > 正文

Visual Basic 2010 新增功能

2023-06-12 12:11:30
字體:
來源:轉載
供稿:網友

自 1991 年 Visual Basic 語言誕生之日起,它就一直是生成應用程序的高效率工具。將近 20 年之后,它繼續提供與 Microsoft .NET Framework 的輕松對接,使開發人員能夠編寫可跨越桌面、電話、瀏覽器甚至云的應用程序。

Microsoft 將在本月發布 Visual Studio 2010,其中包含 Visual Basic 版本 10(有時稱為 VB 2010 或 VB10)。此版本是迄今為止最強大的版本,包含許多省時省力的功能,可以幫助開發人員通過更少的代碼行完成更多的操作。在這里,將會為您提供所有必要的內容,讓您充分了解并利用 Visual Studio 2010 中的 Visual Basic。

共同演變

在過去,Visual Basic 和 C# 是由獨立團隊分別開發的,這通常會導致一些功能先出現在一種語言中,繼而又出現在另一種語言中。例如,C# 有 Visual Basic 中所沒有的自動實現屬性和集合初始值設定項,而 Visual Basic 則有 C# 中所沒有的晚期綁定和可選參數等功能。但每當一種語言具有新功能時,許多客戶都會要求將該功能也添加到另一種語言中。

為了解決這一需求,Microsoft 合并了 Visual Basic 和 C# 團隊,實行共同演變的策略。目的是為推動這些語言共同發展。當一種語言中引入重大功能時,它也會出現在另一種語言中。這并不是說每種功能都將出現在兩種語言中,并按完全相同的方式工作;實際上,每種語言都有自己的歷史、靈魂和感覺 – 保留這些特性非常重要。

在 .NET Framework 4 中,Visual Basic 和 C# 朝這一目標邁進了一大步,分別吸收了對方既有的許多功能。然而,共同演變不僅影響到以前的功能;它同樣是這些語言未來的發展策略。本著這種精神,.NET Framework 4 在兩種語言中同時引入了強大的新功能,例如動態語言運行時、嵌入式互操作類型和泛型方差,從而使 Visual Basic 和 C# 開發人員能夠充分利用 .NET Framework。

Visual Basic 2010 新增功能

Visual Basic 2010 中的新功能旨在幫助您通過更少的代碼行實現更多操作。我們 Visual Basic 設計團隊仔細研究了開發人員通常不得不編寫大量繁瑣樣板代碼的地方,并找到相應解決辦法,讓編譯器代替執行此類工作。當然,這是從整體上來看,現在就讓我們深入了解各項功能。

隱式行繼續符

Visual Basic 是一種面向行的語言,它使用類似于英語的清晰語法來增強可讀性。但這通常會導致代碼遇到每行 80 個字符的限制,從而迫使開發人員要進行大量滾動。您可以使用下劃線字符來告知編譯器應將下一行作為當前行繼續處理(也就是說,將多個物理行視為單個邏輯行)。但不得不重復地鍵入下劃線字符一直很令人煩惱,而事實上多年以來排在首位的功能請求就是讓編譯器“解決這個問題”。

而在 Visual Basic 2010 中,編譯器能夠解決這個問題。編譯器現在知道哪些標記(例如逗號、圓括號和運算符)往往出現在行繼續符前面,并且它會插入字符,因此開發人員不再需要插入字符。例如,用逗號作為 Visual Basic 語句的結尾肯定不合邏輯;編譯器知道這一點,因此,當編譯器看到諸如 {comma, enter} 這樣的標記流時,它會推斷出存在行繼續符,如圖 1 中的示例所示。

圖 1 推斷出行繼續符

<Extension()> 
Function FilterByCountry( 
 ByVal customers As IEnumerable(Of Customer), 
 ByVal country As String) As IEnumerable(Of Customer) 
  Dim query = 
   From c In customers 
   Where c.Country = country 
   Select <Customer> 
    <%= 
     c.Name & 
     "," & 
     c.Country 
    %> 
   </Customer> 
  Return query 
 End Function

在 Visual Basic 2008 中,圖 1 中的代碼將需要 9 個下劃線字符。然而,在以下每種情況下,編譯器會推斷出下劃線字符在何時是必要的,并允許將其忽略:

  在 <Extension()> 屬性之后

  在方法聲明中的 ((左圓括號)之后

  在第一個參數的 ,(逗號)之后

  在方法聲明中的 )(右圓括號)之前

  在 =(等號)之后

  在 <%=(嵌入式表達式的開始標記)之后

  在 XML 文本的每個 &(與號)之后

  在 %>(嵌入式表達式的結束標記)之前

  這個新的編譯器功能對于方法簽名特別有用,它對于所示示例中超過 80 個字符的情況也將正常工作(如果每一部分都位于同一行上)。在圖 2 中,您將看到行繼續符為隱式的標記和位置的所有組合。

  圖 2 行繼續符為隱式的情況

 

標記 之前 之后
,(逗號)、.(句點)、>(屬性)、(  {(左括號)、<%=(嵌入式表達式開始標記(XML 文本))   X
)、}、](右括號)、%>(嵌入式表達式結束標記) X  
  所有 LINQ 關鍵字:

  Aggregate、 Distinct、From、Group By、Group Join、Join、Let、Order By、Select、Skip、Skip While、Take、Take While、Where、In、Into、On、Ascending、Descending

X X
  運算符: 

  +、 -、*、/、/、^、>>、<<、Mod、&、+=、-=、*=、/=、/=、^=、>>=、<& lt;=、&=、<、<=、>、>=、<>、Is、IsNot、Like、And、Or、Xor、 AndAlso、OrElse

  X
With(在對象初始值設定項中)   X

   如您所見,有 60 多處該語言不需要下劃線字符的地方。(事實上,本文中的任何一個代碼示例都不需要行繼續符。)當然,您仍然可以使用下劃線字符,因此 Visual Basic 以前版本中的代碼將仍然按預期方式編譯。

  語句 Lambda

  術語 lambda 乍聽上去可能很嚇人,但 lambda 只是在另一個函數內定義的函數。Visual Basic 2008 引入了帶 Function 關鍵字的 lambda 表達式:

Dim customers As Customer() = ... 
 
 Array.FindAll(customers, Function(c) c.Country = "Canada")

  Lambda 表達式使您能夠在本地以細致緊湊的方式表達邏輯,而不必跨多個方法拆分邏輯。例如,下面是 Visual Basic 2005(不支持 lambda 表達式)中以前的代碼的表示形式:

Dim query = Array.FindAll(customers, AddressOf Filter) 
 
  ... 
 
Function Filter(ByVal c As customer) As Boolean 
 Return c.Country = "Canada" 
End Function

  不幸的是,Visual Basic 2008 的 lambda 表達式要求表達式返回值,因此以下代碼:

Array.ForEach(customers, Function(c) Console.WriteLine(c.Country))

  將會導致以下情況:

'Compile error: "Expression does not produce a value."

  Console.WriteLine 是一個 Sub 過程(C# 中為 void),因此它不會返回值,而這就是編譯器產生錯誤的原因所在。為了處理此情況,Visual Basic 2010 引入了對語句 lambda 的支持,后者是包含一個或多個語句的 lambda:

Array.ForEach(customers, Sub(c) Console.WriteLine(c.Country))

  由于 Console.WriteLine 不返回值,因此我們可以只創建 Sub lambda,而不是 Function lambda。下面是使用多個語句的另一個示例:

Array.ForEach(customers, Sub(c) 
              Console.WriteLine("Country Name:") 
              Console.WriteLine(c.Country) 
             End Sub)

  當此代碼運行時,它將為每個客戶打印兩行。另外請注意,如果在編碼時懸停在 c 上,您將看到編譯器會將類型推斷為 Customer(鍵入 c As Customer 來顯式聲明類型也是合法的)。動態編寫事件處理程序是語句 lambda 的另一個出色用途:

AddHandler b.Click, Sub(sender As Object, e As EventArgs) 
           MsgBox("Button Clicked") 
           'insert more complex logic here 
          End Sub

  并且,事實上,您可以將語句 lambda 與 Visual Basic 2008 中引入的一項功能(松散委托)結合使用。(可以使用委托 – 類型安全的函數指針 – 一次性執行多個函數。)這種組合將生成更為簡單的簽名:

AddHandler b.Click, Sub() 
           MsgBox("Button Clicked") 
           'insert more complex logic here 
          End Sub

  委托松散使您可以完全忽略事件處理程序中的參數 – 這是一個很好的優點,只要它們根本未使用過,因此它們只會在視覺上帶來干擾。

  除了到目前為止我們已看到的單行 Sub lambda 和多行 Sub lambda 外,Visual Basic 2010 還支持多行 Function lambda:

Dim query = customers.Where(Function(c) 
               'Return only customers that have not been saved 
               'insert more complex logic here 
               Return c.ID = -1 
              End Function)

  語句 lambda 的另一個引人關注的方面是它們與 Visual Basic 2008 引入的匿名委托的相交方式。人們經常將這些委托與 C# 的匿名方法混淆,盡管嚴ge來說它們并不相同。當 Visual Basic 編譯器基于 lambda 的方法簽名推斷委托類型時,將發生匿名委托:

Dim method = Function(product As String) 
        If product = "Paper" Then 
         Return 4.5 'units in stock 
        Else 
         Return 10 '10 of everything else 
        End If 
       End Function 
 
MsgBox(method("Paper"))

  如果運行此代碼,您將看到消息框中顯示值 4.5。此外,如果懸停在 method 上,您將看到文本 Dim method As <Function(String) As Double>。由于我們未提供實際委托類型,因此編譯器將自動生成一個委托類型,如下所示:

Delegate Function $compilerGeneratedName$(product As String) As Double

  這稱為匿名委托,因為它只會出現在編譯器生成的代碼中,而不會出現在編寫的代碼中。請注意,當事實上沒有提供 As 子句來指定 lambda 的返回類型時,編譯器將返回類型推斷為 Double。編譯器將查看 lambda 內的所有返回語句,并將確定類型 Double (4.5) 和 Integer (10):

'Notice the "As Single" 
Dim method = Function(product As String) As Single 
        If product = "Paper" Then 
         Return 4.5 'units in stock 
        Else 
         Return 10 '10 of everything else 
        End If 
       End Function

  然后,它將運行其基準類型算法,并確定它能夠安全地將 10 轉換為 Double,但無法安全地將 4.5 轉換為 Integer;因此 Double 是更好的選擇。

  您也可以顯式控制返回類型,在這種情況下,編譯器將不會嘗試推斷類型。非常常見的做法是將 lambda 賦給具有顯式委托類型的變量,而不是依賴于編譯器來推斷委托類型:

Dim method As Func(Of String, Single) = 
 Function(product) 
  If product = "Paper" Then 
   Return 4.5 'units in stock 
  Else 
   Return 10 '10 of everything else 
  End If 
 End Function

  由于提供了顯式目標類型,因此無需聲明 As String 或 As Single;編譯器可基于語句左邊的委托類型來推斷出其存在。因此,如果您懸停在 product 上,將會發現推斷出的類型為 String。不再必須指定 As Single,因為委托類型已提供該信息。在前面的示例中,Func 委托(.NET Framework 包括該委托)的簽名如下所示:

Delegate Function Func(Of T, R)(ByVal param As T) As R

  但有一個很小的例外之處,稍后我們將在“泛型方差”一節中看到。

  自動實現的屬性

  在 Visual Basic 中,屬性是用于向外部公開對象狀態的類成員。典型的屬性聲明與如下聲明類似:

Private _Country As String 
 
Property Country As String 
 Get 
  Return _Country 
 End Get 
 Set(ByVal value As String) 
  _Country = value 
 End Set 
End Property

  一個實際上非常簡單的概念就有 10 行代碼。由于典型的對象通常有數十個屬性,因此您最終會在類定義中包括大量樣板代碼。為了簡化此類任務,Visual Basic 2010 引入了自動實現的屬性,利用該屬性,您只需使用一行代碼即可定義簡單的屬性:

Property Country As String

  在這種情況下,編譯器將繼續運行并自動生成 Getter、Setter 和支持字段。支持字段的名稱是始終為前面帶有下劃線字符的屬性的名稱:此例中為 _Country。這種命名約定在將自動實現的屬性更改為常規屬性的情況下確保了二進制序列化兼容性。只要支持字段的名稱相同,二進制序列化就將繼續工作。

  您可使用自動實現的屬性執行的其中一項出色的功能是:指定在構造函數運行時設置屬性默認值的初始值設定項。舉例來說,一個帶有實體類的常見方案將主鍵設置為類似于 -1 的值,以指示其處于未保存的狀態。代碼將如下所示:

Property ID As Integer = -1

  當構造函數運行時,支持字段 (_ID) 將自動設置為值 -1。初始值設定項語法也適用于引用類型:

Property OrderList As List(Of Order) = New List(Of Order)

  由于無需輸入兩次類型的名稱,因此上一行代碼可能不會具有非常明顯的“Visual Basic 特征”。好消息是,常規變量聲明中有一個與 Visual Basic 所允許語法一致的更短的語法:

Property OrderList As New List(Of Order)

  您甚至能夠將此語法與對象初始值設定項結合使用,以允許設置其他屬性:

Property OrderList As New List(Of Order) With {.Capacity = 100}

  很顯然,對于更復雜的屬性,擴展的語法仍然是必要的。您仍然可以鍵入 Property{Tab} 來激活舊屬性片段。或者,在鍵入屬性的第一行后,您可以只輸入 Get{Enter},IDE 將生成舊樣式的屬性:

Property Name As String 
 Get 
 
 End Get 
 Set(ByVal value As String) 
 
 End Set 
End Property

  人們通常會發現:新的屬性語法與公共字段的語法幾乎相同,那么為什么不改為使用公共字段?有幾個原因:

  大多數 .NET 數據綁定基礎結構都依據屬性(而不是字段)工作。

  接口無法強制要求存在字段;但可以強制要求存在屬性。

  屬性為更改業務規則提供了更長期的靈活性。例如,假定某人引入了電話號碼必須為 10 位數的規則。如果分配給公共字段,將無法執行此驗證。對于諸如二進制序列化和反射等方案而言,將公共字段更改為屬性是一項重大更改。

  集合初始值設定項

  一種常見 .NET 做法是實例化集合,然后通過為每個元素調用一次 Add 方法來填充該集合:

Dim digits As New List(Of Integer) 
digits.Add(0) 
digits.Add(1) 
digits.Add(2) 
digits.Add(3) 
digits.Add(4) 
digits.Add(5) 
digits.Add(6) 
digits.Add(7) 
digits.Add(8) 
digits.Add(9)

  但對于從根本上而言非常簡單的概念來說,將會產生大量語法開銷。Visual Basic 2010 引入了集合初始值設定項,使您能夠更輕松地實例化集合。對于此代碼:

Dim digits = New List(Of Integer) From {1, 2, 3, 4, 5, 6, 7, 8, 9, 0}

  編譯器將自動生成對 Add 方法的所有調用。您也可以使用 Visual Basic 的 As New 語法的功能:

Dim digits As New List(Of Integer) From {1, 2, 3, 4, 5, 6, 7, 8, 9, 0}

  請注意,在 Visual Basic Team 上,我們一直建議使用第二種語法 (As New),而不是前者,因為它使代碼更能適應 Option Infer 設置的更改。

  您可以依據滿足以下要求的任何類型使用集合初始值設定項:

  您可以使用 For Each 語句循環訪問該類型 – 也就是說,該類型實現 IEnumerable。(有關集合類型更精確/詳細的定義,請參見 msdn.microsoft.com/library/aa711986(VS.71).aspx 上 Visual Basic 語言規范的第 10.9.3 節)。

  該類型具有可訪問的(但不一定是公共)無參數構造函數。

  該類型具有可訪問的(但不一定是公共)實例或名為 Add 的擴展方法。

  這意味著,您也可以將集合初始值設定項用于更復雜的類型,例如字典:

Dim lookupTable As New Dictionary(Of Integer, String) From 
 {{1, "One"}, 
  {2, "Two"}, 
  {3, "Three"}, 
  {4, "Four"}}

  (請注意,即使此語句跨了五行,也沒有下劃線字符。)在這種情況下,編譯器將生成與初始化字典的舊方法等效的代碼:

Dim lookupTable As New Dictionary(Of Integer, String) 
lookupTable.Add(1, "One") 
lookupTable.Add(2, "Two") 
lookupTable.Add(3, "Three") 
lookupTable.Add(4, "Four")

  編譯器在調用具有兩個 參數(而不是一個參數)的 Add 方法。它之所以知道這樣做,原因是傳入集合初始值設定項的值位于嵌套的大括號中,如下所示:{{1, “One”}, {2, “Two”}, …}。對于每一組嵌套的大括號,編譯器會嘗試將這些參數傳遞到兼容的 Add 方法。

  也可以通過使用擴展方法來提供您自己的自定義 Add 實現:

<Extension()> 
 Sub Add(ByVal source As IList(Of Customer), 
     ByVal id As Integer, 
     ByVal name As String, 
     ByVal city As String) 
 
   source.Add(New Customer With 
         { 
          .ID = id, 
          .Name = name, 
          .City = city 
         }) 
 End Sub

  (看看所有這些缺失的下劃線字符!)此方法擴展任何實現 IList(Of Customer) 的類型,然后允許您使用新的集合初始值設定項語法,如下所示:

Dim list = New List(Of Customer) From 
      { 
       {1, "Jon", "Redmond"}, 
       {2, "Bob", "Seattle"}, 
       {3, "Sally", "Toronto"} 
      }

  (向列表 中添加三個客戶)。您也可以將集合初始值設定項與自動實現的屬性結合使用:

Property States As New List(Of String) From {"AL", "AK", "AR", "AZ", ...}

  數組文本

  除了更強大的集合類型處理方式外,Visual Basic 2010 還提供了一些用于處理數組的強大增強功能。假設有以下代碼(在較舊版本中可正常工作):

Dim numbers As Integer() = New Integer() {1, 2, 3, 4, 5}

  通過查看該數組中的元素,很明顯每個元素都是整數,因此,必須實際上在此行中打印輸出兩次 Integer 的操作不會真正添加任何值。數組文本 允許將某個數組的所有元素放在大括號內,然后讓編譯器自動推斷類型,從而創建該數組:

Dim numbers = {1, 2, 3, 4, 5}

  numbers 的類型不是 Object,而是 Integer()(只要啟用了“Option Infer”),原因是數組文本現在可代表本身,并且有其自己的類型。假設有一個更復雜的示例:

Dim numbers = {1, 2, 3, 4, 5.555}

  在這種情況下,numbers 的類型將被推斷為 Double()。編譯器通過檢查數組中的每個元素并計算基準類型(所使用的算法與前面討論的用于推斷語句 lambda 的返回類型的算法相同),從而確定類型。如果沒有基準類型將會發生什么情況?例如,以下代碼中所示:

Dim numbers = {1, 2, 3, 4, "5"}

  在這種情況下,將 Integer 轉換為 String 將會縮小轉換范圍(也就是說,在運行時可能會出現數據丟失的情況),同樣,將 String 轉換為 Integer 也會縮小轉換范圍。可選擇的唯一安全的類型為 Object()(如果啟用了“Option Strict”,編譯器將產生錯誤)。

  可以嵌套數組文本以形成多維數組或交錯數組:

'2-dimensional array 
Dim matrix = {{1, 0}, {0, 1}} 
 
'jagged array - the parentheses force evaluation of the inner array first 
Dim jagged = { ({1, 0}), ({0, 1}) }

  動態語言運行時

  盡管 Visual Basic 從技術上而言實質上是靜態語言,但它一直有非常強大的動態功能,例如晚期綁定。Visual Studio 2010 附帶了一個名為動態語言運行時 (DLR) 的新平臺,利用該平臺可更為輕松地生成動態語言 – 并在這些語言之間通信。Visual Basic 2010 已更新為在其晚期綁定程序中完全支持 DLR,從而使開發人員能夠使用采用其他語言(例如 IronPython/IronRuby)開發的庫和框架。

  此功能的一項突出優點是,從語法上而言沒有任何內容發生更改(事實上,在編譯器中沒有修改任何一行代碼來支持此功能)。開發人員仍然能夠像在 Visual Basic 以前的版本中一樣進行晚期綁定的操作。發生變化的是 Visual Basic 運行庫 (Microsoft.VisualBasic.dll) 中的代碼,該運行庫現在可識別 DLR 提供的 IDynamicMetaObjectProvider 接口。如果某個對象實現此接口,則 Visual Basic 運行庫將構建 DLR CallSite,并允許該對象及提供該對象的語言將它們自己的語義注入操作。

  例如,Python 標準庫包含一個名為 random.py 的文件,其中有一個名為 shuffle 的方法,該方法可用于隨機重新排列數組中的元素。調用該方法很簡單:

Dim python As ScriptRuntime = Python.CreateRuntime() 
Dim random As Object = python.UseFile("random.py") 
 
Dim items = {1, 2, 3, 4, 5, 6, 7} 
random.shuffle(items)

  在運行時,Visual Basic 會看到對象實現 IDynamicMetaObjectProvider,并因此將控制權交給 DLR,后者隨后將與 Python 通信,并執行該方法(將 Visual Basic 中定義的數組作為參數傳遞給該方法)。

  這是調用啟用了 DLR 的 API 的一個示例,但開發人員也可以創建他們自己的使用此功能的 API。關鍵是實現 IDynamicMetaObjectProvider 接口,在這種情況下,Visual Basic 和 C# 編譯器將可識別具有特殊動態語義的對象。請不要手動實現該接口,更簡單的方法是:從 System.Dynamic.DynamicObject 類(該類已實現此接口)繼承并僅僅重寫少數幾個方法。圖 3 顯示了創建自定義動態對象(一種似乎可實時創建屬性的“屬性包”)并使用正常 Visual Basic 晚期綁定來調用該對象的完整示例。(有關使用 DynamicObject 的詳細信息,請閱讀 Doug Rothaus 撰寫的非常不錯的文章,網址為 blogs.msdn.com/vbteam/archive/2010/01/20/fun-with-dynamic-objects-doug-rothaus.aspx。)

  圖 3 創建自定義動態對象并使用 Visual Basic 晚期綁定調用該對象

Imports System.Dynamic 
 Module Module1 
  Sub Main() 
   Dim p As Object = New PropertyBag 
    p.One = 1 
    p.Two = 2 
    p.Three = 3 
   Console.WriteLine(p.One) 
   Console.WriteLine(p.Two) 
   Console.WriteLine(p.Three) 
  End Sub 
   Class PropertyBag : Inherits DynamicObject 
    Private values As New Dictionary(Of String, Integer) 
    Public Overrides Function TrySetMember( 
     ByVal binder As SetMemberBinder, 
     ByVal value As Object) As Boolean 
      values(binder.Name) = value 
     Return True 
    End Function 
    Public Overrides Function TryGetMember( 
     ByVal binder As GetMemberBinder, 
     ByRef result As Object) As Boolean 
     Return values.TryGetValue(binder.Name, result) 
    End Function 
   End Class 
 End Module

  泛型方差

  這是一項乍聽起來的確可能很復雜的功能(帶有像協方差和逆變這樣的術語),但實際上它很簡單。如果您有類型為 IEnumerable(Of Apple) 的對象,并且希望將其分配給 IEnumerable(Of Fruit),這應是合法的,因為每個 Apple 都是 Fruit(由繼承關系強制要求)。遺憾的是,在 Visual Basic 2010 之前,編譯器中不支持泛型方差,即使公共語言運行時 (CLR) 中實際上支持泛型方差也是如此。

  讓我們看一下圖 4 中的示例。在 Visual Basic 2008 中,圖 4 中的代碼將在 Dim enabledOnly 行上產生編譯錯誤(或者,如果禁用了“Option Strict”,則產生運行時異常)。解決方法是調用 .Cast 擴展方法,如下所示:

'Old way, the call to Cast(Of Control) is no longer necessary in VB 2010 
  Dim enabledOnly = FilterEnabledOnly(buttons.Cast(Of Control))

  這一點不再必要,因為在 Visual Basic 2010 中,已通過使用 Out 修飾符將 IEnumerable 接口標記為協變:

Interface IEnumerable(Of Out T) 
 ... 
End Interface

  圖 4 泛型方差示例

Option Strict On 
Public Class Form1 
 Sub Form1_Load() Handles MyBase.Load 
  Dim buttons As New List(Of Button) From 
   { 
    New Button With 
    { 
     .Name = "btnOk", 
     .Enabled = True 
    }, 
    New Button With 
    { 
     .Name = "btnCancel", 
     .Enabled = False 
    } 
   } 
 
  Dim enabledOnly = FilterEnabledOnly(buttons) 
 End Sub 
 Function FilterEnabledOnly( 
  ByVal controls As IEnumerable(Of Control) 
  ) As IEnumerable(Of Control) 
  Return From c In controls 
  Where c.Enabled = True 
 End Function 
End Class

  這意味著泛型參數 T 現在為變量(也就是說,它適用于繼承關系),并且編譯器將確保僅在類型來自于接口的位置使用該參數。泛型參數也可以是逆變量,這意味著它們僅在輸入 位置使用。類型可實際上具有這兩者。例如,前面討論的 Func 委托既具有逆變參數(傳入的內容),也具有協變參數(用于返回類型):

Delegate Function Func(Of In T, Out R)(ByVal param As T) As R

  可以在自定義接口和委托上使用 In 和 Out 修飾符。.NET Framework 4 中的許多常用接口和委托已標記為變量;常見示例包括所有 Action/Func 委托、IEnumerable(Of T)、IComparer(Of T) 和 IQueryable(Of T) 等。

  泛型方差的突出優點是:它是一項您完全無需擔心的功能 – 如果它在執行工作,您將絕不會注意到它。曾經會導致編譯器錯誤或要求調用 .Cast(Of T) 的情形在 Visual Basic 2010 中工作正常。

  改進的可選參數

  可選參數提供了一種有用的高效功能,它使開發人員能夠建立更靈活的方法,并避免使用許多方法重載使類混亂不堪。在過去有一點限制,即可選參數不能為 null(或者甚至不能為任何非內部結構類型)。Visual Basic 2010 現在允許您定義任意 值類型的可選參數:

Sub DisplayOrder(ByVal customer As Customer, 
         ByVal orderID As Integer, 
         Optional ByVal units As Integer? = 0, 
         Optional ByVal backgroundColor As Color = Nothing) 
End Sub

  在此例中,units 的類型為 Nullable(Of Integer),backgroundColor 為非內容結構類型,但仍然將它們用作可選參數。Visual Basic 2010 還對泛型可選參數提供了更好的支持。

  嵌入式互操作類型

  對于執行 COM 互操作的應用程序,一個常見弱點是必須要使用主互操作程序集 (PIA)。PIA 是一種 .NET 程序集,它充當 COM 組件上的運行時可調用包裝 (RCW),并具有用來標識它的唯一 GUID 。.NET 程序集與 PIA 通信,后者隨后執行任何必要的封送以在 COM 和 .NET 之間移動數據。

  遺憾的是,PIA 可能會使部署變得很復雜,因為它們是需要部署到最終用戶計算機的附加 DLL。它們還可能會導致版本控制問題 – 例如,如果您希望應用程序能夠同時依據 Excel 2003 和 Excel 2007 工作,則將需要隨應用程序一起同時部署兩個 PIA。

  嵌入式互操作類型功能直接嵌入應用程序,但只會嵌入絕對必要的 PIA 中的類型和成員,因此無需將 PIA 部署到最終用戶的計算機。

  若要為現有對象啟用此功能(對于新引用,默認情況已啟用此功能),請在解決方案資源管理器中選擇引用,并在屬性窗口中更改“Embed Interop Types”選項(請參見圖 5)。或者,如果使用ming令行編譯器進行編譯,請使用 /l(或 /link)開關,而不是 /r 和 /reference。

Visual Basic 2010 新增功能

  圖 5 在解決方案資源管理器中啟用嵌入式互操作類型

  啟用此功能之后,應用程序將不再依賴于 PIA。事實上,如果在 Reflector 或 ildasm 中打開程序集,您將注意到實際上根本沒有對 PIA 的任何引用。

  多重目標

  Visual Basic 2010 中所有功能的最突出特點是:您甚至可以在目標為 .NET Framework 2.0 至 .NET Framework 3.5 的項目中使用這些功能。這意味著,隱式行繼續符、數組文本、集合初始值設定項、語句 lambda、自動實現的屬性等功能將全部都可在現有項目中使用,而不必將目標重定為 .NET Framework 4。

  例外情況是嵌入式互操作類型,它依賴于只有 .NET Framework 4 中才有的類型;因此,如果將目標定為 .NET Framework 版本 2.0 至 3.5,則無法使用該功能。此外,只會采用 .NET Framework 4 中的方式對標記為變量的類型進行標記,因此,在前面的示例中,如果將目標定為版本 2.0 至 3.5,則仍然必須調用 .Cast(Of T)。不過,如果將目標定為這些早期版本,您可以建立自己的變量類型(使用 In/Out 修飾符)。

  若要更改應用程序的當前目標框架,請雙擊“我的項目”,單擊“編譯”選項卡,單擊“高級編譯選項”,然后從底部的組合框中進行選擇。

  在從ming令行中進行編譯時,實際上沒有ming令行開關可啟用此功能。實際上,編譯器將查看哪個程序集提供了 System.Object 的定義(通常為 mscorlib)以及程序集的目標定為哪個框架,然后在輸出程序集中標記該值。(編譯器在生成 Silverlight 程序集時也使用這個同樣的機制。)在使用 IDE 時,所有這些都是以透明方式進行的,因此通常您無需擔心任何事情。

  歡迎試用

  如您所見,Visual Basic 2010 具有許多強大功能,這些功能使您能夠提高工作效率,同時減少編寫的代碼行數,而將更多工作交給編譯器來做。在本文中,我只探討了語言功能,但 Visual Basic 2010 IDE 還有數不勝數的出色增強功能。下面列出部分增強功能:

  導航到

  突出顯示引用

  從使用中生成

  更好的 IntelliSense(子字符串匹配、駝峰式大小寫查找、建議模式 – 對于“首先測試”開發風ge非常有用)

  多監視器支持

  縮放

  Visual Basic 團隊渴望聽到您對我們改善 Visual Basic 的工作方面的反饋,因此請在 Microsoft Connect 上將您的意見和問題發送給我們。若要了解有關語言和 IDE 功能的詳細信息,請查看 msdn.com/vbasic 上的內容,其中包括文章、示例和操作方法視頻。當然,最佳學習方式是深入研究和使用產品,因此是安裝和試用產品的時候了。

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 久久最新视频 | 免费a视频在线观看 | 模特三级在线观看 | 国产精品手机在线亚洲 | 黄色18网站 | 男女无套免费视频 | 一区二区久久精品66国产精品 | 精品国产91久久久久久久妲己 | 日韩黄色免费在线观看 | 久久亚洲成人网 | chinese-xvideos | gril hd| 精品一区二区三区免费视频 | 亚洲四播房 | 国内xxxx乱子另类 | 久久久tv | 天天色图片 | 色就色 综合偷拍区91网 | 成人毛片网站 | 久久久www成人免费精品 | 激情小说色 | 免费国产一级特黄久久 | 国产精品成人一区二区三区吃奶 | 日本高清在线免费 | 国产成人精品网站 | 欧美14一15sex性hd | 一夜新娘第三季免费观看 | 成人国产免费观看 | 精精国产xxxx视频在线播放7 | 久久另类视频 | 日韩色视频在线观看 | 亚州视频在线 | www.国产一区.com | 国产精品美女久久久久久不卡 | 依人在线视频 | 黄色片视频免费观看 | 91精品国产综合久久婷婷香蕉 | 久久久久久久久久网站 | 亚洲影视中文字幕 | 黄色网址在线播放 | 久久久久久久久日本理论电影 |