什么是事件?
这几天在学C#,主要就是看MSDN,事件的用法已经会了,可事件的机制总是看不明白,劳烦大家帮我解释一下下面这个事件是如何定义、触发的,每行代码背后的含义是什么,谢谢!
namespace TestCollections
{
// A delegate type for hooking up change notifications.
public delegate void ChangedEventHandler(object sender, System.EventArgs e);
// A class that works just like ArrayList, but sends event
// notifications whenever the list changes.
public class ListWithChangedEvent : System.Collections.ArrayList
{
// An event that clients can use to be notified whenever the
// elements of the list change.
public event ChangedEventHandler Changed;
// Invoke the Changed event; called whenever list changes
protected virtual void OnChanged(System.EventArgs e)
{
if (Changed != null)
{
Changed(this, e);
}
}
// Override some of the methods that can change the list;
// invoke event after each
public override int Add(object value)
{
int i = base.Add(value);
OnChanged(System.EventArgs.Empty);
return i;
}
public override void Clear()
{
base.Clear();
OnChanged(System.EventArgs.Empty);
}
public override object this[int index]
{
set
{
base[index] = value;
OnChanged(System.EventArgs.Empty);
}
}
}
}
namespace TestEvents
{
using TestCollections;
class EventListener
{
private ListWithChangedEvent m_list;
public EventListener(ListWithChangedEvent list)
{
m_list = list;
// Add "ListChanged " to the Changed event on m_list:
m_list.Changed += new ChangedEventHandler(ListChanged);
}
// This will be called whenever the list changes.
private void ListChanged(object sender, System.EventArgs e)
{
System.Console.WriteLine( "This is called when the event fires. ");
}
public void Detach()
{
// Detach the event and delete the list
m_list.Changed -= new ChangedEventHandler(ListChanged);
m_list = null;
}
}
class Test
{
// Test the ListWithChangedEvent class.
static void Main()
{
// Create a new list.
ListWithChangedEvent list = new ListWithChangedEvent();
// Create a class that listens to the list 's change event.
EventListener listener = new EventListener(list);
// Add and remove items from the list.
list.Add( "item 1 ");
list.Clear();
listener.Detach();
}
}
}
[解决办法]
这个,要想打字说清楚,还真是要说半天。建议楼主看看网上很经典的C#睡前故事,仔细研究一下应该就明白了。
http://tech.itdb.cn/n/200607/17/n20060717_20635.shtml
[解决办法]
说白了 就是个 函数指针.
通过一个 代理 地址去 访问一个函数或函数队列
[解决办法]
帮顶!
[解决办法]
打你一巴掌你总会知道疼吧。
其中你被打了就是事件,而知道疼就是你事件的回调函数
你.被打 += new EventHander( "你_我被打咋办 ");
private void 你_我被打咋办(object sender, eventArgs e)
{
你.Say( "奶奶的敢打我! ");
}
其中的sender还是你自己。 要想知道谁打了你,就要从eventArgs下手了。做一个自己的eventArgs,里面加上打你的人的名字
纯粹搞笑啦:-) 别介意
[解决办法]
楼上的,很形象,
被打是引发事件,知道疼是接收了事件
[解决办法]
看看VC++.net的事件说明
http://soft.yesky.com/441/2363941.shtml
[解决办法]
就是委托是实例.可以写成用add{}和remove{}访问的形式
[解决办法]
你雇了一个律师(注册了事件,律师就是你的委托)
当你惹上了官司(触发了事件)
你把官司的事情告诉律师(传递参数sender代表是 "你 "出了事,e代表你出事的信息)
律师调用他的方法解决你的问题(委托指向的方法就是事件处理程序)