技术归档文章随笔一句话导航搜索关于

C# 委托: delegate、Action、Func

日期: 2021-05-17 分组: .NET 标签: .NETC# 4分钟 744字

委托

委托是一中引用类型,表示对具有特定参数列表和返回类型的方法的引用.同其他引用类型一样,都是对某个对象的引用,只不过普通的引用对象是变量类型,委托的引用对象为方法.在实例化委托时可以与兼容的方法相关联,进而可以通过委托调用方法.

作用:委托的作用是将方法作为参数传递给其他方法.事件处理程序就是通过委托调用方法.

声明委托

1
public delegate <委托类型> 委托名([参数]);

例如

1
pubic delegate void Action(int x, int y);

委托拥有的属性

  • 委托会同时封装对象实例和方法.
  • 允许把一个方法作为参数传递给另一个方法, 可用于定义回调函数.
  • 方法不必与委托类型完全匹配(类型的协变与逆变).
  • Lambda 表达式可编译为委托类型

案例

使用委托定义回调函数

1
public delegate void Callback(string msg);
2
3
public static void Main(string[] args)
4
{
5
var doSomething = new Callback(OutMsg);
6
DoSomething("实现回调", doSomething);
7
}
8
9
public static void OutMsg(string msg)
10
{
11
Console.WriteLine(msg);
12
}
13
14
public static void DoSomething(string msg, Callback callback)
15
{
2 collapsed lines
16
callback(msg);
17
}

使用 Lambda 定义回调函数

1
public void _Main()
2
{
3
DoSomething("实现回调", (msg) =>
4
{
5
Console.WriteLine(msg);
6
});
7
}
8
9
public static void DoSomething(string msg, Callback callback)
10
{
11
callback(msg);
12
}

效果与上述相同

Action

Action是定义在System命名空间下的委托,其封装一个方法,该方法没有返回值, 在 .NET Framework 4.0 及以后的版本中共预定义了 17 个Action委托.

1
public delegate void Action();
2
public delegate void Action<in T>(T obj);
3
public delegate void Action<in T1, in T2>(T1 arg1, T2 arg2);
4
5
...
6
7
public delegate void Action<in T1, in T2, ... , in T16>(T1 arg1, T2 arg2, ... ,T16 arg16);
1
public void _Main()
2
{
3
DoSomething("实现回调", (msg) =>
4
{
5
Console.WriteLine(msg);
6
});
7
}
8
9
public static void DoSomething(string msg, Action<string> callback)
10
{
11
callback(msg);
12
}

在 .NET Framework 4.0 之后的版本,提供了最多 16 个参数的 Action 封装, 3.5 最多 4 个参数.

Func

Func是定义在System命名空间下的委托,其封装一个方法,该方法有返回值,TResult 为其返回值类型, 在 .NET Framework 4.0 及以后的版本中共预定义了 17 个Func委托.

1
public delegate TResult Func<TResult>();
2
public delegate TResult Func<in T, out TResult>(T obj);
3
public delegate TResult Func<in T1, in T2, out TResult>(T1 arg1, T2 arg2);
4
5
...
6
7
public delegate TResult Func<in T1, in T2, ... , in T16, out TResult>(T1 arg1, T2 arg2, ... ,T16 arg16);

总结

ActionFunc 本质是委托,其存在的目的是为了不用每次使用委托都去重新定义,而每次重新定义都是一模一样的,无非就是参数的个数和类型不同,预定义的ActionFunc 提供了最多 16 个参数的委托,这在使用中完全足够.

  1. Action 用于没有返回值的方法(参数可以根据自己情况进行传递)
  2. Func 恰恰相反用于有返回值的方法(同样参数根据自己情况情况)
  3. 记住无返回就用 Action,有返回就用 Func.
下一篇: HTTP 协议
人应当是有理想的.
文章目录