程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> .NET網頁編程 >> 關於.NET >> 白話說.net事件和委托

白話說.net事件和委托

編輯:關於.NET

在學習C#中時候很早就聽到過委托這個概念,我讀了許多文章都沒能理解它 的含義,園子裡好多是這麼解釋的:“委托相當與c++函數指 針...”

本人沒有學過C++,只模糊的記得在學C語言基礎的時候,對 指針的理解是這樣的,指針是一個本身不存放值的變量,它裡面存放的是另一個 變量的內存地址。所以使我聯想到了值類型變量和引用類型變量。

更是 糊裡糊塗的,在後來的工作學習中,漸漸的理解了它的含義。

問題:

1,委托到底是個什麼東東。

2,什麼時候能用到委托。

聲明:這裡,我們不去探討委托的原理,內部機制等等...只是想把我對委托的 理解,說出來...內容也僅供參考,歡迎改為前輩拍磚。

下面用白話和一 個很白的例子說明問題。

定義一個類,裡面有屬性,方法,有的方法是 通用的,我們可以實現它的代碼。有的方法需要在具體的調用時才能確定它應該 完成的功能,所以這裡定義一個委托,具體的執行代碼在調用時候再實現。這樣 就能根據實現代碼的不同完成不同的操作。覺得是多態的一種表示形式。

還不明白,那看下面這個很“白”的例子:

我們的需 求是這樣的

某飯店 老板讓 購物員去買菜,要買白菜和土豆,最後算出 總價格

老板說:“白菜的價格如果大於3.5元,就扣除白菜的雜質 ,扣除方法是 每1公斤減掉0.3公斤的雜質再買”

購物員:“ 那土豆也是用這個規則麼?”

老板說:“土豆按什麼規則, 扣不扣雜質你自己決定”

購物員暗想:“先去菜市場看看價 格如果土豆的價格大於2.5元就扣雜質。。。”

這裡姑且 買菜怎麼 買法有買方決定

下面實現我們的代碼

//買菜類
public class BuyVegetable
{
double CabbageMoney;
double MurphyMoney;

Code

/// <summary>
/// 買白菜
/// </summary>
/// <param name="price"></param>
/// <param name="amount"></param>
/// <returns></returns>
public void BuyCabbage(double price, double amount)
{
//這裡老板制定的買白菜的方案
// 如果買白菜的價格小於3,就不去雜,如果大於3去去雜
if (price < 3)
{
CabbageMoney = price * amount;
}
else
{
CabbageMoney = (price - 0.3) * amount;
}
}

因為只知道要買土豆,具體怎麼買現在決定不了,所以只能 定 一個 事件。

白話:怎麼買得到到了菜市場才能決定,可是無論怎麼樣都 得有買土豆這回事兒,無論到了菜市場怎麼決定都離不開“價格”和 “數量”這兩個條件,這裡就用到委托了,所以這個事件是委托類型 的。 delegateBuyMurphy(委托的定義在下面)

/// <summary>
/// 購買土豆事件
/// </summary>
public event delegateBuyMurphy eventBuyMurphy;

所以購買 土豆的方法是這樣的

Code

/// <summary>
/// 買土豆
/// </summary>
/// <param name="price"></param>
/// <param name="amount"></param>
public void BuyMurphy (double price, double amount)
{
//這裡只知道購買土豆,但是具 體用怎麼的規則購買,在購買的時候才能決定
MurphyMoney = eventBuyMurphy.Invoke(price, amount);
}

計算總金額

/// <summary>
/// 統計總體價格
/// </summary>
/// <returns></returns>
public double Stat()
{
return CabbageMoney + MurphyMoney;
}

}

購買土豆委托

/// <summary>
/// 購買土豆委托
/// </summary>
/// <param name="price"></param>
/// <param name="x"></param>
/// <returns></returns>
public delegate double delegateBuyMurphy(double price, double x);

使用上面的買菜 類開始購買

protected void Page_Load(object sender, EventArgs e)
{


//實例化類不用說了吧
BuyVegetable buyVegetable = new BuyVegetable();

//購買白 菜,老板制定的死規則不能改直接用這個規則吧。


buyVegetable.BuyCabbage(3.6, 8);


//采購員問:土豆多 少錢斤啊。
//售貨員說:4.8。
//采購員說:等會,我先算算怎麼 買法
//購物員開始制定定買土豆的規則buyVegetable_eventBuyMurphy( 代碼在下面)

//制定完了,這個規則是買土豆這事兒的,當然得給 買土豆這事兒


buyVegetable.eventBuyMurphy += new delegateBuyMurphy(buyVegetable_eventBuyMurphy);

//購買土豆


buyVegetable.BuyMurphy(4.8, 9);

//計算總 價格


this.Response.Write(buyVegetable.Stat());

}
//購買土豆的規則方法 buyVegetable_eventBuyMurphy

Code

/// <summary>
/// 購買土豆規則
/// </summary>
/// <param name="price"></param>
/// <param name="x"></param>
/// <returns></returns>
double buyVegetable_eventBuyMurphy(double price, double x)
{
if (price > 2.5)
{
return (price - 0.3) * x;
}
else
{
return price * x;
}
}

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved