例如,我收到此编译器警告,
从不使用事件“ Company.SomeControl.SearchClick”。
但我知道它已被使用,因为注释掉它会使我像尝试使用此事件的XAML页面的20条新警告!
是什么赋予了?有没有技巧可以消除此警告?
Answers:
这似乎是警告67,因此可以通过以下方式将其抑制:
#pragma warning disable 67
不要忘记使用以下命令尽快将其还原:
#pragma warning restore 67
但是,我会再次检查并确保您正在某处引发该事件,而不仅仅是订阅该事件。当您注释掉事件时,编译器会发出20条警告而不是20条错误的事实也令人怀疑。
关于此警告,也有一篇有趣的文章,特别是它如何应用于接口。关于如何处理“未使用的”事件,有很好的建议。重要的部分是:
正确的答案是明确说明您对事件的期望,在这种情况下,结果无济于事:
public event EventHandler Unimportant { add { } remove { } }
这将完全消除警告,以及正常事件的额外编译器生成的实现。另外一个好处是,它促使人们思考这种无所事事的实现是否真的是最好的实现。例如,如果该事件不是很重要,也不是不受支持的,那么依赖该功能的客户端可能会在没有该功能的情况下失败,因此最好通过抛出一个错误来明确表示缺乏支持并快速失败。例外:
public event EventHandler Unsupported { add { throw new NotSupportedException(); } remove { } }
当然,可以在没有其功能的某些部分的情况下有效地实现的接口有时表示该接口不是最佳内聚的,应将其拆分为单独的接口。
如果您被迫从接口实现事件,则不需要实现,您可以执行以下操作以避免警告。
public event EventHandler CanExecuteChanged { add{} remove{} }
if(OnCompleteOpenEvent != null) OnCompleteOpenEvent();
说“当前上下文中不存在OnCompleteEvent”。
第二种最好的方法是恕我直言,如果有人尝试订阅该事件,则抛出异常,从而明确声明该事件不受支持。
public event RoutedEventHandler SearchClick
{
add { throw new NotSupportedException(); }
remove { throw new NotSupportedException(); }
}
作为此方法的变体,您也可以将add
和remove
方法保留为空,以静默忽略事件的订阅。
最好的解决方案是重构代码,如果可能的话,也许将事件的声明拉给实现者。
作为最后的选择,您也可以像这样禁用警告
#pragma warning disable 67
public event RoutedEventHandler SearchClick;
#pragma warning restore 67
或者您可以添加<NoWarn>67</NoWarn>
到您的项目中
<PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' ">
...
<NoWarn>67</NoWarn>
</PropertyGroup>