C# action,delegate,func的用法和区别
举个委托的例子:
小明去书店买一本书。
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("《三国演义》"));
}
结果:
总结:
- Action用于无返回值的函数(参数个数可根据需要传入)
- Func用于有返回值的函数(参数个数可根据需要传入)