成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

C# 4.0中COM互操作性和方差得到增強

原創
開發 后端
本文將介紹C# 4.0中增強的特性:COM互操作性以及方差,使得你現在在.NET代碼中可以更容易地調用COM對象了,需要執行的類型轉換更少了。

【51CTO獨家特稿】這里將為大家介紹C# 4.0當中的COM互操作性以及方差這兩個新特性。51CTO之前曾報道過C#4.0新特性一覽及歷史回顧

增強的COM互操作性特性

C# 4.0在COM互操作性支持方面提供了很多改進,使得你現在在.NET代碼中可以更容易地調用COM對象了,需要執行的類型轉換更少了,ref關鍵字不再需要,也不再需要主互操作程序集或PIA,從本質上講,C# 4.0提供了大量的新特性,特別是在COM互操作方面更是下足了功夫,在前一篇文章中談到的動態查詢和命名/可選參數的支持,幫助提高了與COM API如Office自動化API互操作的體驗。

例如,下面是C# 4.0以前的版本打開一個Word文件的代碼:

  1. using Word = Microsoft.Office.Interop.Word;  
  2. namespace COMInterop  
  3. {  
  4.    class Program  
  5.    {  
  6.       static void Main(string[] args)  
  7.       {  
  8.          Word.Application wordApplication =   
  9.             new Word.Application() { Visible = true };  
  10.          object missingValue = System.Reflection.Missing.Value;  
  11.          object readOnlyValue = true;  
  12.          object fileName = @"C:\\DevX.docx";  
  13.          wordApplication.Documents.Open(ref fileName, ref   
  14.             missingValue, ref readOnlyValue,  
  15.             ref missingValue, ref missingValue,   
  16.             ref missingValue, ref missingValue,   
  17.             ref missingValue, ref missingValue,  
  18.             ref missingValue, ref missingValue,   
  19.            ref missingValue, ref missingValue,   
  20.            ref missingValue,ref missingValue);  
  21.       }  
  22.    }  

在最后的open調用中,你可以看到需要傳遞大量的可選參數以滿足函數調用,隨著C# 4.0中可選和命名參數的引入,現在做同樣的事情,需要的代碼要少得多了。

下面是C# 4.0中用來打開Word文檔的代碼:

  1. using Word = Microsoft.Office.Interop.Word;  
  2. namespace COMInterop  
  3. {  
  4.    class Program  
  5.    {  
  6.       static void Main(string[] args)  
  7.       {  
  8.          Word.Application wordApplication = new   
  9.             Word.Application() {Visible = true};     
  10.          wordApplication.Documents.Open(@"C:\\DevX.docx",   
  11.             ReadOnly: true);  
  12.       }  
  13.    }  

性能改善

PIA是由COM接口產生的,你可以在你的應用程序代碼中使用這個程序集以一種強類型的方式與COM對象互操作,但它們很笨重,很消耗內存,會顯著降低應用程序的性能。相反,互操作程序集通過前面的代碼編譯生成,只包含你的應用程序真正用到的互操作代碼,從而大大減少了程序集的大小,提高了應用程序的性能。

動態導入大多數COM函數都是接收并返回變量類型,在PIA中表示為對象,因此,當你使用這些方法時,需要使用適當的強制類型轉換,但在C# 4.0中,你可以使用dynamic關鍵字代替COM函數中的object,因此,現在不必再進行類型轉換了。

思考一下下面的代碼,你需要使用轉換在excel文檔中為某個特定單元格設置一個值:

  1. ((Excel.Range)excelObj.Cells[5, 5]).Value =   
  2.    "This is sample text"

上面的代碼需要使用強制類型轉換,但在C# 4.0中,你可以消除掉強制類型轉換了,這一切都得感謝dynamic關鍵字,下面是C# 4.0中的實現方法:

  1. excelObj.Cells[55].Value = "This is sample text"

下面是一個更為完整的例子,使用的是C# 3.0代碼保存excel文檔:

  1. using Excel = Microsoft.Office.Interop.Excel;  
  2. namespace COMInterop  
  3. {  
  4.    class Program  
  5.    {  
  6.       static void Main(string[] args)  
  7.       {  
  8.          var excelApplication = new Excel.Application();  
  9.          excelApplication.Visible = true;  
  10.          dynamic excelWorkBook =   
  11.             excelApplication.Workbooks.Add(  
  12.             System.Reflection.Missing.Value);  
  13.          Excel.Worksheet wkSheetData = (  
  14.             Excel.Worksheet)excelWorkBook.ActiveSheet;  
  15.          excelWorkBook.SaveAs("Testfile.xls",   
  16.             System.Reflection.Missing.Value,   
  17.             System.Reflection.Missing.Value,  
  18.             System.Reflection.Missing.Value,   
  19.             System.Reflection.Missing.Value,   
  20.             System.Reflection.Missing.Value,  
  21.             Excel.XlSaveAsAccessMode.xlShared,   
  22.             System.Reflection.Missing.Value,   
  23.             System.Reflection.Missing.Value,  
  24.             System.Reflection.Missing.Value,   
  25.             System.Reflection.Missing.Value,   
  26.             System.Reflection.Missing.Value);  
  27.       }  
  28.    }  

在C# 4.0中,你不再需要使用缺失值和明確的強制類型轉換了,下面是在C# 4.0中沒有使用缺失值和強制類型轉換的代碼:

  1. using Excel = Microsoft.Office.Interop.Excel;  
  2. namespace COMInterop  
  3. {  
  4.    class Program  
  5.    {  
  6.       static void Main(string[] args)  
  7.       {  
  8.          var excelApplication = new Excel.Application();  
  9.          excelApplication.Visible = true;  
  10.          dynamic excelWorkBook = excelApplication.Workbooks.Add();  
  11.          Excel.Worksheet wkSheetData = excelWorkBook.ActiveSheet;  
  12.           excelWorkBook.SaveAs(  
  13.             "Testfile.xls",  
  14.             AccessMode: Excel.XlSaveAsAccessMode.xlShared);  
  15.       }  
  16.    }  

注意:COM有一個和托管代碼完全不同的編程模型,為了調用COM函數,C#編譯器允許你傳遞參數值,并會產生臨時變量來保存這些值,當函數調用完畢后這些變量就會被丟掉。

方差支持

在C# 4.0中,你可以對泛型類型指定in(僅輸入)好out(只返回)參數,這些參數可以作為唯一的輸入參數或只作為這種類型的返回值被傳遞。

C# 4.0中對方差有兩方面的支持:協方差和方差。如果你必須使用完全匹配正式類型的名稱,那么返回的值或參數是不變的。如果你能夠使用更多的衍生類型作為正式參數類型的代替物,那么參數是可變的。如果你能夠將返回的類型分配給擁有較少類型的變量,那么返回的值是逆變的。

我這里不涉及任何不變量參數,你也應該從C#早期版本中熟悉了。

協方差

使用一個簡單的例子更容易理解協方差,注意string是一個特殊的類型,而object是一個泛型類型,因此string是協變到object的。下面我們來看看C# 4.0中是如何支持協方差的,在C# 4.0中定義的IEnumerable接口如下:

  1. public interface IEnumerable : IEnumerable  
  2. {  
  3.    IEnumerator GetEnumerator();  
  4. }  
  5. public interface IEnumerator : IEnumerator  
  6. {  
  7.   bool MoveNext();  
  8.   T Current { get; }  

在c#的早期版本中,IEnumerable<string>不是IEnumerable<object>。注意前面Ienumerator<out T>定義中的out參數,它表明普通的T只可以在輸出位置,否則編譯器就會報告錯誤,T中的接口是協變的,意味著IEnumerable<P>也是 IEnumerable<Q>用P替換Q所得,因此,一個字符串序列也是一個對象序列,因此下面的語句完全有效:
IEnumerable<object> someObj = new List<string>();

下面的例子說明了你如何在C# 4.0中使用協方差:

  1. namespace Test  
  2. {  
  3.    class Base   
  4.    {  
  5.       //Methods and Properties of the Base Class  
  6.    }  
  7.    class Derived : Base   
  8.    {   
  9.       //Methods and Properties of the Derived Class  
  10.    }  
  11.    class Program  
  12.    {  
  13.       delegate T TestFunction<out T>();  
  14.       static void Main(string[] args)  
  15.       {  
  16.          TestFunction<Derived> derivedObj = () => new Derived();  
  17.          TestFunction<Base> baseObj = derivedObj;  
  18.       }  
  19.    }  

逆變性

C# 4.0中泛型接口的類型參數可以在in修飾字中,允許它們只出現在輸入位置,例如:

  1. public interface IComparer<in T>  
  2. {  
  3.   public int Compare(T left, T right);  

因此,比較器既可以比較對象也可以比較字符串,這就叫做逆變性。逆變性的一個例子就是Equals()函數和CompareTo()函數。如果你有一個函數可以比較兩個基類的實例,那么你也可以使用它比較兩個派生類的實例,你可以在一個類型對象的實例中存儲任何函數調用的結果,因為C#中函數返回的類型是逆變的。

下面是前面例子的逆變副本:

  1. namespace Test  
  2. {  
  3.    class Base   
  4.    {  
  5.      
  6.    }  
  7.    class Derived : Base   
  8.    {  
  9.      
  10.    }  
  11.    class Program  
  12.    {  
  13.       delegate void TestDelegate<in T>(T a);  
  14.       static void Main(string[] args)  
  15.       {  
  16.          TestDelegate<Base> baseObj = (obj) => {   
  17.             System.Console.WriteLine(obj); };  
  18.          TestDelegate<Derived> derivedObj = baseObj;  
  19.       }  
  20.    }  

注意:類型方差只能在接口和委派類型上工作,只有在類型參數之間存在引用轉換才可以應用方差,因此,IEnumerable<int>不是IEnumerable<object>,因為int是一個值類型,object是一個引用類型,也就是說,整數到對象的轉換是箱子轉換,而不是一個引用轉換,因此它不是一個方差的例子。

正如你所看到的,C# 4.0的新特性和主互操作程序集一起可以工作得更好,對可選參數的支持意味著你不用明確地傳遞缺失值給函數,而是用可選參數進行替代,對命名參數的支持意味著不用按照特定的順序傳遞值,只要你使用了名稱就可以識別,對方差的支持消除了許多冗長的,容易出錯的強制類型轉換,總而言之,這些都是十分有益的變化。

【編輯推薦】

  1. C#歷史回顧及C# 4.0新特性一覽
  2. 介紹C# 4.0新特性dynamic
  3. C# 4.0中的協變和逆變
  4. C# 4.0 Dynamic關鍵字全解析
  5. C# 4.0中泛型協變性和逆變性詳解
責任編輯:彭凡 來源: 51CTO
相關推薦

2020-03-03 21:13:20

物聯網融合互操作

2009-02-17 18:41:06

虛擬化紅帽微軟

2009-06-08 10:49:00

JavaFX互操作性Java互操作性

2017-02-06 11:50:12

NFV操作性測試

2017-02-06 14:34:24

NFV網絡功能MANO

2012-09-07 09:51:07

云互操作性云可移植性云計算服務

2010-02-24 15:27:04

ibmdwMashup

2009-07-17 13:49:57

Windows Emb

2018-02-27 15:41:27

IOT語義操作性

2009-02-04 17:11:28

JavaFXJava兼容性

2023-10-13 09:00:00

云計算架構

2023-12-27 14:50:10

2023-06-15 15:40:36

2010-06-25 15:55:43

NetBeans 6.

2012-05-15 16:21:25

2018-03-21 16:38:19

IOT語義API

2015-06-16 09:19:12

OpenStackUnitedStack互操作

2009-08-03 14:36:08

c#組件

2021-08-19 14:12:30

物聯網數據結構IoT

2020-02-14 08:00:00

WindowsLinuxSamba
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 久久久久久免费毛片精品 | 97av视频| 久久久久久久久淑女av国产精品 | 自拍视频国产 | 爱爱综合网 | 国产一区二区三区 | 国产精品一区二区久久 | 黄色片亚洲 | 一区二区免费 | 日韩一区二区在线视频 | 亚洲成人中文字幕 | 国产精品夜夜春夜夜爽久久电影 | 久久99精品久久久久久国产越南 | 亚洲在线一区 | 亚洲国产成人精品女人久久久 | 欧美激情精品久久久久 | 国产精品美女视频 | 在线四虎 | 中国黄色在线视频 | 精品国产18久久久久久二百 | 日韩电影一区二区三区 | 草草视频在线观看 | 一区二区三区视频在线 | 久久亚洲一区二区三 | 午夜一级做a爰片久久毛片 精品综合 | 北条麻妃一区二区三区在线视频 | 成人国产一区二区三区精品麻豆 | 国产视频三级 | 在线观看亚 | 一色一黄视频 | 国产二区在线播放 | 免费一级欧美在线观看视频 | 欧美另类日韩 | 久热久 | 一区二区国产精品 | 中文字幕视频在线观看 | 久久99精品久久久久 | 亚州中文字幕 | 黄色在线观看网址 | 做a的各种视频 | 久久亚洲综合 |