av激情亚洲男人的天堂国语,日韩欧美精品一中文字幕,无码av一区二区三区无码,国产又色又爽又刺激的a片,国产又色又爽又刺激的a片

C#2010協(xié)變和逆變的新特性

1. 協(xié)變和逆變
開發(fā)時(shí)經(jīng)常與到以下的問題,首先看代碼:

站在用戶的角度思考問題,與客戶深入溝通,找到沛縣網(wǎng)站設(shè)計(jì)與沛縣網(wǎng)站推廣的解決方案,憑借多年的經(jīng)驗(yàn),讓設(shè)計(jì)與互聯(lián)網(wǎng)技術(shù)結(jié)合,創(chuàng)造個(gè)性化、用戶體驗(yàn)好的作品,建站類型包括:成都做網(wǎng)站、成都網(wǎng)站建設(shè)、企業(yè)官網(wǎng)、英文網(wǎng)站、手機(jī)端網(wǎng)站、網(wǎng)站推廣、國際域名空間、虛擬空間、企業(yè)郵箱。業(yè)務(wù)覆蓋沛縣地區(qū)。

定義一個(gè)水果類和繼承了該類的蘋果類:

public class Fruit
{
    public string Name { get; set; }
}

public class Apple : Fruit
{

}

有一個(gè)方法接收一個(gè)元素類型為Fruit的泛型集合,如下所示:

static void Output(List
     
       fruits)
      
{
    foreach (Fruit f in fruits)
        Console.WriteLine(f.Name);
}

由于Apple類繼承自Fruit,所以很自然的認(rèn)為以下代碼“應(yīng)該”能夠正常運(yùn)行:

static void Main(string[] args)
{
    List apples = new List ();

    Output(apples);

    Console.ReadLine();
}

但實(shí)際上在.NET Framework 4.0以前的版本中這段代碼不能通過編譯。還有另外一種相似的情況,在Windows窗體應(yīng)用程序中鼠標(biāo)點(diǎn)擊事件和鍵盤按鍵事件擁有不同類型的事件參數(shù)MouseEventArgs和KeyPressEventArgs,這兩個(gè)類均繼承自EventArgs,如果希望在這兩件事件觸發(fā)時(shí)執(zhí)行相同的操作,期望編寫以下“通用”的事件處理程序附加到兩個(gè)事件上是行不通的:

private void Form1_UserAction(object sender, EventArgs e)
{

}

只能須創(chuàng)建兩個(gè)單獨(dú)的事件處理程序來執(zhí)行操作。

Visual C# 2010 中引入的協(xié)變和逆變解決了類似于這樣的問題。

在泛型接口和委托中協(xié)變(covariance)可以使用泛型參數(shù)所定義類型的繼承類型,逆變(contravariance)用于使用更一般的類型。一個(gè)泛型接口或委托的泛型參數(shù)被聲明為協(xié)變或逆變時(shí)該接口或委托稱為變體。在.NET Framework 4和Visual Studio 2010中,C#和Visual Basic均支持變體泛型接口和委托,并且允許泛型參數(shù)的隱式轉(zhuǎn)換,而且這兩種語言都允許創(chuàng)建自定義變體接口和委托。變體只支持引用類型,值類型不支持變體。

使用協(xié)變,第一個(gè)問題可以解決,這些代碼在Visual Studio 2010中能夠正確編譯并運(yùn)行。使用逆變可以解決第二個(gè)問題,這時(shí)事件處理程序使用了“更一般”的類型(該事件的委托允許使用更一般的類型)。

2. 接口中的變體
在.NET Framework 4中對(duì)一些已存在的泛型接口引入了變體支持,這支持實(shí)現(xiàn)了這些接口的類的隱式轉(zhuǎn)換。這些接口是:

IEnumberable
      
      
IEnumerator
IQueryable
IGrouping
IComparer
IEqualityComparer
IComparable

開發(fā)人員還可以在泛型類型參數(shù)上使用in和out關(guān)鍵字以聲明變體泛型接口。

2.1 使用out關(guān)鍵字聲明協(xié)變泛型參數(shù),例如以下代碼:

interface IFileCollection
     
      
{

}

但是該變體類型T必須遵守以下規(guī)則:

1. 該類型不能作為方法參數(shù)而只能作為返回類型。

interface IFileCollection
     
      
{
    T IndexOf(int i);
}

2. 第一個(gè)規(guī)則有一個(gè)特殊情況是當(dāng)方法參數(shù)是逆變泛型委托時(shí)可以將該類型作為該委托的泛型類型參數(shù)。

interface IFileCollection
     
      
{
    void Delete(Action file);
}

3. 該類型不能作為接口方法中泛型類型的約束,例如以下代碼是錯(cuò)誤的

interface IFileCollection
     
      
{
    void Display where R : T;
}

2.2. 使用in關(guān)鍵字聲明逆變泛型參數(shù)。逆變類型僅能用于方法的參數(shù)和泛型類型約束而不能作為返回類型。

interface IOperator
     
      
{
    void Increace(T value);

    void Double () where R : T;
}

2.3. 可以在一個(gè)接口中同時(shí)使用out和in定義協(xié)變和逆變,但仍需遵守相應(yīng)規(guī)則。

2.4. 實(shí)現(xiàn)變體接口時(shí)語法與普通接口語法一致,但實(shí)現(xiàn)了變體接口的類不在是變體的。如果某個(gè)接口繼承自變體接口,根據(jù)需要使用in或out來指定子接口是否仍然為變體類型。如果某個(gè)接口同時(shí)繼承了變體接口和非變體接口,那么該接口為非變體類型,并且不能從逆變接口繼承為協(xié)變接口。

3. 委托中的變體
.NET Framework 4 中為某些已存在的泛型委托引入變體支持,這些支持在使用委托類型匹配方法簽名時(shí)提供了很大的靈活性,這些委托是:

System命名空間下的Action委托,例如Action 和Action

System命名空間下的Func委托,例如Func 和Func

Predicate 委托

Comparison 委托

EventHandler 委托(正是由于該委托的存在解決了我們的第2個(gè)問題)

Converter 委托。

同樣可以使用out和in關(guān)鍵字定義協(xié)變和逆變泛型參數(shù),仍然需要遵守在接口中定義時(shí)相應(yīng)的規(guī)則。定義完成之后使用原來的委托訪問語法實(shí)例化和調(diào)用委托即可

4. 總結(jié)

Visual C# 2010中新提供了協(xié)變和逆變的新特性,一個(gè)泛型接口或委托的泛型參數(shù)被聲明為協(xié)變或逆變時(shí)該接口或委托稱為變體,這為我們解決類似于開篇中的兩類問題帶來了便利。.NET Framework 4中已為現(xiàn)有的一些接口和委托增加了變體支持,并且開發(fā)人員可以使用in和out關(guān)鍵字定義自己的變體接口和委托,但在定義時(shí)需要遵守相應(yīng)的規(guī)則。


新聞標(biāo)題:C#2010協(xié)變和逆變的新特性
轉(zhuǎn)載源于:http://uogjgqi.cn/article/dpgdhjd.html
掃二維碼與項(xiàng)目經(jīng)理溝通

我們?cè)谖⑿派?4小時(shí)期待你的聲音

解答本文疑問/技術(shù)咨詢/運(yùn)營咨詢/技術(shù)建議/互聯(lián)網(wǎng)交流