繁体   English   中英

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

[英]How do I get rid of “[some event] never used” compiler warnings in Visual Studio?

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

从不使用事件“Company.SomeControl.SearchClick”。

但我知道它被使用了,因为将它注释掉会让我像 20 个试图使用此事件的 XAML 页面的新警告一样!

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

这似乎是警告 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{} }

第二个最好的方法是恕我直言,如果有人试图订阅它,则通过抛出异常来明确说明该事件不受支持。

public event RoutedEventHandler SearchClick
{
    add { throw new NotSupportedException(); }
    remove { throw new NotSupportedException(); }
}

作为对此的一种变体,您还可以将addremove方法留空以静默忽略事件的订阅。

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

作为最后的手段,您还可以像这样禁用警告

#pragma warning disable 67
public event RoutedEventHandler SearchClick;
#pragma warning restore 67

您还可以执行以下操作:

public event EventHandler MyEvent = delegate {}

编译器显然不知道它正在 XAML 代码中使用。 尝试取消事件定义中的警告。

另外,请确保您实际上是在某处引发事件。

您可以抑制个别警告。

\Program.cs(13,20): warning CS0219: The variable 'foo' is assigned but its value is never used

在这种情况下,CS0219 是有关已分配但未使用的变量的警告。 您可以使用 /nowarn:0219 标志,或在项目的属性窗格中添加错误编号(在“Build”下,记得删除前导 CS)。 请记住,该类会抑制所有警告。

或者您可以将<NoWarn>67</NoWarn>到您的项目中

<PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' ">
  ...
  <NoWarn>67</NoWarn>
</PropertyGroup>

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM