委托
使用委托的步骤:
1.定义委托
2.实例化委托
3.使用委托
[访问修饰符] delegate 返回类型 委托名();
class Program
{
//定义委托Call
public delegate int Call(int num1,int num2);
class Math
{
public int Multiply(int num1, int num2)
{
//语句;
}
public int Divide(int num1, int num2)
{
//语句;
}
}
class TestDelegates
{
static void Main()
{
Call objCall;
Math objMath = new Math();
//实例化委托Call
objCall = new Call(objMath.Multiply);
}
}
}
调用委托
调用委托意味着使用委托对方法进行实例化.
class Delegates
{
//委托定义
public delegate int Call(int num1,int num2);
class Math
{
//乘法方法
public int Multiply(int num1,int num2)
{
return num1*num2;
}
//除法方法
public int Divide(int num1, int num2)
{
return num1 / num2;
}
}
class TestDelegates
{
static void Main()
{
//存储结果的变量
int result;
//委托的对象
Call objCall;
//Math类的对象
Math objMath = new Math();
//实例化委托
objCall = new Call(objMath.Multiply);
//调用委托
result = objCall(5, 3);
Console.WriteLine(result);
}
}
}
控制台输出:
15
定义事件
[访问修饰符] event 委托名 事件名;
定义事件时,发行者首先定义委托,然后根据该委托定义事件.
//定义一个委托
public delegate void delegateMe();
//定义一个事件
private event delegateMe eventMe;
为什么要用委托来定义一个事件?因为这里用委托限定了事件引发函数的类型,即函数的参数个数,类型以及函数的返回值类型.
订阅事件只是添加了一个委托,事件引发时该委托将调用一个方法.
//objA方法订阅了事件eventMe
eventMe += new delegateMe(objA.Method);
引发事件
对特定条件进行检查,如果指定的条件为真,则引发事件eventMe
if(true)
{
//引发eventMe事件
eventMe();
}
综合例子:
class Student
{
//定义委托
public delegate void DelegateRegisterFinish();
//通过委托定义事件
public event DelegateRegisterFinish RegisterFinish;
private string _name;
public Student(string name)
{
_name = name;
}
public void Register()
{
Console.WriteLine("学生{0}进行注册",_name);
if (RegisterFinish != null)
{
//引发事件
RegisterFinish();
}
}
}
class Registe
{
static void Main()
{
Console.WriteLine("输入注册学生的姓名:");
string studentName = Console.ReadLine();
Student student = new Student(studentName);
//订阅Student类的RegisterFinish事件
student.RegisterFinish += new Student.DelegateRegisterFinish(student_Regis);
student.Register();
}
private static void student_Regis()
{
Console.WriteLine("注册成功");
}
}
控制台输出:
输入注册学生的姓名:
Tom
学生Tom进行注册
注册成功
练习:
创建事件ZeroEntered,接受用户输入的两个数.如果用户输入数字0,则应该引发该事件并调用方法Disp来
显示"不允许以零为除数",如果输入数字大于0,则对数字进行除法计算并显示结果.
class Test
{
//定义一个委托
public delegate void delegateMe();
//定义一个事件
public event delegateMe ZeroEntered;
public void Register(int num1,int num2)
{
if (num2 == 0)
{
//引发事件
ZeroEntered();
}
else
{
Console.WriteLine(num1/num2);
}
}
}
class Tests
{
static void Main()
{
Console.WriteLine("输入被除数");
int num = int.Parse(Console.ReadLine());
Console.WriteLine("输入除数");
int num2 = int.Parse(Console.ReadLine());
Test obj = new Test();
obj.ZeroEntered+=new Test.delegateMe(Disp);
obj.Register(num, num2);
}
public static void Disp()
{
Console.WriteLine("不允许以零为除数");
}
}
第一次
控制台输出:
输入被除数
10
输入除数
5
2
第二次
控制台输出:
输入被除数
10
输入除数
0
不允许以零为除数