1. 程式人生 > >【C#復習總結】細說泛型委托

【C#復習總結】細說泛型委托

聲明 sys red 合成 delegate -s 返回 line ron

1 前言

本系列會將【委托】 【匿名方法】【Lambda表達式】 【泛型委托】 【表達式樹】 【事件】等基礎知識總結一下。(本人小白一枚,有錯誤的地方希望大佬指正)

系類1:細說委托

系類2:細說匿名方法

系列3:細說Lambda表達式

系列4:細說泛型委托

系列5:細說表達式樹

系列6:細說事件

還是用大佬的文章來震場吧,“隨著.net版本的不升級,新版本總要區別於舊版本吧,不然微軟的工程師怎麽向他們的老大交差呀?所以微軟又來玩新花樣了。”

這次我們提前貼代碼來體驗一下泛型委托與一般委托和匿名方法實現委托和Lambda 表達式實現委托的區別。

    class
Program { static void Main(string[] args) { //方法一: Func<int, int, int> cAdd1 = (int x, int y) => { return x + y; }; int result1 = cAdd1(3, 6); //方法二: Func<int, int, int> cAdd2 = (x, y) => { return
x + y; }; int result2 = cAdd2(4, 6); //方法三: Func<int, int, int> cAdd3 = (x, y) => x + y; int result3 = cAdd2(5, 6); Console.WriteLine("{0},{1},{2}",result1, result2, result3); Console.ReadKey(); } }

不管是匿名方法還是Lambda表達式,完成一個委托的應用,都逃不過兩個步驟,一步是定義一個委托,另一步是用一個方法來實例化一個委托。 微軟幹脆把這兩步都合成一步來走了。用Func來簡化一個委托的定義。

至此,一個委托的應用就可用 Func<int, int, int> cAdd3 = (x, y) => x + y; 這樣一句話來完成了,其中的Func就是所謂的泛型委托。

好了,震場完畢,接著我們來解剖一下泛型委托。

2 什麽是泛型委托

泛型委托,什麽是泛型,這個概念我也會在之後做出總結,這裏不做很深層次的討論,重點是討論泛型和委托如何配合使用,其實泛型這個概念在這裏也不會對我們對委托的理解有太大的影響,我們只要大概知道泛型就是一種動態的類型,它在使用時可以代表任意類型,下面我們再來回顧一下我們是如何定義普通委托的:

public delegate int 委托名(int a, int b);

這是委托的定義,它的定義有這幾個特點,(1)可以用訪問修飾符修飾。(2delegate關鍵字。(3)有返回值和參數。

我們之前也說了,委托是一種類型,與之對應的方法必須和它具有相同的簽名,即相同的參數個數,相同的參數類型和相同的返回值類型。我們回顧了普通委托之後再來看一下泛型委托的定義:

public delegate T 委托名<T>(T a, T b);

但是這樣還是不簡單啊,其實微軟早已為我們定義好了一套泛型委托供我們使用,以免我們在自己使用時還繁瑣重復的去定義它,他們分別是ActionFuncPredicate

3 泛型委托的使用

接下來介紹一下微軟定義好的ActionFunc

Func是一種委托,這是在3.5裏面新增的,2.0裏面我們使用委托是用DelegateFunc位於System.Core命名空間下,使用委托可以提升效率,例如在反射中使用就可以彌補反射所損失的性能。

Action<T>Func<T,TResult>的功能是一樣的,只是Action<T>沒有返類型,

Func<T,T,Result>:有參數,有返回類型

Action,則既沒有返回也沒有參數,

Func<T,TResult>的表現形式分為以下幾種:

  • Func<T,TResult>
  • Func<TT1,TResult>
  • Func<T,T1,T2,TResult>
  • Func<T,T1,T2,T3,TResult>
  • Func<T,T1,T2,T3,T4,TResult>

分別說一下各個參數的意義,TResult表示

委托所返回值 所代表的類型, T,T1,T2,T3,T4表示委托所調用的方法的參數類型,

以下是使用示例:

Func<int, bool> myFunc = null;//全部變量

myFunc = x => CheckIsInt32(x); 
//給委托封裝方法的地方 使用了Lambda表達式

private bool CheckIsInt32(int pars)//被封裝的方法
{
  return pars == 5;
}

  bool ok = myFunc(5);//調用委托

但是如果我們需要所封裝的方法不返回值,增麽辦呢?就使用Action

可以使用Action<T1, T2, T3, T4>委托以參數形式傳遞方法,而不用顯式聲明自定義的委托。封裝的方法必須與此委托定義的方法簽名相對應。也就是說,封裝的方法必須具有四個均通過值傳遞給它的參數,並且不能返回值。(在 C# 中,該方法必須返回 void。在 Visual Basic 中,必須通過 SubEnd Sub 結構來定義它。)通常,這種方法用於執行某個操作。

使用方法和Func類似!

Action:既沒有返回,也沒有參數,使用方式如下:

Action 
action = null;//定義action

action =  CheckIsVoid;//封裝方法,只需要方法的名字

action();//調用

總結:

使用Func<T,TResult>Action<T>,而不使用Delegate其實都是為了簡化代碼,使用更少的代碼達到相同的效果,不需要我們顯示的聲明一個委托。

Func<T,TResult>的最後一個參數始終是返回類型,而Action<T>是沒有返回類型的,而Action是沒有返回類型和參數輸入的。

4 總結

弄明白這些,其實就已經夠簡便了,但是為了引申一下,下篇文章講一下表達式樹。

參考文獻:

MSDNhttp://msdn.microsoft.com/zh-cn/library/bb534303(VS.95).aspx

https://www.cnblogs.com/xcj26/p/3536082.html

【C#復習總結】細說泛型委托