C 委託基礎

2022-01-14 19:16:56 字數 3691 閱讀 6242

不知不覺,又開始委託的學習了,感覺這個東西我能學一輩子,哈哈哈!這次看的是官方的參考書(c#高編9),每次看不同的資料,總能學到不同的知識!言歸正傳

1、為什麼要使用委託?

我們習慣於將資料作為引數傳遞給方法,但是很多時候我們需要將乙個方法傳遞給另乙個方法。所以委託就是幹這個的,將方法作為引數,傳遞給另一方法.

舉個例子:在c#中,可以告訴計算機並行執行某些新的執行序列,同時執行當前任務,這個序列就稱之為執行緒,如果要告訴計算機啟動乙個新的執行緒,就必須告訴執行緒入口方法在**,並告訴計算機開始啟動方法的細節,所以執行緒(thread)的建構函式必須帶有乙個引數,該引數定義了執行緒呼叫的方法。這裡就使用到了委託的概念,將方法傳遞給執行緒!

2、委託的特性

在c和c++中,只能提取函式的位址,該位址可以作為引數傳遞給任何需要它的函式,這種方法會導致型別安全問題。但是在.net framework中,當我們進行物件導向程式設計的時候,幾乎沒有方法是孤立存在的,當我們吊用乙個方法前,必須確保這個方法與類例項關聯,所以在.net framework中不允許直接使用方法,或者傳遞方法,如果需要傳遞方法,那麼必須把該方法的細節和引數封裝在乙個類物件中,通過傳遞物件例項的方式,來傳遞方法。但是用類物件來傳遞方法,有點大材小用了,所以.net framework中定義了一種新的型別物件-委託,這種物件專門用來傳遞方法,如果我們要傳遞乙個方法,就必須把方法的細節封裝到委託中。通過委託例項來傳遞方法,所以委託和類其實在某種程度上說是一樣的,委託是一種特殊的類。這種類,專門負責傳遞方法。

3、宣告委託

2中,提到了委託其實是一種特殊的類,所以它的申明方式和類其實是差不多的,只不過類用class來修飾,且類有方法體,而委託使用delegate來修飾沒有方法體,委託必須宣告委託所代表的一類方法的返回值,並且宣告這類方法的引數,**如下:

public

delegate

void mydeleagte(int a);

乙個無返回值,帶乙個int引數的委託申明好了。

如果要定乙個委託,不帶引數,返回乙個string型別的值,**如下:

public

delegate

string mydelegate();

4、委託的結構

當我們定義完乙個委託,實際上是定義了乙個類,委託實現為派生自system.multicastdelegate抽象類的類,system.multicastdelegate又派生字system.delegate,c#編譯器能識別這個類,會使用其委託語法.

5、委託中註冊的方法的使用

委託中方法的呼叫有兩種方式:

a、委託變數加括號的方式,**如下:

public

delegate

void

getstring();

class

program

static

void

aa()

}

b、使用invoke()方法

public

delegate

void

getstring();

class

program

static

void

aa()

}

上面是最常規的委託使用方法,當然還有其他的如:begininvoke()等,這裡不做解釋,如想要了解,請參考c# 委託高階

6、多播委託

上面的例項中,我給乙個委託繫結了多個方法,如果要多次呼叫這些方法,就需要顯示多次吊用。我們把乙個委託,如果這個委託繫結了多個方法,稱為多播委託,如果呼叫多播委託,就可以按順序連續吊用多個方法。為此,委託的簽名必須返回void,否則就只能得到最後乙個方法的返回值。

class

program

static

void mutiplybytwo(double

a) gives

", a, a * 2

); }

static

void square(double

a) gives

", a, a *a);}}

上面是最基本的使用多播委託的方法,但是它存在以下問題

a、對同乙個委託呼叫方法鏈的順序並未正式定義,因此應避免編寫依賴於特定順序的呼叫方法的**。

b、通過乙個委託呼叫多個方法還可能導致大問題,當乙個方法丟擲異常,整個迭代就會停止

b的實現**如下:

class

program

static

void mutiplybytwo(double

a) gives

", a, a * 2

);

throw

new exception("

我出異常啦");

第二行**並沒有正常輸出,ok,那麼將異常捕獲,看它會不會執行第二行**,**如下:

class

program

catch

(exception ex)

console.readline();

}static

void mutiplybytwo(double

a) gives

", a, a * 2

);

throw

new exception("

我出異常啦");

異常**獲,但是第二行**還是沒有執行,這是因為第乙個方法丟擲了異常,所以委託的迭代會停止,不再呼叫下面的方法。

b的解決方法:

為了解決上面的問題,delegate類定義了getinvocationlist方法,他返回乙個delegate陣列。現在可以使用物件吊用委託對應的方法,捕獲異常,並進行下一次迭代,**如下:

class

program

catch

(exception)

}console.readline();

}static

void mutiplybytwo(double

a) gives

", a, a * 2

);

throw

new exception("

我出異常啦");

ok,問題解決,異常順利的捕獲,且委託的迭代正常完成!

C 委託基礎1 委託基礎

委託和其委託的方法必須具有相同的簽名。簽名相同 1.引數型別相同 2.引數數量相同 3.返回值一致 例一 class program static void main string args mm 7,6 console.readline 例二 class program double subtra...

c 委託基礎

委託 1.概念 委託是函式的封裝,它代表一 類 函式。它們都符合一定的簽名 擁有相同的引數列表 返回值型別。同時,委託也可以看成是對 函式的抽象,是函式的 類 2.語法 delegate argument list 3.用法 1.宣告委託,比如 public delegate void del st...

C 基礎 委託

一 委託 當我們需要把方法做為引數傳遞給其他方法的時候,就需要使用委託。因為有時候,我們要操作的物件,不是針對資料進行的,而是針對某個方法進行的操作。我們還是來以 入手 using system using system.collections.generic using system.linq u...