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


93

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

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

但我知道它已被使用,因为注释掉它会使我像尝试使用此事件的XAML页面的20条新警告!

是什么赋予了?有没有技巧可以消除此警告?


1
你能举个例子吗?
约翰·桑德斯

Answers:


143

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

当然,可以在没有其功能的某些部分的情况下有效地实现的接口有时表示该接口不是最佳内聚的,应将其拆分为单独的接口。


那正是我所需要的!谢谢!唯一的不同是,我在67条旁添加了自己的评论,因此我知道将来会是什么。这是我键入的“正好” ... #pragma warning disable 67 //事件从未使用过,公共事件RoutedEventHandler SearchClick; #pragma warning restore 67
jedmao

12
那是一个很好的联系。谢谢。
Max Palmer

这很有用;不会保持
原状

78

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

public event EventHandler CanExecuteChanged { add{} remove{} }

如果执行此操作,则稍后会在执行该操作的文件中if(OnCompleteOpenEvent != null) OnCompleteOpenEvent();说“当前上下文中不存在OnCompleteEvent”。
Almo 2014年

@Almo,没错。但是,您描述的是您正在使用事件的情况,因此警告不会出现,因此您将不会使用警告的修复程序。对?通常,您有一个指定事件和两个子类的接口。一个不使用事件,而是使用此解决方案。另一个确实使用该事件,并且从未抛出警告。
德克·贝斯特2014年

时间太长了,但是即使正在使用它,我们也会收到此错误。它与某种定义有关,使编译器误以为没有使用它。
Almo 2014年

非常感谢您为这种令人发指的情况提供了简便的解决方案!
M463

14

第二种最好的方法是恕我直言,如果有人尝试订阅该事件,则抛出异常,从而明确声明该事件不受支持。

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

我在这里看不到空对象的相关性
vidstige

我知道什么是空对象,该用例在上一段中进行了介绍。请仔细阅读整个答案。
vidstige

我知道什么是空对象。我相信我的最后一段涵盖了这个用例。
vidstige

3

您还可以执行以下操作:

public event EventHandler MyEvent = delegate {}

1

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

另外,请确保您确实在某处引发了该活动。


我也是这么想的,所以我将XAML代码移到了后面的代码中,并显示了相同的警告!是的,我100%确信活动正在某个地方举行。我正在看它。它连接到一个按钮。
jedmao

1

您可以禁止个别警告。

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

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


1

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

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

9
这将禁用整个项目中的警告,从而可能隐藏未使用事件的实际问题。
vidstige 2013年
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.