Joe*_*ite 3 c# windows-8 winrt-xaml
在.NET中,如果我执行包含事件的接口,但该事件没有任何意义了我的对象(说这是一个变化的事件,我正在写一个不可变对象),那么我可以提供空的机构为add和remove - null实现.这避免了为我永远不会使用的委托字段分配存储空间,并且还避免了"永远不会使用事件"编译器警告,因此这是一个全面的胜利.
public event EventHandler Changed {
add {}
remove {}
}
Run Code Online (Sandbox Code Playgroud)
当我在WinRT类中尝试相同的事情(从FrameworkElement下降)时,我在add访问器上遇到编译器错误:"并非所有代码路径都返回值".
如何从add访问者返回值?应该归还什么?
更新:显然此问题仅适用于WinRT事件(例如,如果您正在实现包含事件的WinRT接口).如果您正在编写一个普通的旧CLR事件,则上述语法有效.
我在Windows开发人员中心找到了这篇文章.似乎Metro add和remove访问器功能确实已经改变:
对Windows运行时的.NET Framework支持通过隐藏Windows运行时事件模式和.NET Framework事件模式之间的差异,可以轻松地在Windows运行时组件中声明事件.但是,在Windows运行时组件中声明自定义事件访问器时,必须遵循Windows运行时模式.
当您注册以在Windows运行时中处理事件时,添加访问者将返回一个令牌.要取消注册,请将此令牌传递给删除访问者.这意味着Windows运行时事件的添加和删除访问器与您习惯使用的访问器具有不同的签名.
幸运的是,Visual Basic和C#编译器简化了这一过程:当您在Windows运行时组件中使用自定义访问器声明事件时,编译器会自动使用Windows运行时模式.例如,如果添加访问者未返回令牌,则会出现编译器错误.
.NET Framework提供了两种类型来支持实现:
- EventRegistrationToken结构表示令牌.
- EventRegistrationTokenTable <T>类创建标记并维护标记和事件处理程序之间的映射.泛型类型参数是事件参数类型.您为每个事件创建此类的实例,第一次为该事件注册事件处理程序.
| 归档时间: |
|
| 查看次数: |
630 次 |
| 最近记录: |