委托的主要作用是可以方便选择用哪个方法 ,主要用在事件里较多
using System;
using System.Collections.Generic;
using System.Text;
//函数作用:委托的用法
namespace ConsoleApplication21
{
class Program
{
delegate double testDelegate(double x, double y);//创建委托,并且返回值为double
static double Multiply(double x, double y) //创建函数
{
return x * y;
}
static double Divide(double x, double y)
{
return x / y;
}
static void Main(string[] args)
{
testDelegate selectAction; //声明
Console.WriteLine("请输入2个数字!用“,”隔开");
string getnum = Console.ReadLine();
int zz = getnum.IndexOf(',');
double num1 = Convert.ToDouble(getnum.Substring(0,zz));
double num2 = Convert.ToDouble(getnum.Substring(zz + 1, getnum.Length - zz - 1));
Console.WriteLine("请选择操作,m or d ");
string act = Console.ReadLine().ToLower();
if (act == "m")//这里根据选择初始化委托变量
{ selectAction = new testDelegate(Multiply); }//这里即选择哪个函数执行委托
else
{ selectAction = new testDelegate(Divide); }
Console.WriteLine("运算结果:{0}", selectAction(num1,num2));//让委托调用所选函数,并执行
}
}
}
一、委托
1、定义一个委托, 相当于public string ss;
public delegate void MyDelegate(string name );
2、定义委托具体执行的事件,必须和上面的委托的参数和返回类型都一样,也就是与void MyDelegate(string name )的形式相同。
public static void MyDelegateFunc( string name )
{
Console.WriteLine("Hello,{0}", name);
}
3、具体调用事件
MyDelegate md = new MyDelegate ( MyDelegateFunc); //类似于String ss = new String("ee");只不过,这边是用函数的名称而已
md("sss");//具体调用方法,相当于调用MyDelegateFunc("sss");现在MyDelegateFunc和md就是相同的了。
二、事件
1、定义一个委托,和上面的委托类似,但是必须是void MyEventHandle(object sender , System.EventArgs e ); 类似这种形式的。
public delegate void MyEventHandle(object sender , System.EventArgs e );
public delegate void MyEventHandle(object sender , MyEventArgs e );// MyEventArgs 是 System.EventArgs的子类
2、定义一个事件变量
public event myEventHanler myevent; //比MyDelegate md多了一个event关键字,表示这是一个事件变量
3、定义事件参数,以第一种为例。
public void MyEventFunc(object sender , System.EventArgs e)
{
Console.WriteLine("My event is OK!");
}
4、用+=注册事件到事件队列中,相当于MyDelegate md = new MyDelegate ( MyDelegateFunc); 用+=替代=
this.myevent += new myEventHanler(MyEventFunc);
5、调用,相当于md("sss");
if ( mevent != null )
{
myevent( this , EventArgs.Empty);//EventArgs.Empty是表示不用e
}