using System.Collections;
public class CallClass {
//定义一个委托,可以声明在类里面,也可以在外面
public delegate void DelegateFun(int i);
//定义一个委托类型的对象,DelegateFun中的传入是方法名,传入的这个方法的参数种类和数量要一致
DelegateFun df=new DelegateFun(Way);
//执行df()时,相当于执行Way()方法
//声明一个DelegateFun类型的事件:
public event DelegateFun delegateFunEvent;
public void Way(int i) {
print("传入的参数为"+i);
delegateFunEvent();
}
}
在另一个类中注册事件:
class MyClass {
CallClass cc=new CallClass();
void Main(string[] args){
//注册事件
cc.delegateFunEvent+=this.EventWay;
cc.df(0);
//注销事件
cc.delegateFunEvent-=this.EventWay;
}
void EventWay(int i){
print("事件引发的方法,并且传入的参数为"+i);
}
}
匿名方法就是在定义委托时直接在{}内写方法体:
DelegateFun anonymous=delegate(int i) {
print("匿名委托方法被调用,传入的参数为"+i);
}
lamuda表达式是匿名方法,符号为:
(参数列表)=>{要执行的方法内容}
若没有参数,必须加()=>print ("lamuda方法");
C#内置委托:
System.Action action返回值为void;
System.Func<T> func返回值为T;
可以配合lamuda使用
例如:
void ActionFun(int i, System.Action action, System.Action action2) {
if(i==0) action();
if(i==1)action2();
}
void ActionDebug() {
print("输出ActionDebug的方法");
}
void FuncDelegate(int i, System.Func<string> func) {
if (i == 1) print(func());
else print("传入的参数为" + i);
}
string FuncDebug() {
string str="传入的参数为1,输出FunDebug的方法");
return str;
}
void Main( string[] args ) {
ActionFun( 1, ()=>{print("传入的int参数为1");}, ()=>{print("传入的int参数为2");} );
ActionFun( 0, ActionDebug, ActionDebug);
FuncDelegate(1, FuncDebug);
FuncDelegate(2, () => { return ""; });
}
打印结果:
传入的int参数为2
输出ActionDebug的方法
传入的参数为1,输出FunDebug的方法
传入的参数为2