委托
委托是指把事情托付给别人或别的机构办理。在C#语言中委托是一种特殊类,它定义了方法的类型,使得可以将方法当作另一个方法的参数来进行传递。委托是具有特定参数列表和返回类型的方法的引用的类型(不是引用对象,而是引用方法)。
可以委托将看作一个包含有序方法列表的对象,这些方法具有相同的签名和返回类型。这些方法可以来自任何类或结构,只要满足委托的返回类型与委托的参数。也可以是实例方法或者静态方法。
一、委托的应用
委托的使用需遵循三步走原则,分别是定义委托、实例化委托,调用委托。
1、定义声明:
委托定义的语法形式为: [访问修饰符] delegate <返回值类型> 委托名(参数列表); 。
// 定义委托打印方法
public delegate void PrintingMethod(object contents);
2、实例化
定义声明委托后就可以实例化委托,其语法形式为 委托名 委托对象名=new 委托名(方法名);。
// 实例化委托 ***即方法传入委托中
PrintingMethod printingMethod = new PrintingMethod(Log.Printing);
3、调用
调用委托就是执行其调用列表中的所有方法,其语法形式为委托对象名(参数列表);。
// 调用委托实例
printingMethod("委托调用执行方法");
示例:在委托中注入静态方法
using System;
namespace Fountain.Net.Base.Sample
{
class Program
{
// 定义声明
private delegate void PrintingMethod(object contents);
/// <summary>
///
/// </summary>
/// <param name="args"></param>
static void Main(string[] args)
{
// 实例化委托 使用其他类的方法
PrintingMethod printingMethod = new PrintingMethod(Log.Printing);
// 调用委托实例
printingMethod("委托调用执行方法");
//
Console.ReadKey();
}
}
public class Log
{
/// <summary>
/// 打印输出
/// </summary>
/// <param name="contents"></param>
public static void Printing(object contents)
{
Console.WriteLine(string.Format("打印输出:{0}", contents));
}
}
}
输出结果:
打印输出:委托调用执行方法
二、委托的类型
在C#中委托可以分为,命名方法委托、多播委托、匿名委托,其中命名方法委托是最常见的一种委托,在介绍委托的应用时就是命名方法委托。
1、多播委托
多播委托是指在一个委托中注册多个方法,在注册方法时可以在委托中通过+=运算符或通过-=运算符来实现添加或删除方法。
PrintingMethod printingMethod = new PrintingMethod(Log.Printing);
// 添加方法
printingMethod += Log.End;
// 删除方法
printingMethod -= Log.End;
示例:
using System;
namespace Fountain.Net.Base.Sample
{
class Program
{
// 定义声明
private delegate void PrintingMethod(object contents);
/// <summary>
///
/// </summary>
/// <param name="args"></param>
static void Main(string[] args)
{
// 实例化委托 使用其他类的方法
PrintingMethod printingMethod = new PrintingMethod(Log.Printing);
printingMethod += Log.End;
// 调用委托实例 一次执行二个方法
printingMethod("委托调用执行Printing与End方法");
Console.WriteLine();
printingMethod -= Log.End;
// 调用委托实例
printingMethod("委托调用执行Printing方法");
//
Console.ReadKey();
}
/// <summary>
///
/// </summary>
/// <param name="contents"></param>
public static void EndPrinting(object contents)
{
Console.WriteLine(string.Format("打印完成:{0}", contents));
}
}
/// <summary>
/// 定义类
/// </summary>
public class Log
{
/// <summary>
/// 打印输出
/// </summary>
/// <param name="contents"></param>
public static void Printing(object contents)
{
Console.WriteLine(string.Format("打印输出:{0}", contents));
}
/// <summary>
/// 结束
/// </summary>
/// <param name="contents"></param>
public static void End(object contents)
{
Console.WriteLine(string.Format("打印结束:{0}", contents));
}
}
}
输出结果:
打印输出:委托调用执行Printing与End方法
打印结束:委托调用执行Printing与End方法
打印输出:委托调用执行Printing方法
2、匿名委托
匿名委托是指在使用匿名方法注册在委托上,通过定义代码块来实现委托的作用。其格式如下:
// 定义委托
[访问修饰符] delegate 返回值类型 委托名(参数列表);
// 定义匿名委托
委托名 委托对象 = delegate
{
// 代码块
};
// 调用匿名委托
委托对象名 (参数列表);
示例:
using System;
namespace Fountain.Net.Base.Sample
{
class Program
{
// 定义声明
private delegate void PrintingMethod(object contents);
/// <summary>
///
/// </summary>
/// <param name="args"></param>
static void Main(string[] args)
{
object contents = null;
PrintingMethod nonPrintingMethod = delegate
{
Console.WriteLine(string.Format("代码块方式方法:{0}", contents));
};
nonPrintingMethod("匿名委托调用");
//
Console.ReadKey();
}
}
}
小结
以上是关于C#委托的定义、应用及示例全部内容,委托内容还有很多,敬请关注后续内容。