【理解】C# 委托与事件
程序员文章站
2022-07-12 16:09:35
...
19.10.21
今日份学习知识点
委托类型(Delegate Type)用于定义一个从 System.Delegate 类派生的类型,其功能与 C++ 语言中指向函数的指针功能类似,不同的是 C++ 语言的函数指针只能够指向静态的方法,而委托除了可以指向静态的方法之外,还可以指向实例的方法。
特点:任何类或对象中的方法都可以通过委托来调用,唯一要求:方法参数类型和返回类型必须与委托的一致。
通过委托,可将方法作为实体赋值给变量
———————————————————
事件(Event)是一种使类或对象能够提供通知的成员,本质上是利用委托来实现的。
要在应程序中自定义和引发事件,必须提供一个事件处理程序(事件处理方法),以便与事件关联的委托能自动调用它。
DT.cs(DelegateTest)
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace HLclassTest
{
//1.先定义一个委托类型
public delegate double MyFunc(double d);
class DT
{
//2.声明同格式方法
double Mul(double x)
{
return x * x;
}
double Abs(double x)
{
return Math.Abs(x); //Math类中有好多方法可以用,这个是求绝对值
}
//4.遍历输出(这是两个嵌套的foreach,每从委托中遍历到一个函数,就遍历数组,并将每一个数组元素用函数执行)
public void Output(double[] a,MyFunc func)
{
foreach(var item in a) //foreach遍历数组a
{
Console.WriteLine(func(item)); //从a中得到的值用此时遍历到的函数执行
}
}
internal void Output(double[] a) //方法重载
{
//3.把方法放入到委托当中
MyFunc[] myFuncs = new MyFunc[] { Mul, Abs };
foreach(var item in myFuncs) //从委托中遍历方法
{
Output(a, item); //调用上面的两个参数的Output方法
}
}
}
}
ET.cs(EventTest)
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace HLclassTest
{
class ET
{
//1.事件是利用委托来实现的,先定义一个委托
public delegate void MyEventHandler(string name);
//2.用 event 关键字声明事件
public event MyEventHandler Handler;
//3.定义引发事件时要调用的方法
public void CollegeRoad()
{
Handler(_name); //此时_name是构造方法中传入的参数“Panda”
}
//4.用构造方法注册事件( -= 是取消事件)
string _name;
public ET(string name)
{
_name = name;
this.Handler += Baby; //这几个函数名是在定义函数之后才合法的,通过委托,可将方法作为实体赋值给变量
this.Handler += SchoolTime;
this.Handler += College;
}
public void College(string name)
{
Console.WriteLine(name + ":Wao,time to go to college!");
}
public void SchoolTime(string name)
{
Console.WriteLine(name + ";Yes, time to go to school!");
}
public void Baby(string name)
{
Console.WriteLine(name + ":Little baby is born!");
}
}
}
Program.cs
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace HLclassTest
{
class Program
{
static void Main(string[] args)
{
double[] a = { 12, -31, -434, -123 }; //定义并给数组a赋初值
DT dt = new DT();
dt.Output(a); //调用相应的只有一个参数的函数
ET et = new ET("Panda");
et.CollegeRoad();
Console.ReadKey();
}
}
}