一、簡述:
委託對與我們程式設計人員來說,一點都不陌生,在實際工作過程中,或多或少都應該是接觸過
但是對與程式設計新手來說,對與委託的理解和使用應該還是乙個坎,但是只要理解清楚了,這個坎也就過去了。
二、定義:
委託,其實在我們日常生活中,也經常用到委託的,比如:律師其實就是充當了乙個委託的角色,當事人委託律師在法庭上對其訴訟辯護。
在c#中,委託簡單的理解就是將乙個方法以引數的形式傳遞到另外乙個方法中去,有點類似於c++中的指標的概念。
三、實現委託的步驟:
在委託定義的時候,我們只需要定義乙個結構體,至於具體的實現,需要在具體的委託方法中來實現。
實現委託的步驟,我總結如下:
其一、定義:要宣告乙個委託的結構體:delegate void mydelegate(type1 para1,type2 para2);
其二、宣告:宣告就是要宣告乙個委託變數:mydelegate mydel;
其三、例項化:就是要對宣告的委託物件例項化具體的委託方法:mydel=new mydelegate(obj.instancemethod);
其四、引數傳遞:簡單的理解,就是將委託以乙個引數的形式傳遞給乙個方法:mymethod(mydel);
其五、委託方法執行:這個和普通方法實現呼叫一樣,就是在方法mymethod裡面呼叫執行委託的方法:mydel(obj.instancemethod)
四、使用
委託的使用,根據平時的開經驗,委託其實在實際的使用中,有兩種場景:
其一、同步使用:同步執行委託,阻塞主流程(和平時的方法執行效果一樣)
namespacemycalculat
return0;
}//////
計算具體邏輯處理
/// ///
mydelegate計算委託變數
///引數1 ///
引數2 ///
計算處理結果
public
int calculopert(mydelegate caldel, int num1, int
num2)
//////
相加
/// ///
引數1 ///
引數2 ///
結果 public
int add(int num1, int
num2)
//////
相法
/// ///
引數1 ///
引數2 ///
結果 public
int reduce(int num1, int
num2)
}}
其二、非同步使用:不阻塞主流程的執行,非同步執行緒去執行委託方法裡面的邏輯
namespacemycalculat
return0;
}//////
計算具體邏輯處理
/// ///
mydelegate計算委託變數
///引數1 ///
引數2 ///
計算處理結果
public
int calculopert(mydelegate caldel, int num1, int
num2)
);return
resout;
}//////
處理非同步執行結果邏輯
/// ///
非同步處理結果
public
void
asyncopert(iasyncresult resout)
else
}//////
相加
/// ///
引數1 ///
引數2 ///
結果 public
int add(int num1, int
num2)
//////
相法
/// ///
引數1 ///
引數2 ///
結果 public
int reduce(int num1, int
num2)
}}
委託結合反射的使用:這中情況的使用場景是:當不同的委託其對於的引數個數或者引數型別不盡相同,那麼這時候就在呼叫委託方法時,就不能簡簡單單的呼叫執行
這種情況在實際工作中場景舉例:比如我們在使用快取機制時候,都要使用到委託通反射相結合使用。
//////calculat類
/// public
class
calculat
//////
獲取使用者常用產品
/// ///
使用者id
///獲取條數
///獲取結果
public
string getcommonprointo(string userid, int
cout)
}//////
產品相關操作的業務邏輯處理
/// public
class
probuss
//////
獲取使用者常用產品
/// ///
使用者id
///獲取條數
///獲取結果
public
string getcommonprointo(string userid, int
cout)
}//////
快取操作類
/// public
class
chachhelp
catch
(exception ex)
//// 如果快取中沒有獲取到資料,那麼就直接通過方法獲取資料
if (obj == null
)
}//// 型別轉換,將obj轉換為對應的資料型別
//// 此處先簡略的直接用強制轉換一波
t tobj =(t)obj;
return
tobj;
}}
五、小結:
從上面的委託**中可以發現,引入委託後,程式設計人員可以把方法的引用封裝在委託物件中
(把過程的呼叫轉化為物件的呼叫,充分體現了委託加強了物件導向程式設計的思想。),
然後把委託物件傳遞給需要引用方法的**,這樣在編譯的過程中我們並不知道呼叫了哪個方法,
這樣一來,c#引入委託機制後,使得方法宣告和方法實現的分離,充分體現了物件導向的程式設計思想。
C 中委託的使用
在類中宣告乙個委託 關鍵字 delegate 類似於定義了乙個抽象函式 public delegate int add int m,int n 定義它的例項,如a public add a 在使用它的類中具體實現並進行關聯 例如add宣告及例項化是在類c中,則在使用的它的類如form1類中具體寫個方...
理解c 中委託
1.我們對委託做乙個總結 委託是乙個類,它定義了方法的型別,使得可以將方法當作另乙個方法的引數來進行傳遞,這種將方法動態地賦給引數的做法,可以避免在程式中大量使用if else switch 語句,同時使得程式具有更好的可擴充套件性。正確理解委託的列子 usingsystem usingsystem...
C 中委託與事件的學習小結(二)
接上篇繼續寫,順便也做個記錄 下面該介紹事件了。事件就是在委託型別前面加上乙個event關鍵字,就變成了事件了,事件的具體一些用法也和委託非常類似!哈哈,這麼理解應該沒毛病吧 當然,兩者之間還是有區別的。我們用乙個小例子來做個 明。例 class program static void main s...