如何在Visual Studio中摆脱"[某些事件]从未使用过"编译器警告?

jed*_*mao 84 .net c# wpf events compiler-warnings

例如,我收到此编译器警告,

永远不会使用"Company.SomeControl.SearchClick"事件.

但是我知道它被使用是因为评论它会引发我20个新的XAML页面警告,试图使用这个事件!

是什么赋予了?有没有办法摆脱这个警告?

lc.*_*lc. 126

这似乎是警告67,因此可以通过以下方式进行抑制:

#pragma warning disable 67
Run Code Online (Sandbox Code Playgroud)

不要忘记尽快恢复(事件声明后):

#pragma warning restore 67
Run Code Online (Sandbox Code Playgroud)

但是,我会再次检查并确保你在某处举起活动,而不仅仅是订阅它.当您注释掉事件时编译器发出20个警告而不是20个错误的事实也是可疑的......

还有一篇关于这个警告的有趣文章,特别是它如何应用于界面; 关于如何处理"未使用"事件有一个很好的建议.不幸的是,这个链接似乎(暂时?)已经死了,但重要的部分是:

正确的答案是明确你对事件的期望,在这种情况下,什么都不是:

public event EventHandler Unimportant
{
    add { }
    remove { }
}
Run Code Online (Sandbox Code Playgroud)

这将干净地抑制警告,以及额外的编译器生成的正常事件的实现.并且作为另一个额外的好处,它促使人们思考这种无所事事的实现是否真的是最佳实现.例如,如果事件不是那么不重要而不支持,那么依赖于该功能的客户端可能会在没有它的情况下失败,最好明确指出缺乏支持并通过抛出一个快速失败例外:

public event EventHandler Unsupported
{
    add { throw new NotSupportedException(); }
    remove { }
}
Run Code Online (Sandbox Code Playgroud)

当然,可以在没有其功能的某些部分的情况下有用地实现的接口有时表明接口没有最佳的内聚性并且应该被分成单独的接口.

  • 这是一个很棒的链接.谢谢. (12认同)

Ada*_*lls 74

如果您被迫从接口实现事件,您的实现不需要您可以执行以下操作以避免警告.

public event EventHandler CanExecuteChanged { add{} remove{} }
Run Code Online (Sandbox Code Playgroud)

  • @Almo,这是正确的。但是,您所描述的情况是您正在使用该事件,因此不会显示警告,因此您不会使用警告修复程序。正确的?通常,您有一个指定事件的接口和两个子类。不使用该事件并使用此解决方案。另一个确实使用了该事件,并且一开始就没有发出警告。 (2认同)

vid*_*ige 14

第二种最好的方法是imho清楚地说明如果有人试图订阅它就抛出异常不支持该事件.

public event RoutedEventHandler SearchClick
{
    add { throw new NotSupportedException(); }
    remove { }
}
Run Code Online (Sandbox Code Playgroud)

作为此变体,您还可以将addand和removeempty留空以静默忽略对事件的订阅.

最好的解决方案是重构代码,如果可能的话,可能将事件的声明拉到实现者.

作为最后的手段,您也可以禁用此类警告

#pragma warning disable 67
public event RoutedEventHandler SearchClick;
#pragma warning restore 67
Run Code Online (Sandbox Code Playgroud)


Gra*_*ntA 5

您还可以执行以下操作:

public event EventHandler MyEvent = delegate {}
Run Code Online (Sandbox Code Playgroud)