欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

一句話清晰總結C#的協(xié)變和逆變

 更新時間:2022年10月22日 14:12:01   作者:SolidMango  
這篇文章介紹了C#協(xié)變和逆變的工作原理,文中通過示例代碼介紹的非常詳細。對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下

看到過幾篇協(xié)變和逆變的文章,但是總覺得寫得不夠清晰,文章這東西注重要是要把自己想表達的觀點表達出來,這個過程應該是把復雜的東西消化出來從而簡單化,清晰化,而不是故弄玄虛,反其道而行之,下面我們言歸正傳啦。

我們先來看一段MSDN原文給協(xié)變,逆變和變體下個定義:

A generic interface or delegate is called variant if its generic parameters are declared covariant or contravariant. Both C# and Visual Basic enable you to create your own variant interfaces and delegates.

如果泛型接口或委托的泛型參數(shù)聲明為協(xié)變或逆變,則將該泛型接口或委托稱為“變體”。 C# 和 Visual Basic 都允許您創(chuàng)建自己的變體接口和委托。

通俗解釋:

變體定義:帶有協(xié)變或逆變參數(shù)的泛型接口或委托。也就是說協(xié)變和逆變主要關注點在泛型接口或委托。

那什么又是協(xié)變和逆變呢?

我們先來看下面一個來自MSDN的例子:

1 // 協(xié)變
2 IEnumerable<string>strings = new List<string>();
3 IEnumerable<object> objects = strings;

大家看到了么一個聲明為IEnumerable<string>的 接口類型被賦給了一個更低 級別的IEnumerable<object>.
對,這就是協(xié)變。再來看一個例子:

class Base
{
??? public static void PrintBases(IEnumerable<Base> bases)
??? {
??????? foreach(Base b in bases)
??????? {
??????????? Console.WriteLine(b);
??????? }
??? }
}
?
class Derived : Base
{
??? public static void Main()
??? {
??????? List<Derived> dlist = new List<Derived>();
?
??????? Derived.PrintBases(dlist);//由于IEnumerable<T>接口是協(xié)變的,所以PrintBases(IEnumerable<Base> bases)
?????????????????????????????? ?? //可以接收一個更加具體化的IEnumerable<Derived>作為其參數(shù)。
??????? IEnumerable<Base> bIEnum = dlist;
??? }
}

下面給協(xié)變下個定義:

協(xié)變:讓一個帶有協(xié)變參數(shù)的泛型接口(或委托)可以接收類型更加精細化,具體化的泛型接口(或委托)作為參數(shù),可以看成OO中多態(tài)的一個延伸。

// 逆變
// Assume that the following method is in the class: 
// static void SetObject(object o) { } 
Action<object> actObject = SetObject;
Action<string> actString = actObject; 
//委托actString中以后要使用更加精細化的類型string不能再使用object啦!
string strHello(“Hello”); 
actString(strHello);

大家看到了么?一個聲明為Action<object>的類型被賦給了一個Action<string>,大家都知道,Action<T>接收參數(shù),沒有返回值,所以其中的object和string是其參數(shù),這個過程其實就是參數(shù)的約束更加強了,也就是說讓參數(shù)類型更加精細化。下面我們來給逆變下個定義:

逆變:讓一個帶有協(xié)變參數(shù)的泛型接口(或委托)可以接收粒度更粗的泛型接口或委托作為參數(shù),這個過程實際上是參數(shù)類型更加精細化的過程。

一句話總結:協(xié)變讓一個粗粒度接口(或委托)可以接收一個更加具體的接口(或委托)作為參數(shù)(或返回值);逆變讓一個接口(或委托)的參數(shù)類型(或返回值)類型更加具體化,也就是參數(shù)類型更強,更明確。

通常,協(xié)變類型參數(shù)可用作委托的返回類型,而逆變類型參數(shù)可用作參數(shù)類型。 對于接口,協(xié)變類型參數(shù)可用作接口的方法的返回類型,而逆變類型參數(shù)可用作接口的方法的參數(shù)類型。

以上就是這篇文章的全部內容了,希望本文的內容對大家的學習或者工作具有一定的參考學習價值,謝謝大家對腳本之家的支持。如果你想了解更多相關內容請查看下面相關鏈接

相關文章

最新評論