委派 Delegate - 可能是你天天都用 但是卻不知道的功能
前言
Delegate MSDN的說明是
可用來封裝具名方法或匿名方法的參考型別。 委派大致類似 C++ 的函式指標
如果還是不懂 用的快速記憶法 - 可以裝方法的物件
基本程式碼
public delegate string MyDelegate(int x);
public void Demo()
{
MyDelegate doo= new MyDelegate(Method);
string result = doo.Invoke(5);
}
public string Method(int x)
{
var temp = x.ToString();
return temp;
}
解釋程式碼
一開始宣告 MyDelegate
- MyDelegate 是 委派型別 (感謝Bill叔 提醒)
- 用來裝傳入值是int回傳值是string 的方法
Metod就是實作傳入int回傳string的方法
最後Demo是new 一個 doo 的變數 doo的型別 是MyDelegate 其內容是裝 Metod
然後執行doo(5)
result 會是文字5
可以簡化成
MyDelegate doo = Method;
string result = doo(5);
不過通常在用的時候 都會用簡化的寫法
但是我剛開始在學的時候 很容易會搞混
所以建議還是知道 完整寫法 才容易學習
威力展示
委派可以把方法先定義好傳入和傳出值
讓外部來決定此方法的邏輯
public class BookFilter
{
public delegate List<Book> Filter(List<Book> bookList);
public List<Book> GetBooks(Filter myFilter)
{
List<Book> bookList = GetBookList();
if (myFilter == null)
{
return bookList;
}
return myFilter(bookList);
}
private static List<Book> GetBookList()
{
return new List<Book>()
{
new Book{Id=1, Category = "商業理財", Name="幸福競爭力",Price=237},
new Book{Id=2, Category = "商業理財", Name="最有生產力的一年",Price=300},
new Book{Id=3, Category = "商業理財", Name="五線譜投資術",Price=196},
new Book{Id=4, Category = "電腦資訊", Name="精通 Python",Price=616},
new Book{Id=5, Category = "文學小說", Name="人魚沉睡的家",Price=332},
new Book{Id=6, Category = "文學小說", Name="解憂雜貨店",Price=277},
};
}
}
BookFilter 宣告一個delegate 讓外部 可以放 Filter 方法
然後由外面決定 Filter 方法
使用就像下面的程式碼
public void Demo()
{
BookFilter.Filter myFilter = CheapBookFilter;
BookFilter myBookFilter = new BookFilter();
var books = myBookFilter.GetBooks(myFilter);
}
public List<Book> CheapBookFilter(List<Book> bookList)
{
return bookList.Where(x => x.Price < 300).ToList();
}
就會得到低於300元的書了
結語
對於 delegate 有初步認識後 接下來會聊 Func , 最後聊Lambda Expressions
最後的程式碼看起來會變短很多 大概會像下面這樣
如果內容有誤請多鞭策謝謝