委託學習總結(三)泛型委託

2022-03-11 12:35:53 字數 2485 閱讀 2065

之前,我們學習總結了委託這個概念,也闡述了委託,匿名方法,lambda表示式三者之間的關係,那麼今天再來繼續學習委託更深層次的東西:泛型委託,什麼是泛型,這個概念我也會在之後做出總結,這裡不做很深層次的討論,重點是討論泛型和委託如何配合使用,其實泛型這個概念在這裡也不會對我們對委託的理解有太大的影響,我們只要大概知道泛型就是一種動態的型別,它在使用時可以代表任意型別,下面我們再來回顧一下我們是如何定義普通委託的:

public delegate int 委託名(int a, int b);
這是委託的定義,它的定義有這幾個特點,(1)可以用訪問修飾符修飾。(2)delegate關鍵字。(3)有返回值和引數。

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

public delegate t 委託名(t a, t b);
與之前不同的是,我們把int型別變成了萬能的t型別,這樣寫的好處是什麼呢?

可以想象,我們之前寫了這樣乙個方法來處理加減乘除不同的計算方法:

static void calculate(expression ex, int a, int b)

仔細的你會發現我們封裝的這個方法有很大的侷限性,假如我們某天要計算double,float小數型別或者其他型別的加減乘除時,我們是不是又不得不過載多個不同引數型別的calculate方法,即:

static void calculate(expression ex, double a, double b)

static void calculate(expression ex, float a, float b)

這樣的話是不是**又有重複了,那假設又幾千種不同的型別要去計算呢?我們能不能只寫乙個方法就處理不同型別的加減乘除呢?這時,c#裡有乙個重要的工具:泛型的作用就體現出來了,我們可以把委託和方法定義成泛型的。**如下:

public delegate t expression(t a, t b);

class program

static void calculate(expressionex, t a, t b)

}

我們只需在宣告委託expression<>時,為委託定義int型別就可以了,假如有一天,我要定義double型別,同理只需把expression換成expression即可,這樣寫是不是既節省了**,又讓calculate方法的靈活性變高了。不管是lambda表示式還是泛型,微軟可謂把dry(don't-repeat-yourself)原則發揮的淋漓盡致,其實微軟早已為我們定義好了一套泛型委託供我們使用,以免我們在自己使用時還繁瑣重複的去定義它,他們分別是action,func和predicate

這是我在資料上摘取的這幾個委託的區別:

(1). action

action是無返回值的泛型委託。

action 表示無參,無返回值的委託

action表示有傳入引數int,string無返回值的委託

action表示有傳入引數int,string,bool無返回值的委託

action表示有傳入4個int型引數,無返回值的委託

action至少0個引數,至多16個引數,無返回值。

(2). func

func是有返回值的泛型委託

func表示無參,返回值為int的委託

func表示傳入引數為object, string 返回值為int的委託

func表示傳入引數為object, string 返回值為int的委託

func表示傳入引數為t1,t2,,t3(泛型)返回值為int的委託

func至少0個引數,至多16個引數,根據返回值泛型返回。必須有返回值,不可void

(3). predicate

predicate 是返回bool型的泛型委託

predicate表示傳入引數為int 返回bool的委託

predicate有且只有乙個引數,返回值固定為bool

一般的需求下,我們就使用微軟定義的委託就足夠了,這樣減少了我們對委託的重複定義,可能有部分初學者見到func<>,action<>這樣的**肯定會很懵比,這只是你對新東西陌生罷了,多結合例項敲幾遍,自然就會用了,它們其實就是微軟封裝定義好了的委託,沒有什麼特別的。我們上面的**也可以這樣寫:

class program

static void calculate(funcex, t a, y b)

}

這樣寫用func就省去了定義委託這一步。

同樣,其實在我們的webform,winform框架中,微軟也給我們規範了乙個委託的定義:

delegate void evenhandler(object sender, eventargs e);
都知道上面的object類是所有型別的基類,那eventargs類呢?它其實就是所有包含事件資料類的基類,那什麼是事件呢?,之後的學習總結中,我們來解謎c#另乙個撲朔迷離的東西:事件

C 委託三 泛型委託

今天一直在研究委託,因為有函式指標的基礎,還容易上手,但是對於一些概念和實踐,總是為了弄的非常清楚而糾結,這幾篇關於委託的文章我是結合 c 與.net4高階程式設計 msdn 借鑑其他人的博文來總結話語,以最直接簡潔的話來闡述清楚 在我弄懂之前網上的感覺都很模糊 namespace genericd...

泛型委託學習程序

委託使用總結 1 委託宣告 定義乙個函式原型 返回值 引數型別和個數 注 在類的外部 中介 房產中介商 2 根據委託定義 具體 的方法 注 在類中定義方法 3 建立委託物件,關聯 具體方法 中介商擁有 注意 在主函式中操作 第一種方式 使用new初始化。第二種方式 直接給委託變數賦值方法 4 通過委...

泛型 二 泛型委託

using system using system.collections.generic using system.linq using system.text namespace 泛型委託 public event stackeventhandler,stackeventargs stackev...