using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace 委托
{
//声明委托
public delegate int AddDeltgate(int x,int y);
// 关键字 返回值类型 委托名(当类型) 对于方法中的参数
class Program
{
//定义两个静态方法
public static int mod(int a, int b)
{
return a % b;
}
public static int mul(int m, int n)
{
return m * n;
}
//定义一个方法(注意其中的参数)
public static int account(AddDeltgate action, int x, int y)//此处的参数使用了一个函数(关键点)
{
return action(x, y);
}
static void Main(string[] args)
{
TestDelegate Myadd = new TestDelegate();
//以前实例化对象,然后用方法实现
Console.WriteLine(Myadd.Add(2, 9));
//用委托实现(基本)
AddDeltgate Myadd2 = Myadd.Add;//注意此处不需要方法Add(),相当于获得方法名Add
Console.WriteLine(Myadd2(3, 5));
//用委托实现(高级)
AddDeltgate myadd3 = new AddDeltgate(Program.mod);//获得方法名(作为传递的方法)
Console.WriteLine(account(myadd3, 4, 7));//对于在其他类中的方法,需要实例化,则需采用此方法
Console.WriteLine(account(mod,3,6));//在本类中的方法,直接调用就可以
Console.WriteLine(account(mul, 3, 6));
//用匿名方法实现委托
AddDeltgate myadd4=delegate(int x,int y)
{
return x+x+y+y;
};//注意此处的分号
Console.WriteLine(myadd4(4,5));//18
}
}
class TestDelegate
{
public int Add(int s1, int s2)
{
return s1 + s2;
}
}
}
/*
委托可以看成是一种数据类型,可以用于定义变量,但它是一种特殊的数据类型,它所定义的变量能接受的数值只能是一个函数,
更确切的说,委托的变量接受的数值只能是一个函数,更确切的说,委托的变量可以接收一个函数的地址,类似于C++语言的函数指针
委托在开发中的作用
* 启动线程
* 通用类库
* 事件
委托变量可看成是一种类型安全的函数指针,它只能接收符合其要求的函数引用
*/