C#中事件的委托的注意事项(can only appear on the left hand side of += or -=)

原创 2013年12月02日 14:18:46

1. event property must have both add and remove accessors

event xxxEvent xxx

{

}

event的作用域之间必须有add,remove来自定义访问器。否则直接使用event xxxEvent xxx;,注意此处的";"。

2.The event `EasyJoystick.On_JoystickMoveStart' can only appear on the left hand side of += or -= when used outside of the type `EasyJoystick'

event xxxEvent xxx

{

        add { }
        remove { }

}

对于这种自定义访问器,就不能在使用xxx()直接调用了。一般不使用自定义访问器。如果想要使用一下有一个例子。

  public event EventHandler Elapsed

  {

  add

  {

  //... 执行+=运算符的代码

  }

  remove

  {

  //... 执行-=运算符的代码

  }

  }

  声明了事件访问器后,事件不包含任何内嵌委托对象.我们必须实现自己的机制来存储和移除事件的方法

  事件访问器表现为void方法,也就是不能使用会返回值的return语句

  完整示例:

  //声明一个delegate

  delegate void EventHandler();

  class MyClass

  {

  //声明一个成员变量来保存事件句柄(事件被激发时被调用的delegate)

  private EventHandler m_Handler = null;

  //激发事件

  public void FireAEvent()

  {

  if (m_Handler != null)

  {

  m_Handler();

  }

  }

  //声明事件

  public event EventHandler AEvent

  {

  //添加访问器

  add

  {

  //注意,访问器中实际包含了一个名为value的隐含参数

  //该参数的值即为客户程序调用+=时传递过来的delegate

  Console.WriteLine("AEvent add被调用,value的HashCode为:" + value.GetHashCode());

  if (value != null)

  {

  //设置m_Handler域保存新的handler

  m_Handler = value;

  }

  }

  //删除访问器

  remove

  {

  Console.WriteLine("AEvent remove被调用,value的HashCode为:" + value.GetHashCode());

  if (value == m_Handler)

  {

  //设置m_Handler为null,该事件将不再被激发

  m_Handler = null;

  }

  }

  }

  }

  class Program

  {

  static void Main(string[] args)

  {

  MyClass obj = new MyClass();

  //创建委托

  EventHandler MyHandler = new EventHandler(MyEventHandler);

  MyHandler += MyEventHandle2;

  //将委托注册到事件

  obj.AEvent += MyHandler;

  //激发事件

  obj.FireAEvent();

  //将委托从事件中撤销

  obj.AEvent -= MyHandler;

  //再次激发事件

  obj.FireAEvent();

  Console.ReadKey();

  }

  //事件处理程序

  static void MyEventHandler()

  {

  Console.WriteLine("This is a Event!");

  }

  //事件处理程序

  static void MyEventHandle2()

  {

  Console.WriteLine("This is a Event2!");

  }

  }

3.event的{}之中不能写成get,set。

4.+=,-=分别表示向add,move中加减方法

 

 

Delegate 与 Event 的一些问题

过去曾有人说过 Delegate 无法实现多播,其实并不是这样,System.MulticastDelegate 是Delegate 的基类,所以很明显,Delegate是可以支持多播的,相信许多...
  • norsd
  • norsd
  • 2012年06月21日 02:19
  • 719

freemarker写select组件报错总结(五)

1、错误描述 六月 26, 2014 10:44:49 下午 freemarker.log.JDK14LoggerFactory$JDK14Logger error 严重: Template proc...
  • you23hai45
  • you23hai45
  • 2014年06月26日 22:47
  • 2703

windows下安装 crul 以及windows下使用的注意事项

ES CURL
  • d_good
  • d_good
  • 2016年09月02日 14:01
  • 1215

Angularjs2报错的概览(数据为json格式)

{ "Unterminated string literal.": "未终止的字符串文本。", "Identifier expected.": "应为标识符。", "'{0}' expected...
  • ID_Rin
  • ID_Rin
  • 2017年04月28日 10:02
  • 2574

jQuery的on与bind绑定事件的区别与注意事项

jQuery的on与bind绑定事件的区别与注意事项
  • soopencool
  • soopencool
  • 2017年03月09日 21:26
  • 185

CAN总线接口电路设计注意事项

  • 2011年04月10日 09:44
  • 67KB
  • 下载

Notes On Writing Portable Programs In C(用C语言编写可移植程序的注意事项)

  • 2009年05月27日 15:14
  • 22KB
  • 下载

redis 集群中 Slave-read-only 参数的使用注意事项

文章目录1、概述 2、redis 集群中 Slave-read-only 参数的使用注意事项 3、操作示例 4、小结 1、概述介绍 redis 集群参数使用技巧。 2、redis 集群中 Slave-...
  • raoping2017
  • raoping2017
  • 2017年05月11日 15:08
  • 370

iOS APP 支持IPv6-only的注意事项及兼容性考虑

iOS APP 提交到AppStore要 支持IPv6-only IPv4 和 IPv6的区别  IP 地址前者是 . (dot)分割,后者是以 :(冒号)分割的。 在WWDC2 0...
  • ljc_563812704
  • ljc_563812704
  • 2016年08月11日 10:02
  • 377

iOS APP 支持IPv6-only的注意事项及兼容性考虑

iOS APP 提交到AppStore要 支持IPv6-onlyIPv4 和 IPv6的区别就是 IP 地址前者是 . (dot)分割,后者是以 :(冒号)分割的。在WWDC2 015上苹果宣布iOS...
  • u012709932
  • u012709932
  • 2016年07月05日 11:52
  • 596
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:C#中事件的委托的注意事项(can only appear on the left hand side of += or -=)
举报原因:
原因补充:

(最多只允许输入30个字)