首页 / C# / C#中的事件是否结构化?
C#中的事件是否结构化?
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了C#中的事件是否结构化?,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含1422字,纯文字阅读大概需要3分钟。
内容图文
![C#中的事件是否结构化?](/upload/InfoBanner/zyjiaocheng/759/6aff3c1dbd6e4ee5a71009c40f026ece.jpg)
所以我有一个EventHandlers的字典,但我发现当我在将keyvaluepair添加到字典之前附加到一个事件时,一切正常.但是,如果我添加keyvaluepair然后更新eventhandler的值,则字典不会更新.
public static event EventHandler TestEvent;
private static Dictionary<int, EventHandler> EventMapping = new Dictionary<int, EventHandler>();
//TestEvent += GTKWavePipeClient_TestEvent;
EventMapping.Add(0, TestEvent);
TestEvent += GTKWavePipeClient_TestEvent;
//test event is non null now. keyvaluepair in EventMapping has a value of null
解决方法:
像EventHandler这样的委托类型是不可变类型.使用赋值(=)或复合赋值(=)时,将创建一个新实例.
字典保留旧实例.
委托类型是引用类型,但重要的是它们的不变性.
当你有一个事件时,使用=语法甚至不是一个赋值.它是add accessor或event的调用.它将以线程安全的方式重新分配支持字段(新实例).
请记住,您可以自己编写事件访问者.例如:
public static event EventHandler TestEvent
{
add
{
lock (lockObj)
{
EventHandler oldDel;
if (EventMapping.TryGetValue(0, out oldDel))
EventMapping[0] = oldDel + value;
else
EventMapping.Add(0, value);
}
}
remove
{
lock (lockObj)
{
EventHandler oldDel;
if (EventMapping.TryGetValue(0, out oldDel))
EventMapping[0] = oldDel - value;
}
}
}
private static readonly object lockObj = new object();
private static Dictionary<int, EventHandler> EventMapping = new Dictionary<int, EventHandler>();
使用该代码,当你去:
TestEvent += GTKWavePipeClient_TestEvent;
使用“隐式”参数EventHandler值设置为GTKWavePipeClient_TestEvent来调用您的add访问器.
内容总结
以上是互联网集市为您收集整理的C#中的事件是否结构化?全部内容,希望文章能够帮你解决C#中的事件是否结构化?所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。