什么是委托
首先要知道什么是委托,用最通俗易懂的话来讲,你就可以把委托看成是用来执行方法(函数)的一个东西。
如何使用委托
在使用委托的时候,你可以像对待一个类一样对待它。即先声明,再实例化。只是有点不同,类在实例化之后叫对象或实例,但委托在实例化后仍叫委托。
-----------------------------------------------
定义一个委托:
委托的生明:可以在命名空间内的任何地方生明。用到的关键字: delegate
public delegate void GreetHandler();//定义委托
class Program
{
static void Main(string[] args)
{
//创建委托方法(方法一)
//GreetHandler greetHandler;
//greetHandler = ChineseGreet;//赋值(第一个方法只能用赋值符)
//greetHandler += EnglishGreet;//绑定方法
//greetHandler -= ChineseGreet;//解除绑定
//greetHandler();//使用委托
//创建委托方法(方法二)
GreetHandler greetHandler = new GreetHandler(ChineseGreet);
greetHandler += EnglishGreet;
greetHandler();
}
public static void ChineseGreet()
{
Console.WriteLine("早上好!");
}
public static void EnglishGreet()
{
Console.WriteLine("Good Morning!");
}
}
---------------------------------
有参数类型的委托
先生明一个类
class Arithmetic
{
public int Add(int num1,int num2)
{
return num1 + num2;
}
public int Reduce(int num1, int num2)
{
return num1 - num2;
}
}
如果参数为引用类型时 : 在参数的前面加 一个 ref 的关键字
public delegate int ArithHandler(int num1, int num2);
class Program
{
static void Main(string[] args)
{
Arithmetic arithmetic = new Arithmetic();
ArithHandler arithHandler = new ArithHandler(arithmetic.Add);
arithHandler += arithmetic.Reduce;
int result = arithHandler(5, 3);//result接收最后一个方法执行的结果
Console.WriteLine("结果为:" + result);
}
}
------------------------
委托也可以调用匿名方法 很多时候是用于只调用一次的方法:
public delegate void HelloHandler();
public delegate int CalHandler(int num1,int num2);
class Program
{
static void Main(string[] args)
{
//将匿名方法赋给委托(无参无返回值的匿名方法)
HelloHandler helloHandler = delegate()
{
Console.WriteLine("你好!");
};
helloHandler();
//有参有返回值的匿名方法
CalHandler calHandler = delegate(int a, int b)
{
int num = a + b;
return num;
};
int result = calHandler(5,3);
Console.WriteLine(result);
}
}
--------------------------------------------
事件 事件是一种特殊的委托
/*********事件*************/
public delegate void GreetHandler();//定义委托
class Program
{
public static event GreetHandler MyEvent;//声明事件(发布事件)
static void Main(string[] args)
{
MyEvent += new GreetHandler(ChineseGreet);//订阅事件
MyEvent += new GreetHandler(EnglishGreet);
MyEvent();//触发事件
}
public static void ChineseGreet()
{
Console.WriteLine("早上好!");
}
public static void EnglishGreet()
{
Console.WriteLine("Good Morning!");
}
}