在c#中使用一个类分两个阶段,首选定义这个类,告诉编译器这个类由什么字段和方法组成的,然后使用这个类实例化对象
在我们使用委托的时候,也需要经过两个阶段,首先定义委托,告诉编译器我们这个委托可以指向哪些类型的方法
然后创建该委托的实例
定义委托方法如下:
public delegate string GetAString();
定义了一个委托叫GetAString(); 带有一个int参数 返回值为void
委托的使用:
GetAString myString = new GetAString(x.ToString);
string s = mystring() //通过委托实例去调用方法
把 方法赋值给委托类型变量
GetAString myString = x.ToString;
string s = myString.Invoke();
委托类型可以作为一个方法的参数去传递
public delegate void printString();
static void PrintStr(printString a)
{
a();
}
static void Method1()
{
Console.WriteLine("Method1");
}
使用:
printString method = new printString(Method1);
PrintStr(method);
使用Action委托:没有返回值没有参数的返回值
Action A = voidUse; 传递一个没有参数的函数
Action
Action
使用Func委托类型:带有返回值类型
Func
Func
Func
使用案例:对任何类型的数组进行排序:
(1)使用泛型
static void MaoPao
(2)自定义比较方法:在类中定义比较方法
public static bool Compare(Employee A, Employee B)
{
if (A.salary > B.salary)
return true;
else
return false;
}
这里实现了按照薪水进行比较
(3)在排序内部调用比较方法:传递委托函数作为参数
Func
(4)调用函数:
MaoPao<类名>(类成员数组, 类名.比较函数);
多播委托:一个委托调用多个方法
Func
A += Method1; 添加一个函数
A += Method2; 添加一个函数
函数会按照添加顺序逐个执行,如果一个函数中断 后面的都不会执行
防止中断的方法:
foreach (var a in A.GetInvocationList())
{
a.DynamicInvoke(30);
}
Console.ReadKey();
匿名方法:
本质上是一个方法 实际上没有名字 任何使用委托变量的地方可以用匿名方法赋值
Func
{
return a + b;
};
lambda函数:匿名函数的简化:
Func
{
return a + b;
};
不用传一个具体函数 直接在这里完成函数
当函数参数只有一个的时候,可以不写return和大括号
Func
事件:
事件基于委托,为委托提供了一个发布/订阅机制,我们可以说事件是一种具有特殊签名的委托
事件是类或对象向其他类或对象通知发生事情的一种特殊签名的委托
事件的声明:
public event 委托类型 事件名
返回值是一个委托类型
public delegate void MyDelegate();
public event MyDelegate delegateone;