1.委托的概念
1)委托是一个可以对方法进行引用的类,与其他类不同,委托类具有一个签名,并且只能对与其签名匹配的方法进行引用。
2)委托声明定义一个从 System.Delegate 类派生的类。
3)委托是一种引用类型,在其他语言中,与委托最接近的是函数指针,但委托不仅存储对方法入口点的引用,还存储对用于调用方法的对象实例的引用。
4)委托实例的一个有趣且有用的属性是:它不知道也不关心它所封装的方法所属的类;它所关心的仅限于这些方法必须与委托的类型兼容。
2.委托的使用
1)开发人员可以声明委托类型,定义委托类型的变量或者创建委托的实例。委托可以在运行时间接调用一个或多个方法。
2)在声明委托类型或基于委托类型的变量时并不指定委托将要调用哪些方法,而是在创建委托的实例时指定,并且在运行时还可以将一个或多个方法与委托动态关联
3.定义委托
[访问修饰符] delegate 返回类型 委托名();
4.使用委托的注意事项
1)声明委托时,需要比照运行时需要调用的方法,声明相同的参数列表和返回值。
2)当实例化委托时,需要引用某方法,该方法的参数列表和返回值必须与委托定义的相同。
3)调用委托时,委托调用与之关联的方法。当引用的方法向委托返回值时,委托会将该值传递给调用程序,就如同该值是委托自身的返回值一样。
5.简单测试
某购物网站的会员分VIP会员和一般会员,VIP会员购买商品的折扣率为30%,一般会员购买商品的折扣率为10%
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace 委托
{
class VIP
{
public double vip(double price)
{
return price*0.7;
}
}
class Member
{
public double member(double price)
{
return price * 0.9;
}
}
class DelegateShop
{
public delegate double Call(double price);
}
class Delegates
{
public delegate int Call(int number1,int number2);
}
class Math
{
public int Mutiply(int num1,int num2)
{
return num1*num2;
}
public int Divide(int num1,int num2)
{
return num1/num2;
}
}
class Program
{
static void Main(string[] args)
{
//int result;
//Math objMath = new Math();
//Delegates.Call objCall = new Delegates.Call(objMath.Mutiply);
//result = objCall(5,3);
//Console.WriteLine("结果为{0}",result);
double price=0;
VIP objVIP = new VIP();
Member objMember = new Member();
Console.WriteLine("请输入您的会员等级");
try
{
int level = Convert.ToInt32(Console.ReadLine());
Console.WriteLine("请输入商品零售价");
price = Convert.ToDouble(Console.ReadLine());
switch (level)
{
case 1:
DelegateShop.Call objCall = new DelegateShop.Call(objMember.member);
price=objCall(price);
break;
case 2:
DelegateShop.Call objCall1 = new DelegateShop.Call(objVIP.vip);
price = objCall1(price);
break;
}
}
catch
{
Console.WriteLine("请输入正确的会员等级或价格");
}
Console.WriteLine("你准备购买的商品的会员价为{0}",price);
}
}
}