日韩无码专区无码一级三级片|91人人爱网站中日韩无码电影|厨房大战丰满熟妇|AV高清无码在线免费观看|另类AV日韩少妇熟女|中文日本大黄一级黄色片|色情在线视频免费|亚洲成人特黄a片|黄片wwwav色图欧美|欧亚乱色一区二区三区

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

新聞中心

這里有您想知道的互聯(lián)網(wǎng)營銷解決方案
C#4.0中COM互操作性和方差得到增強(qiáng)

【獨(dú)家特稿】這里將為大家介紹C# 4.0當(dāng)中的COM互操作性以及方差這兩個(gè)新特性。之前曾報(bào)道過C#4.0新特性一覽及歷史回顧。

增強(qiáng)的COM互操作性特性

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

例如,下面是C# 4.0以前的版本打開一個(gè)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.    }
  23. }

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

下面是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.    }
  14. }

性能改善

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

動態(tài)導(dǎo)入大多數(shù)COM函數(shù)都是接收并返回變量類型,在PIA中表示為對象,因此,當(dāng)你使用這些方法時(shí),需要使用適當(dāng)?shù)膹?qiáng)制類型轉(zhuǎn)換,但在C# 4.0中,你可以使用dynamic關(guān)鍵字代替COM函數(shù)中的object,因此,現(xiàn)在不必再進(jìn)行類型轉(zhuǎn)換了。

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

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

上面的代碼需要使用強(qiáng)制類型轉(zhuǎn)換,但在C# 4.0中,你可以消除掉強(qiáng)制類型轉(zhuǎn)換了,這一切都得感謝dynamic關(guān)鍵字,下面是C# 4.0中的實(shí)現(xiàn)方法:

 
 
 
  1. excelObj.Cells[5, 5].Value = "This is sample text";

下面是一個(gè)更為完整的例子,使用的是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.    }
  29. }

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

 
 
 
  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.    }
  17. }

注意:COM有一個(gè)和托管代碼完全不同的編程模型,為了調(diào)用COM函數(shù),C#編譯器允許你傳遞參數(shù)值,并會產(chǎn)生臨時(shí)變量來保存這些值,當(dāng)函數(shù)調(diào)用完畢后這些變量就會被丟掉。

方差支持

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

C# 4.0中對方差有兩方面的支持:協(xié)方差和方差。如果你必須使用完全匹配正式類型的名稱,那么返回的值或參數(shù)是不變的。如果你能夠使用更多的衍生類型作為正式參數(shù)類型的代替物,那么參數(shù)是可變的。如果你能夠?qū)⒎祷氐念愋头峙浣o擁有較少類型的變量,那么返回的值是逆變的。

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

協(xié)方差

使用一個(gè)簡單的例子更容易理解協(xié)方差,注意string是一個(gè)特殊的類型,而object是一個(gè)泛型類型,因此string是協(xié)變到object的。下面我們來看看C# 4.0中是如何支持協(xié)方差的,在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; }
  9. }

在c#的早期版本中,IEnumerable不是IEnumerable。注意前面Ienumerator定義中的out參數(shù),它表明普通的T只可以在輸出位置,否則編譯器就會報(bào)告錯(cuò)誤,T中的接口是協(xié)變的,意味著IEnumerable

也是 IEnumerable用P替換Q所得,因此,一個(gè)字符串序列也是一個(gè)對象序列,因此下面的語句完全有效:
IEnumerable someObj = new List();

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

 
 
 
  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 derivedObj = () => new Derived();
  17.          TestFunction baseObj = derivedObj;
  18.       }
  19.    }
  20. }

逆變性

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

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

因此,比較器既可以比較對象也可以比較字符串,這就叫做逆變性。逆變性的一個(gè)例子就是Equals()函數(shù)和CompareTo()函數(shù)。如果你有一個(gè)函數(shù)可以比較兩個(gè)基類的實(shí)例,那么你也可以使用它比較兩個(gè)派生類的實(shí)例,你可以在一個(gè)類型對象的實(shí)例中存儲任何函數(shù)調(diào)用的結(jié)果,因?yàn)镃#中函數(shù)返回的類型是逆變的。

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

 
 
 
  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 baseObj = (obj) => { 
  17.             System.Console.WriteLine(obj); };
  18.          TestDelegate derivedObj = baseObj;
  19.       }
  20.    }
  21. }

注意:類型方差只能在接口和委派類型上工作,只有在類型參數(shù)之間存在引用轉(zhuǎn)換才可以應(yīng)用方差,因此,IEnumerable不是IEnumerable,因?yàn)閕nt是一個(gè)值類型,object是一個(gè)引用類型,也就是說,整數(shù)到對象的轉(zhuǎn)換是箱子轉(zhuǎn)換,而不是一個(gè)引用轉(zhuǎn)換,因此它不是一個(gè)方差的例子。

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


網(wǎng)頁名稱:C#4.0中COM互操作性和方差得到增強(qiáng)
本文URL:http://m.5511xx.com/article/dpshpid.html