C# action,delegate,func的用法和区别

发布时间 2023-11-28 14:04:20作者: 时而有风

  举个委托的例子:

  小明去书店买一本书。

  1、 买书:

 private delegate void BuyBook();

  2、附近书店 (委托的方法):

public static void Book()
{
    MessageBox.Show("提供书籍");
}

  3、小明和书店建立关系(给委托绑定方法)

 BuyBook buybook = new BuyBook(Book);

  4、小明给钱拿走书:

buybook();

  结果:

  Action的用法

  那有没有一种方法不去定义委托呢?

  Action<T1,T2,T3>:参数都为封装的参数,无返回值。

Action BookAction = Book;
BookAction();

  结果:

  小明现在想买其他书,那么只需要把参数传过去就可以了:

public static void Book(string BookName)
{
    MessageBox.Show($"买一本{BookName}");
}

private void button1_Click(object sender, EventArgs e)
{
    Action<string> BookAction = Book;
    BookAction("《三国演义》");
}

  结果:

  然后小明现在想去其他家书店买,那么就要用到Action<T1,T2>:

public static void Book(string BookName, string BookStore)
{
    MessageBox.Show($"在{BookStore}里买一本{BookName}");
}

private void button1_Click(object sender, EventArgs e)
{
    Action<string, string> BookAction = Book;
    BookAction( "《三国演义》","新华书店");
}

  结果:

 

  Func用法

  小明觉得买书要到书店买太麻烦,能不能网购寄到我家呢?这时可用到Func。

  Func<T1,T2,T3>:最后一个参数(T3)表示返回值类型,前面的(T1,T2)都是形参类型。

  (无参数有返回值

public static string SendBook()
{
    return "买的书送到家里了";
}

private void button1_Click(object sender, EventArgs e)
{
    Func<string> sendBook = SendBook;
    MessageBox.Show(sendBook());
}

  结果:

  接着小明想网购一本《三国演义》(有参数有返回值):

public static string SendBook(string BookName)
{
    var str = $"买的书{BookName}送到家里了";
    return str;
}

private void button1_Click(object sender, EventArgs e)
{
    Func<string, string> sendBook = SendBook;
    MessageBox.Show(sendBook("《三国演义》"));
}

  结果:

 

  总结:

  1. Action用于无返回值的函数(参数个数可根据需要传入)
  2. Func用于有返回值的函数(参数个数可根据需要传入)