日本综合一区二区|亚洲中文天堂综合|日韩欧美自拍一区|男女精品天堂一区|欧美自拍第6页亚洲成人精品一区|亚洲黄色天堂一区二区成人|超碰91偷拍第一页|日韩av夜夜嗨中文字幕|久久蜜综合视频官网|精美人妻一区二区三区

RELATEED CONSULTING
相關(guān)咨詢
選擇下列產(chǎn)品馬上在線溝通
服務(wù)時間:8:30-17:00
你可能遇到了下面的問題
關(guān)閉右側(cè)工具欄

新聞中心

這里有您想知道的互聯(lián)網(wǎng)營銷解決方案
在VisualStudio2010中使用C#4.0的動態(tài)類型

【譯文精選】C# 4.0包括大量的增強和新增特性,包括:

1、支持動態(tài)查找

2、同時支持命名參數(shù)和可選參數(shù)

3、增強的COM互操作特性

4、支持方差

本文將只對前面兩項做一些介紹,并提供一些實例,讓你充分了解如果在你的應(yīng)用程序中利用這些特性將會得到什么好處,后面兩項將在未來的文章的進行闡述。

有些C#新特性被合并到微軟新的動態(tài)語言運行庫(DLR)環(huán)境中去了,動態(tài)語言運行庫是.Net框架中的新特性,它可以和靜態(tài)語言進行互操作。

編輯推薦專題《Visual Studio 2010應(yīng)用與開發(fā)》

注意:如果你想親自運行一下本文給出的實例,你需要安裝Visual Studio 2010 Beta 1或更高版本。Visual Studio 2010 Beta版于今年5月中旬與.NET 4.0一起發(fā)布。

理解DLR

DLR是構(gòu)建在通用語言運行庫(CLR)基礎(chǔ)之上的,動態(tài)類型語言如Python,Ruby和JavaScript可以和大家熟悉的靜態(tài).Net語言C#,托管C++,以及VB共存,CLR為靜態(tài)語言(如C#和VB)入駐和互操作提供通用平臺,而DLR位于CLR之上,為動態(tài)語言入駐和互操作提供通用平臺。

DLR增加了一套服務(wù),使得在.Net托管平臺上實施動態(tài)語言更加容易,這些服務(wù)包括支持動態(tài)類型系統(tǒng),標準的主機托管模式,以及快速生成動態(tài)代碼。此外,DLR還讓動態(tài)語言和靜態(tài)語言之間實現(xiàn)了雙向互操作。

為了支持DLR,.Net框架4.0中特地增加了一個System.Dynamic命名空間,動態(tài)語言運行庫包括三層,如圖1所示:

 
圖- 1 DLR的組件:DLR包括.Net語言集成層,一套運行庫代碼組件和語言聯(lián)編程序

1、.Net語言集成層

2、動態(tài)語言運行庫代碼組件

3、語言聯(lián)編程序

DLR提供的服務(wù)包括:

1、動態(tài)方法調(diào)度

2、動態(tài)代碼生成

3、托管API

DLR就簡要介紹這些了,繼續(xù)前進看看C#的新特性。

動態(tài)查找

引入動態(tài)類型后,從方法或表達式返回值時,你就再也不用擔心對象的類型了,運行庫根據(jù)返回值的類型執(zhí)行必要的聯(lián)編。

靜態(tài)和動態(tài)類型

靜態(tài)語言如C#,C++,Java都是在編譯時執(zhí)行類型檢查,與此相反,動態(tài)語言如JavaScript,Perl和Ruby都是在運行時執(zhí)行類型檢查。C#最初被設(shè)計為基于強壯類型的語言,因為編譯器可以確保類型匹配,在開發(fā)周期的早期階段就會發(fā)現(xiàn)bug?,F(xiàn)在情況發(fā)生了變化,在C#中引入了動態(tài)類型,你可以無縫地調(diào)用不同類型的對象了,如COM和JavaScript。

