今天刚好学习到unity中easytouch控件(呆会还要写一个文章),又碰到了委托和事件这个我不懂的概念,所以学习一下,这里主要通过实例的讲解,我会再查书去看相关知识。
委托给了C#操作函数的灵活性,我们可使用委托像操作变量一样来操作函数,其实这个功能并不是C#的首创,早在C++时代就有函数指针这一说法,而在我看来委托就是C#的函数指针,首先先简要地介绍一下委托的基本知识:
委托的定义
委托的声明原型是:
delegate <函数返回类型><委托名>(<函数参数>)
举个例子,public delegate void CheckDelegate(int number);//定义了一个委托CheckDelegate,它可以了注册返回void类型且有一个int作为参数的函数。
这样就定义了一个委托,但是委托在.net内相当于声明了一个类,类如果不实例化为对象,很多功能是没有办法使用的,委托也是如此。
委托的实例化
委托实例化的原型是:
<委托类型><实例化名>=new <委托类型>(<注册函数>)
例子,CheckDelegate _checkDelegate=new CheckDelegate(checkMod);//用函数CheckMod实例化上面的CheckDelegate委托为_checkDelegate
在.net 2.0开始可以直接用匹配的函数实例化委托:
<委托类型><实例化名>=<注册函数>
例子:CheckDelegate _checkDelegate=CheckMod;//用函数CheckMod实例化上面的CheckDelegate委托为_checkDelegate
现在我们就可以像使用函数一样来使用委托了,在上面的例子中现在执行_checkDelegate()就等同于执行CheckMod(),最关键的是现在函数CheckMod相当于放在了变量之中,它可以传递给其他的CheckDelegate引用对象,而且可以作为函数参数传递到其他函数内,也可以作为函数的返回类型。
第一个例子:
public class DelegateTest
{
// 声明delegate对象
public delegate void CompareDelegate(int a,int b);
// 欲传递的方法,它与CompareDelegate具有相同的参数和返回值类型
public static void Compare(int a,int b)
{
Console.WriteLine((a>b).ToString());
}
public static void Main()
{
// 创建delegate对象
CompareDelegate cd = new CompareDelegate(DelegateTest.Compare);
// 调用delegate
cd(1,2);
}
}
第二个例子:
public delegate void MyTestDelegate(int i);
public class Program
{
public static void Main()
{
//创建delegate
ReceiveDelegateArgsFunc(new MyTestDelegate(DelegateFunction));
}
//这个方法接收一个delegate类型的参数,也就是接收一个函数作为参数
public static void ReceiveDelegateArgsFunc(MyTestDelegate func)
{
func(21);
}
//欲传递的方法
public static void DelegateFunction(int i)
{
System.Console.WriteLine("传过来的参数为: {0}.", i);
}
}
委托事件在Easytouch脚本中的应用
委托:
#region Delegate
public delegate void ButtonUpHandler(string buttonName);
public delegate void ButtonPressHandler(string buttonName);
public delegate void ButtonDownHandler(string buttonName);
#endregion
事件:
#region Event
/// <summary>
/// Occurs when the button is down for the first time.
/// </summary>
public static event ButtonDownHandler On_ButtonDown;
/// <summary>
/// Occurs when the button is pressed.
/// </summary>
public static event ButtonPressHandler On_ButtonPress;
/// <summary>
/// Occurs when the button is up
/// </summary>
public static event ButtonUpHandler On_ButtonUp;
#endregion