浅谈C#委托
当要把方法传递给其他方法时,就需要使用委托。也就是把方法作为参数来传递。
委托是一种特殊的类型对象,其特殊在于我们定义的所有对象都包含数据,而委托包含的只是一个或多个方法的地址。
委托的一个特征是它们类型是安全的,可以确保调用的方法的签名是正确的。既可以调用对象的实例方法,也可以调用静态方法,只要方法的签名和委托的签名一致就行。
自定义委托:
示例:
using System;
namespace ConsoleApp
{
// 声明一个委托 参数double 返回值double
delegate double DoubleOp(double x);
class Program
{
static void Main(string[] args)
{
// 1、使用new关键字
DoubleOp op = new DoubleOp(Action1);
Console.WriteLine(op(4)); // 8
// 2、直接复制 (称为委托推断)
DoubleOp op1 = Action2;
Console.WriteLine(op1.Invoke(4)); // 16
// 说明:
// op(4) 和 op1.Invoke(4)
// 直接使用()和使用委托类的Invoke()方法作用完全相同;
// 使用op1.Invoke(4)底层编译器也会转换为 op1();
Console.Read();
}
static double Action1(double val)
{
return val * 2;
}
static double Action2(double val)
{
return val * val;
}
}
}
泛型委托:
Action<T>和Func<T>
除了使用自定义的委托之外,还可以使用Action<T>和Func<T>泛型委托。
Action<T>:
引用一个无返回类型的方法,可以传递0到16种不同的参数类型。没有泛型参数的Action类可以调用没有参数的方法;
using System; namespace ConsoleApp { class Program { static void Main(string[] args) { // Action 调用无参数的方法 // Action<T> 调用1个参数的方法 // Action<T1, T2> 调用2个参数的方法 // Action<T1, T2, ..., T16> 调用16个参数的方法 // 示例: Action action = Action; action(); Action<string> action1 = Action1; action1(""); Action<string, string> action2 = Action2; action2("", ""); Console.Read(); } static void Action() { Console.WriteLine("Action"); } static void Action1(string val) { Console.WriteLine("Action1"); } static void Action2(string val1, string val2) { Console.WriteLine("Action2"); } } }
Func<T>:
允许调用带返回类型的方法,同样也支持0到16种参数类型。
using System; namespace ConsoleApp { class Program { static void Main(string[] args) { // Func<out T>; 调用带返回类型的无参方法 // Func<in T1, in T2, out T>; 调用2个带参数方法 // Func<in T1, in T2,..., in T16, out T>; 调用16个带参数方法 // out T返回类型 // 示例: Func<double, double> func1 = Action1; Console.WriteLine(func1(4)); // 8 Func<int, double, double> func2 = Action2; Console.WriteLine(func2(4, 2.2)); // 8.8 Console.Read(); } static double Action1(double val) { return val * 2; } static double Action2(int val1, double val2) { return val1 * val2; } } }
多播委托:
前面使用的委托都只包含一个方法的调用,调用委托的次数与调用方法的次数相同。如果要调用多个方法,就需要显示的调用多次委托。
温馨提示: 本文由杰米博客推荐,转载请保留链接: https://www.jmwww.net/file/9986.html