台灣最大程式設計社群網站
線上人數
788
 
會員總數:244115
討論主題:188481
歡迎您免費加入會員
討論區列表 >> ASP.NET >> 使用委派的時機與優點
[]  
[我要回覆]
1
回應主題 加入我的關注話題 檢舉此篇討論 將提問者加入個人黑名單
使用委派的時機與優點
價值 : 50 QP  點閱數:337 回應數:8

樓主

小強
門外漢
0 24
434 31
發送站內信

各位前輩大家好~~~
今天又來勞煩各位了,在這兩年中,有空我會去看看網路上委派的文章,
很多人問~~為何不直接調用方法,也有很多人答,但怎麼看我總是理會不出委派的的優點,
我在網路上曾看過有作者以加減法來說明,我照著做,仍看不出委派的優點,想請問大家的意見,
若能說明,是否可以實境實例來說明:

我先講解我的部份:

先宣告委派型別
public delegate int CalDelegate(int x, int y);
...............................................

另外有Calculate類別,內有成員Add和Minus方法

public class Calculate
{

public int Add(int a, int b)
{

return a + b;

}
public int Minus(int a, int b)
{

return a - b;

}
}


以下是controller供前端呼叫~~前端傳來的_type有Add和Minus~~~並傳兩個值_val1和_val2~~利用了反射調用對應的方法來運算
public ActionResult Index(string _type, int _val1, int _val2)
{
MethodInfo handler = typeof(Calculate).GetMethod(_type);
CalDelegate Calculater= (CalDelegate)Delegate.CreateDelegate(typeof(CalDelegate),null, handler);
int result = Calculater(_val1, _val2);

return.........
}


.............................................................................................

可是我發現我改為下列~~~我不做委派~~~我單單做反射也方便~~也不用做一堆if判斷~~~

public ActionResult Index(string _type, int _val1, int _val2)
{

Type Calculate= System.Type.GetType("xxx.Controllers.Calculate");
object obj = Activator.CreateInstance(Calculate);
MethodInfo handler = typeof(Calculate).GetMethod("Add");
int result = (int)handler.Invoke(obj, new Object[] { 1, 2 });
return ...........
}





所以我還是看不到委派的優點在哪~~~希望前輩們可以提供委派使用時機範例,並點出優點
感恩

搜尋相關Tags的文章: [ 委派 ] ,
本篇文章發表於2018-12-13 15:49
別忘捐VP感謝幫助你的人 新手會員瞧一瞧
1樓
回應

Allen
捐贈 VP 給 Allen 檢舉此回應
由於你一直想不出委派有什麼好的,我們就先不要用它了
先看你的程式就好了, 日後傳給action的如果不是"add",而是"xxx"
你會發現, 程式可以通過編譯, 你開心上傳後, 才會看到發生錯誤, 請問, 這部份你會想改善嗎? 顯然用了Reflection不容易改善, 你要不要改一下寫法? 看看不要用Reflection時,怎麼寫比較好
本篇文章回覆於2018-12-13 22:16
== 簽名檔 ==
--未登入的會員無法查看對方簽名檔--
2樓
回應

小羊窒息
捐贈 VP 給 小羊窒息 檢舉此回應
delegate ...我好像只寫過1次還是2次...,

我記得當時是用在我自己寫的分頁元件,
(就是一頁10, 20筆那種, 有上一頁, 下一頁, 跳頁...的元件)

最初分頁元件是直接綁DataGrid(那個真的很久了, 那時還是SQL 2000的時代),

後來因為特殊需求, 沒有要綁DataGrid, 而是要直接提供, [完成分頁處理後的DataTable],
在那時我有用到 delegate,

當時就是設計成, 在元件上點2下時, 自動產生預設事件(有點像是在button點2下那樣),
然後該事件可以直接存取[完成分頁處理後的DataTable]


(整體來說, 有點像是 GridView的 GridView1_RowCommand 那一類的)...

本篇文章回覆於2018-12-16 01:17
== 簽名檔 ==
--未登入的會員無法查看對方簽名檔--
3樓
回應

誰是誰
檢舉此回應
其實第一個寫法的前面也是反射啊。但是原來寫法的第一個參數是 "Add" 或 "Minus" 也就是方法名稱。樓主用的方式是把第一個參數當成型別名稱。.
我們把好壞放一邊,單純討論第一個做法:

本篇文章回覆於2018-12-17 09:10
== 簽名檔 ==
--未登入的會員無法查看對方簽名檔--
4樓
回應

誰是誰
檢舉此回應
剛剛沒寫完,他既然取得 MethodInfo,那直接 Invoke 的就好了,所以我覺得這個例子本身要表達委派的優點是不適切的。
本篇文章回覆於2018-12-17 09:27
== 簽名檔 ==
--未登入的會員無法查看對方簽名檔--
5樓
作者回應

小強
檢舉此回應
那麼請問誰是誰,請問你有比較能表達出委派優點的實境實例嗎?
謝謝
本篇文章回覆於2018-12-17 11:02
== 簽名檔 ==
--未登入的會員無法查看對方簽名檔--
6樓
最有價值解答

Allen
捐贈 VP 給 Allen 檢舉此回應
你提問的最後一份程式裡, 其實已認定了method的來源一定存放在Calculate class裡, 但,這是不一定的,限制了以後的應用
如果你傳給Index method的是一個委派, 就可以直接叫用, 不必管它屬於哪一個型別

本篇文章回覆於2019-03-08 08:09
== 簽名檔 ==
--未登入的會員無法查看對方簽名檔--
7樓
作者回應

小強
檢舉此回應
謝謝Allen大哥幫我點出方向~~我終於可以好好思考問題點了~~
感謝再感謝
本篇文章回覆於2019-03-08 09:07
== 簽名檔 ==
--未登入的會員無法查看對方簽名檔--
8樓
回應

Allen
捐贈 VP 給 Allen 檢舉此回應
打個廣告, 我之前有出委派的課程
https://www.tibame.com/course/445
若有需要,可以email跟我說, 給你折扣價
本篇文章回覆於2019-03-08 15:07
== 簽名檔 ==
--未登入的會員無法查看對方簽名檔--
   
1

回覆
如要回應,請先登入.