1. 程式人生 > >[C#]泛型,變體,事件,Lambda表達式

[C#]泛型,變體,事件,Lambda表達式

http 技術 有一個 分享圖片 至少 分組 AC oid 添加

定義泛型類型:

(1)定義泛型類(在比較泛型的類型值是否為NULL時只能使用==和!=兩個運算符,兩個泛型類不能進行比較,因為不知道它們是否支持運算符),以及如果說要確定用於創建泛型實例的類型,需要了解它們是引用類型還是值類型。雖然引用類型可以用null來賦值,但值類型就不能了,因此需要用到default關鍵字。default(T1)。
無綁定類型:沒有對它們進行任何約束
(2)約束類型:限制可用於實例化的泛型類型,(比如說限制這個泛型必須是繼承某個類型或者是某個類型啥的),采用where關鍵字來實現。約束必須出現在繼承說明符後面。
(3)從泛型類中繼承:如果某個類型所繼承的基類型中收到了約束,該類型就不能解除約束,也就是說類型T在所繼承的基類型中使用時,該類型必須受到至少與基類型相同的約束。
普通的類型繼承自泛型類型必須指明類型,泛型類型繼承泛型類型可以不指明。
(4)泛型運算符:就是重載各種運算符使得它們能夠進行運算,比如泛型類和泛型類相加,不同的泛型類相加。(註意T該放在哪個位置)
(5)泛型結構體(和泛型類差不多,只不過是值類型了)
定義泛型接口:
和定義泛型類類似,只是需要註意接口就行。

定義泛型方法:如果類是泛型的,就必須為泛型方法使用不同的標識符。
總結一下下:其實也是利用了委托。首先需要哪些東西:集合,然後排序方法或者搜索方法(用於兩個泛型委托)
需要註意的是泛型類型的個數也是對參數列表有影響的。

定義泛型委托:也可以用約束,放<T,T1,T2...>也是在名稱後面。

變體:

都是針對於泛型接口的相關方法:變體分為抗變和協變。
所謂協變就是:當我們有一個繼承了派生類的接口變量,可以使用繼承了基類的接口變量去存儲它。
所謂抗變就是:當我們有一個繼承了基類的接口變量,可以使用繼承了派生類的接口變量去存儲它。
定義協變,需要在類型定義中使用out關鍵字。public interface IMethaneProducer<out T>{...},可以通過繼承IEnumerable<T>來測試,因為IEnumerable<T>是定義了協變的。
定義抗變,需要在類型定義中使用in關鍵字public interface IGrassMuncher<in T>{...}

事件:

對於事件,事件是特殊的委托,是多播委托,可以添加多個事件處理函數,但是委托只能綁定一個處理函數。
對於給事件處理器提供返回值:雖然大部分事件處理程序都使用void類型的返回值。可以為事件提供返回類型,但是會有一些小問題,因為引發給定的事件,可能同時會調用好幾個事件處理程序。如果這些處理程序都有返回值,那麽應該使用哪一個返回值呢,所以對於事件處理程序來說最好是都用空返回類型。

技術分享圖片

Lambda表達式:

前提是需要搞懂匿名方法。要搞明白匿名方法,又需要明白委托。
作用(1):把Lambda表達式用於匿名方法
作用(2):
Lambda表達式是簡化匿名方法的語法的一種方式,實際上還是有其他用處。Lambda表達式由三個部分組成:
(1)放在括號中的參數列表(未類型化),=>運算符只是將參數列表與表達式分開。
(2)=>運算符
(3)C#語句

[C#]泛型,變體,事件,Lambda表達式