委託與事件

2022-08-13 19:27:11 字數 4035 閱讀 3978

委託(delegate):值得是存有對某個方法的引用的一種引用型別變數。引用可在執行時被改變。

宣告委託(delegate):委託宣告決定了可由該委託引用的方法。委託可指向乙個與其具有相同標籤的方法。

例項化委託(delegate):一旦宣告了委託型別,委託物件必須使用 new 關鍵字來建立,且與乙個特定的方法有關。當建立委託時,傳遞到 new 語句的引數就像方法呼叫一樣書寫,但是不帶有引數。

委託的多播(multicasting of a delegate):委託物件可使用 "+" 運算子進行合併。乙個合併委託呼叫它所合併的兩個委託。只有相同型別的委託可被合併。"-" 運算子可用於從合併的委託中移除元件委託。

委託可以有4中定義方式:

委託的第一種賦值方式:new

委託的第二種賦值方式:直接賦值

委託的第三種賦值方式:匿名方法

委託的第四種瀆職方式:委託變數宣告之後使用+=,-=

//定義乙個 無返回值的 無引數的委託

public delegate void showdelegate();

//定義乙個 無返回值的 有引數的 委託

public delegate void show2delegate(string msg);

//定義乙個 有返回值的 有引數的 委託

public delegate string show3delegate(string msg);

//定義乙個用來測試多播委託的 委託

public delegate void printlogdelegate(string log);

public delegatetest()

;sd_3.invoke("委託的賦值  匿名方法");

console.writeline("*****委託的第4種賦值方式  委託變數宣告之後使用+=、-=    *****");

show2delegate sd_4 = null;

sd_4 += show2;

sd_4 += (msg) => ;

sd_4.invoke("委託變數宣告之後使用+=、-= ");

console.writeline();

console.writeline();

console.writeline();

show2delegate ds2 = new show2delegate(show2);

ds2("這是乙個有引數的委託");

ds2("委託的隱式呼叫");

ds2.invoke("委託的顯示呼叫");

console.writeline("====呼叫有返回值 有引數的委託*****===");

show3delegate sd3 = new show3delegate(show3);

//接收委託的返回值

string str =  sd3.invoke("這是有返回值 有引數的委託的測試");

console.writeline(str);

console.writeline("**********====多播委託********************");

printlogdelegate printlog = null;

printlog += print1;

printlog += print2;

printlog += print3;

//呼叫

printlog.invoke("多播委託的測試");

printlog -= print3;

printlog.invoke("多播委託的測試_去掉乙個方法");

console.readkey();

}public void print1(string log)

public void print2(string log)

public void print3(string log)

public void show()

public void show2(string msg)

public string show3(string msg)

委託(delegate):值得是存有對某個方法的引用的一種引用型別變數。引用可在執行時被改變。

宣告委託(delegate):委託宣告決定了可由該委託引用的方法。委託可指向乙個與其具有相同標籤的方法。

例項化委託(delegate):一旦宣告了委託型別,委託物件必須使用 new 關鍵字來建立,且與乙個特定的方法有關。當建立委託時,傳遞到 new 語句的引數就像方法呼叫一樣書寫,但是不帶有引數。

委託的多播(multicasting of a delegate):委託物件可使用 "+" 運算子進行合併。乙個合併委託呼叫它所合併的兩個委託。只有相同型別的委託可被合併。"-" 運算子可用於從合併的委託中移除元件委託。

委託可以有4中定義方式:

委託的第一種賦值方式:new

委託的第二種賦值方式:直接賦值

委託的第三種賦值方式:匿名方法

委託的第四種瀆職方式:委託變數宣告之後使用+=,-=

//定義乙個 無返回值的 無引數的委託

public delegate void showdelegate();

//定義乙個 無返回值的 有引數的 委託

public delegate void show2delegate(string msg);

//定義乙個 有返回值的 有引數的 委託

public delegate string show3delegate(string msg);

//定義乙個用來測試多播委託的 委託

public delegate void printlogdelegate(string log);

public delegatetest()

;sd_3.invoke("委託的賦值  匿名方法");

console.writeline("*****委託的第4種賦值方式  委託變數宣告之後使用+=、-=    *****");

show2delegate sd_4 = null;

sd_4 += show2;

sd_4 += (msg) => ;

sd_4.invoke("委託變數宣告之後使用+=、-= ");

console.writeline();

console.writeline();

console.writeline();

show2delegate ds2 = new show2delegate(show2);

ds2("這是乙個有引數的委託");

ds2("委託的隱式呼叫");

ds2.invoke("委託的顯示呼叫");

console.writeline("====呼叫有返回值 有引數的委託*****===");

show3delegate sd3 = new show3delegate(show3);

//接收委託的返回值

string str =  sd3.invoke("這是有返回值 有引數的委託的測試");

console.writeline(str);

console.writeline("**********====多播委託********************");

printlogdelegate printlog = null;

printlog += print1;

printlog += print2;

printlog += print3;

//呼叫

printlog.invoke("多播委託的測試");

printlog -= print3;

printlog.invoke("多播委託的測試_去掉乙個方法");

console.readkey();

}public void print1(string log)

public void print2(string log)

public void print3(string log)

public void show()

public void show2(string msg)

public string show3(string msg)

委託與事件

1.建立乙個類,分別建立加 減 乘 除四個方法,通過委託和事件,實現 輸入兩個計算數,完成所有的四個方法的呼叫,計算出結果顯示。建立乙個警察 policeman 類,乙個小偷 thief 類,例項化兩個類的物件,當policeman類中警笛鳴響 alarm 方法執行時,觸發小偷逃跑 runaway ...

委託與事件

委託就是以方法做引數進行傳遞,它定義的是方法的框架,如果用這個委託,所宣告的方法就必須按照給定的引數及返滬型別進行處理。宣告委託的方式 delegate 返回值型別 委託型別名 引數 比如delegate void stringprocess string s 注意這裡的除了前面的delegate,...

委託與事件

委託與事件 一 委託 delegate 1 委託是一種可以把引用儲存為函式的型別。2 在定義了委託後,就可以宣告該委託型別的變數,接著把這個變數初始化為與委託有相同返回型別和引數類別的函式引用,之後,就可以使用委託變數呼叫這個函式,就像該變數是乙個函式一樣。如 double multiply dou...