下面我将为你讲解C#中的delegate委托类型基本学习教程的完整攻略。
什么是delegate(委托)类型?
delegate(委托)是C#的一个重要部分,在GUI开发和事件处理等应用中起着至关重要的作用。delegate(委托)类型可以看作是一个函数指针,使程序员能够在运行时动态地关联一个或多个方法到一个委托实例上,并将委托实例作为参数来传递和调用一个方法。
delegate(委托)的声明语法
delegate 委托返回类型 委托名称(参数列表);
委托返回类型:指向方法的返回值类型。
委托名称:当前委托类型的名称
参数列表:用于定义该委托所引用的方法的参数列表
delegate(委托)的实例化
delegate(委托)实例可以理解为函数指针数组,其中每个元素都可以指向一个方法或一组方法。delegate(委托)的实例化有多种方法,最常用的方法是使用“new”关键字并提供一个方法名称或使用匿名方法,具体方法如下:
实例化委托方法1:使用“new”关键字和方法名称
delegate void MyDelegate(string text); // 声明一个委托类型
class MyClass
{
public static void MyMethod(string text)
{
Console.WriteLine(text);
}
public static void Main()
{
MyDelegate myDelegate = new MyDelegate(MyMethod); // 实例化委托对象,将MyMethod方法添加到委托中
myDelegate("使用new关键字和方法名称实例化委托"); // 调用委托
}
}
实例化委托方法2:使用匿名方法
delegate void MyDelegate(string text); // 声明一个委托类型
class MyClass
{
public static void Main()
{
MyDelegate myDelegate = delegate(string text) // 实例化委托,使用匿名方法
{
Console.WriteLine(text);
};
myDelegate("使用匿名方法实例化委托"); // 调用委托
}
}
delegate(委托)的多播(Multicast)
由于delegate(委托)实例可以理解为函数指针数组,所以它们支持多播(Multicast),即将一个或多个委托实例组合成一个委托实例。调用多播委托时,它将按委托数组中的顺序以同样的参数调用每个委托实例,示例如下:
delegate void MyDelegate(string text); // 声明一个委托类型
class MyClass
{
public static void MyMethod1(string text) { Console.WriteLine(text + " 1"); }
public static void MyMethod2(string text) { Console.WriteLine(text + " 2");}
public static void Main()
{
MyDelegate myDelegate1 = new MyDelegate(MyMethod1);
MyDelegate myDelegate2 = new MyDelegate(MyMethod2);
MyDelegate myDelegate3 = myDelegate1 + myDelegate2; // 将myDelegate1和myDelegate2合并为一个多播委托实例
myDelegate3("调用多播委托"); // 调用多播委托
}
}
以上代码将输出:
调用多播委托 1
调用多播委托 2
小结
delegate(委托)类型是C#的一个重要部分,允许程序员动态地指定一个或多个方法,并将它们作为一个实例传递和调用。委托实例可以看作是函数指针数组,允许使用多播(Multicast)。委托类型在GUI开发和事件处理等应用中起着至关重要的作用。
示例一:实现按钮的回调函数
using System;
namespace DelegateDemo
{
public delegate void ClickEventHandler(string controlName);
//定义ClickEventHandler委托
interface IButton
{
void Click();
event ClickEventHandler ClickEvent;
}
class Button : IButton
{
private string controlName;
public Button(string name)
{
controlName = name;
}
public void Click()
{
if (ClickEvent != null)
{
ClickEvent(controlName);
}
}
public event ClickEventHandler ClickEvent;
}
class Program
{
static void Main(string[] args)
{
IButton sbt = new Button("Submit");
sbt.ClickEvent += new ClickEventHandler(ReactClick);
sbt.Click();
Console.ReadKey();
}
public static void ReactClick(string controlName)
{
Console.WriteLine(controlName+" button clicked!");
}
}
}
运行结果:
Submit button clicked!
示例二:多播委托能否避免对象空引用异常
using System;
namespace DelegateDemo
{
class Program
{
delegate void Hello();
static void Main(string[] args)
{
Hello x, y, z;
x = Hello1; //委托x指向Hello1方法
y = Hello2; //委托y指向Hello2方法
z = x + y; //多播委托z由委托x和y组成
Console.WriteLine("Invoking delegate x:");
x();
Console.WriteLine("Invoking delegate y:");
y();
Console.WriteLine("Invoking delegate z:");
z(); //当调用多播委托时,先执行Hello1的方法,再执行Hello2的方法
Console.ReadKey();
}
static void Hello1()
{
Console.WriteLine("Hello from 1");
}
static void Hello2()
{
Console.WriteLine("Hello from 2");
}
}
}
运行结果:
Invoking delegate x:
Hello from 1
Invoking delegate y:
Hello from 2
Invoking delegate z:
Hello from 1
Hello from 2
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:C#中的delegate委托类型基本学习教程 - Python技术站