Var和dynamic關(guān)鍵字

為了支持動態(tài)變量聲明,C# 4.0引入了關(guān)鍵字dynamic,在C#中var和dynamic關(guān)鍵字提供了本地類型含義,你不需要在賦值運算符左邊指定數(shù)據(jù)類型,系統(tǒng)會動態(tài)綁定正確的類型。但與dynamic關(guān)鍵字不同的是,使用var時,你必須在賦值運算符的右邊指定類型。使用dynamic關(guān)鍵字時,你不用指定任何類型,所有類型綁定都在運行時完成。

動態(tài)類型示例

光聽似乎理解起來有點難度,我們還是來看看實際的例子吧,仔細研究以下三個業(yè)務(wù)邏輯類,以及每個類中包含的方法:

 
 
 
 
  1. class ProductBL  
  2. {  
  3.    public void ProcessNewProductData()  
  4.    {  
  5.       Console.WriteLine("Process method of the ProductBL " +  
  6.          "class has been called.");  
  7.    }  
  8. }  
  9. class OrderBL  
  10. {  
  11.    public void ProcessNewOrderData()  
  12.    {  
  13.       Console.WriteLine("Process method of the OrderBL " +   
  14.          "class has been called.");  
  15.    }  
  16. }  
  17. class CustomerBL  
  18. {  
  19.    public void ProcessNewCustomerData()  
  20.    {  
  21.       Console.WriteLine("Process method of the CustomerBL " +   
  22.          "class has been called.");  
  23.    }  

正如你所看到的,每個類都有不同的方法,假設(shè)在運行過程中,你需要調(diào)用process方法,這類問題使用動態(tài)類型就很好解決,首先,創(chuàng)建一個包含一系列業(yè)務(wù)邏輯實例類型的enum。

 
 
 
 
  1. public enum BusinessLogicObjectType {   
  2.    ProductBL, CustomerBL, OrderBL }; 

下面的方法返回業(yè)務(wù)邏輯類的一個實例:

 
 
 
 
  1. public static object GetBusinesLogicInstance(  
  2.    BusinessLogicObjectType businessLogicObjectType)  
  3. {  
  4.    switch (businessLogicObjectType)  
  5.    {  
  6.       case BusinessLogicObjectType.ProductBL:   
  7.          return new ProductBL();  
  8.       case BusinessLogicObjectType.CustomerBL:   
  9.          return new CustomerBL();  
  10.       defaultreturn null;  
  11.    }  

現(xiàn)在你就可以使用dynamic關(guān)鍵字,在運行過程中調(diào)用合適的業(yè)務(wù)邏輯實例,如下所示:

 
 
 
 
  1. static void Main(string[] args)  
  2. {  
  3.    dynamic dynamicBLObject = GetBusinesLogicInstance(  
  4.       BusinessLogicObjectType.ProductBL);  
  5.    dynamicBLObject.ProcessNewProductData();  
  6.    Console.Read();  

就這么簡單。

#p#

如圖2所示,執(zhí)行這個應(yīng)用程序時會顯示一條消息“ProductBL類的process方法已經(jīng)被調(diào)用”,在清單1中你可以看到完整的示例代碼。

 
圖- 2 示例輸出:這是動態(tài)調(diào)用業(yè)務(wù)對象類方法的輸出

清單1 Dynamic關(guān)鍵字

 
 
 
 
  1. using System;  
  2.  
  3. namespace NewCSharpFeatures  
  4. {  
  5.    public enum BusinessLogicObjectType { ProductBL, CustomerBL, OrderBL };  
  6.  
  7.    class ProductBL  
  8.    {  
  9.       public void ProcessNewProductData()  
  10.       {  
  11.          Console.WriteLine("Process method of the ProductBL " +   
  12.             "class has been called.");  
  13.       }  
  14.    }  
  15.  
  16.    class OrderBL  
  17.    {  
  18.       public void ProcessNewOrderData()  
  19.       {  
  20.          Console.WriteLine("Process method of the OrderBL " +   
  21.             "class has been called.");  
  22.       }  
  23.    }  
  24.  
  25.    class CustomerBL  
  26.    {  
  27.       public void ProcessNewCustomerData()  
  28.       {  
  29.          Console.WriteLine("Process method of the CustomerBL " +   
  30.             "class has been called.");  
  31.       }  
  32.    }  
  33.  
  34.    class Program  
  35.    {  
  36.       public static object GetBusinesLogicInstance(  
  37.          BusinessLogicObjectType businessLogicObjectType)  
  38.       {  
  39.          switch (businessLogicObjectType)  
  40.          {  
  41.             case BusinessLogicObjectType.ProductBL: return new ProductBL();  
  42.             case BusinessLogicObjectType.CustomerBL: return new CustomerBL();  
  43.             defaultreturn null;  
  44.          }  
  45.       }  
  46.  
  47.       static void Main(string[] args)  
  48.       {  
  49.          dynamic dynamicBLObject = GetBusinesLogicInstance(  
  50.             BusinessLogicObjectType.ProductBL);  
  51.          dynamicBLObject.ProcessNewProductData();  
  52.          Console.Read();  
  53.       }  
  54.    }  
  55. }  

命名參數(shù)和可選參數(shù)

可選參數(shù),默認值和命名參數(shù)是更有趣的新增特性,可選參數(shù)讓你可以避免在調(diào)用方法時必須傳遞參數(shù),默認值讓你在調(diào)用方法不用傳輸參數(shù)時指定其默認值,命名參數(shù)讓你可以使用參數(shù)名字作為參數(shù),而不用提供它們在參數(shù)列表中的位置,意思是你可以不按順序向方法提供參數(shù)。還是來看看實際的例子吧。

看看下面這個方法:

 
 
 
 
  1. static int Add(int x = 0, int y = 0)  
  2. {  
  3.    return (x + y);  

正如你所看到的,參數(shù)x和y都有了默認值,add()方法使用它的參數(shù)列表進行了默認的初始化,現(xiàn)在你可以不用傳遞任何參數(shù)調(diào)用add()方法,如:

 
 
 
 
  1. int result = Add(); 

上面這行代碼會返回0,因為這兩個參數(shù)都使用了其默認值0,當然,你也可以明確地傳遞參數(shù)給這個方法,如:

 
 
 
 
  1. int result = Add(5, 6); // 返回11 

可選參數(shù)應(yīng)該顯示在方法參數(shù)列表的末尾,換句話說就是,可選參數(shù)應(yīng)該最后出現(xiàn),應(yīng)該先指定前面的所有需要的參數(shù),因此,下面的方法是無效的:

 
 
 
 
  1. static int Add(int x = 0, int y)  
  2. {  
  3.    return (x + y);  

如果你編譯這段代碼,將會遇到錯誤“可選參數(shù)必須出現(xiàn)在所有需要的參數(shù)的后面”。

現(xiàn)在你也可以使用命名參數(shù)傳遞值了,這樣就不用記住參數(shù)的順序了,如:

 
 
 
 
  1. int result = Add( y:6, x:5); //返回11  

注意前面這行代碼是先指定的y,后指定的x,這與add()方法中的參數(shù)定義順序是相反的。

小結(jié)

C# 4.0中新增的最重要的特性是dynamic關(guān)鍵字,它讓你在編譯時創(chuàng)建對象類型,即使你不知道對象類型是什么也行。關(guān)于C# 4.0更多的新特性和示例代碼,你可以去MSDN看看。

原文:Explore C# 4's New Dynamic Types and Named/Optional Parameters

作者:Joydip Kanjilal


當前文章:在VisualStudio2010中使用C#4.0的動態(tài)類型
URL網(wǎng)址:http://www.dlmjj.cn/article/cddhogd.html