天天看點

Efficient C#:為什麼要把泛型作為傳回值

最近做一題關于泛型傳回值的題,結果發現:

1:很多人做錯誤了;

2:很多人疑問,泛型作為傳回值有什麼意義;

題目如下:

“編寫一個函數,要求輸入的參數和輸出的結果都是泛型。”

 (PS:評論中有人指出,題目本身有問題,更合适的描述是:編寫一個函數,要求輸入參數和傳回值的類型都是泛型類型參數)

典型的錯誤回答之一:

典型的錯誤回答之二:

關于錯誤回答1,是因為一想到泛型,很多人便想到集合,沒錯,泛型集合是泛型的一個重要應用場景,但是,這跟泛型本身有什麼關系。

很多人自然就提出來第二個疑問,那讓泛型作為傳回值,有什麼意義呢,我們先來且看下面的例子:

這是remoting中的一個例子,完成的功能是傳回一個遠端對象的執行個體。如果沒有泛型,我們需要為每個遠端對象執行個體的建立都建立一個方法,而有了泛型之後,可以很友善解決這個問題。(PS:本句欠妥,評論指出“沒有泛型的時候我們也可以傳個Type進去再在外面強制類型轉換”,是以,本句說的“解決這個問題”中的這個問題,不應是指編碼更少,更美觀,而更應該是但“使用泛型是高效并類型安全的”)

調用的代碼為:

另外,如果大家對LINQ熟悉的話,會發現LINQ中有不少方法也使用了泛型傳回值,我們來舉一個非常有用的集合方法Find,以下是這個方法的标準實作(.NET内部代碼):

其标準的調用代碼如:

最後,附上本題的标準答案:

繼續閱讀