一,delegate/event用法的相关介绍
按照msdn的说法,event就是让你可以指定一个当event发生时发生的委托。当您的代码指示事件发生时,委托可以由有一个或多个相关的方法将被调用。
二,创建delegate/event的步骤
1,声明一个委托 delegate。
2,创建一个类,这个类包含:
a,用声明的委托定义一个event
b,一个触发事件event的函数
3,定义一个或者多个类来绑定方法和event(使用+=,-=来处理函数和event)
4,使用event
三,举例说明delegate/event的使用方法
例一:声明一个接口和类,并且使用event。至于接口和类的含义,请各位自行学习。
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace Delegate_Event_Usage1
{
public delegate void MyDelegate(); // delegate declaration
public interface I
{
event MyDelegate MyEvent;
void FireAway();
}
public class MyClass : I
{
public event MyDelegate MyEvent;
public void FireAway()
{
MyEvent?.Invoke();
}
}
class Program
{
static private void f()
{
Console.WriteLine("This is called when the event fires.");
}
static void Main(string[] args)
{
I i = new MyClass();
i.MyEvent += new MyDelegate(f);
i.FireAway();
}
}
}
运行结果:
例二:这个例子讲述了如何利用hashtable来封装event,至于为什么这么做,请大家自行学习hashtable的优点
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Collections;
namespace Delegate_Event_Usage2
{
public delegate void MyDelegate1(int i);
public delegate void MyDelegate2(string s);
public delegate void MyDelegate3(int i, object o);
public delegate void MyDelegate4();
public class PropertyEventsSample
{
public Hashtable eventTable = new Hashtable();
public event MyDelegate1 Event1
{
add
{
eventTable["Event1"] = (MyDelegate1)eventTable["Event1"] + value;
}
remove
{
eventTable["Event1"] = (MyDelegate1)eventTable["Event1"] - value;
}
}
public event MyDelegate1 Event2
{
add
{
eventTable["Event2"] = (MyDelegate1)eventTable["Event2"] + value;
}
remove
{
eventTable["Event2"] = (MyDelegate1)eventTable["Event2"] - value;
}
}
public event MyDelegate2 Event3
{
add
{
eventTable["Event3"] = (MyDelegate2)eventTable["Event3"] + value;
}
remove
{
eventTable["Event3"] = (MyDelegate2)eventTable["Event3"] - value;
}
}
public event MyDelegate3 Event4
{
add
{
eventTable["Event4"] = (MyDelegate3)eventTable["Event4"] + value;
}
remove
{
eventTable["Event4"] = (MyDelegate3)eventTable["Event4"] - value;
}
}
public event MyDelegate3 Event5
{
add
{
eventTable["Event5"] = (MyDelegate3)eventTable["Event5"] + value;
}
remove
{
eventTable["Event5"] = (MyDelegate3)eventTable["Event5"] - value;
}
}
public event MyDelegate4 Event6
{
add
{
eventTable["Event6"] = (MyDelegate4)eventTable["Event6"] + value;
}
remove
{
eventTable["Event6"] = (MyDelegate4)eventTable["Event6"] - value;
}
}
}
class Program
{
static private void f()
{
Console.WriteLine("This is called when the event fires.");
}
static void Main(string[] args)
{
PropertyEventsSample sample = new PropertyEventsSample();
sample.Event6 += f;
foreach (DictionaryEntry eve in sample.eventTable)
{
if (eve.Key.ToString() == "Event6")
{
var method=eve.Value as MyDelegate4;
method?.Invoke();
}
}
}
}
}
运行结果:
例三:当出现两个接口都具有同样的相同名称的event,那么在基类中该如何定义event
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace Delegate_Event_Usage3
{
class Program
{
public delegate void MyDelegate1();
public interface I1
{
event MyDelegate1 MyEvent;
}
public delegate int MyDelegate2(string s);
public interface I2
{
event MyDelegate2 MyEvent;
}
public class ExplicitEventsSample : I1, I2
{
public event MyDelegate1 MyEvent; // normal implementation of I1.MyEvent.
event MyDelegate2 I2.MyEvent // explicit implementation of I2.MyEvent
{
add
{
MyEvent2Storage += value;
}
remove
{
MyEvent2Storage -= value;
}
}
private MyDelegate2 MyEvent2Storage; // underlying storage for I2.MyEvent.
public void FireEvents()
{
MyEvent?.Invoke();
MyEvent2Storage?.Invoke("hello");
}
}
static private void f()
{
Console.WriteLine("This is called when the event fires.");
}
static private int fStr(string str)
{
Console.WriteLine(str);
return -1;
}
static void Main(string[] args)
{
ExplicitEventsSample sample = new ExplicitEventsSample();
sample.MyEvent += f;
sample.FireEvents();
}
}
}
本文介绍了C#中Delegate和Event的基本概念与用法,并通过三个实例详细展示了如何创建及使用Delegate与Event,包括基本使用、利用Hashtable封装Event以及解决接口中同名Event的问题。
2万+

被折叠的 条评论
为什么被折叠?



