[C#] 委派 Delegate - 簡化程式碼歷史 第一章

委派 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
最後的程式碼看起來會變短很多 大概會像下面這樣

 

 

如果內容有誤請多鞭策謝謝