在学到方法参数传递和返回值后,有时候就会想,如果方法也能当参数进行传递,那很多时候就很方便了,这时候我们就会想到一种类型---委托了。
委托关键字为delegate 下面我们来看看它的基本用法
public delegate void Mydele();//定义了一个无参无返回值的委托类型
public delegate int Mydele1();//定义了一个返回值为int,无参的委托类型
public delegate void Mydele2(int a);//定义了一个无返回值,参数为int的委托类型
public delegate int Mydele3(int a, string b);//定义了一个返回值为int,参数为int和string的委托类型
public void Text0()
{
Console.WriteLine("Text");
}
public int Text1()
{
Console.WriteLine("Text1");
return 0;
}
public void Text2(int data)
{
Console.WriteLine("Text2");
}
public int Text3(int data,string str)
{
Console.WriteLine("Text3");
return 0;
}
public void Text4(Delegate a)
{
Console.WriteLine("Text4");
}
public void Text()
{
Mydele mydele = Text0;//指向返回值和参数和委托类型相同的方法
Mydele1 mydele1 = Text1;
Mydele2 mydele2 = Text2;
Mydele3 mydele3 = Text3;
mydele();
mydele2(1);//使用委托调用方法
Text4(mydele3);//将委托作为参数传递,相当于将方法当参数传递到别的方法里去
}
委托中添加和删除方法
一个委托可以指向多个方法,第一次调用是调用最近一次添加的方法。
mydele+=Text5;
mydele-=text4;
mydele=Text;//等于号为赋值,直接覆盖里面所有的方法
上面代码演示了普通委托的定义声明和使用,一个委托可定义最多有16个参数的,下面我们再看看系统自带的三个特殊委托
Action委托:
Action是无返回值的泛型委托。
Action 表示无参,无返回值的委托
Action<int,string> 表示有传入参数int,string无返回值的委托
Func委托:
Func是有返回值的泛型委托
Func<int> 表示无参,返回值为int的委托
Func<object,string,int> 表示传入参数为object, string 返回值为int的委托
predicate委托:
predicate 是返回bool型的泛型委托
predicate<int> 表示传入参数为int 返回bool的委托。
使用Labmda表达式使用委托:
Mydele d2= (string name) => { Console.WriteLine("你好,{0}!", name); };
d2("Terry");
括号中的string name表示方法参数,大括号里的是方法体。
使用匿名方法使用委托:
delegate void TestDelegate(string myName);
TestDelegate d2 = delegate(string name)
{
Console.WriteLine("Hello,{0}!", name);
};
d2(“Test”);
相当于用delegate代替了方法名。
事件
事件也是一种特殊的委托,事件只能在本类的内部使用=赋值,只能在本类内部调用,在外部类中,只能使用+=和-=添加和删除,不能在外部类调用,事件大大增加了委托的安全性和规范性。事件使用关键字event。
public event Mydele mydele = Text0;