当前位置: 首页 > 知识库问答 >
问题:

Sonarint规则S1172“应删除未使用的方法参数”和EventHandler

元胡媚
2023-03-14

创建EventHandler方法时,如何修复Sonarint规则S1172“应删除未使用的方法参数”。

public void Subscribe()
{
    MyEvent += OnMyEvent;
}

public void UnSubscribe()
{
    MyEvent -= OnMyEvent;
}

private void OnMyEvent(object sender, EventArgs e)
{
   DoSomething();
}

您可以使用反应式扩展重写代码,并创建“可观察的”,但对于简单的事件处理程序来说,这是一个相当复杂的解决方案。另一种选择是重写代码,如下所示:

public void Subscribe()
{
   MyEvent += (s,e) => DoSomething();
}

但接下来的问题是如何执行取消订阅()?在我看来,未使用的参数不适用于事件处理程序方法。但在声纳探测中可能很难做到这一点。

共有1个答案

艾望
2023-03-14

如果您需要取消订阅,您需要存储委托(删除静态以获得正确的代码,这是从被黑客攻击的控制台应用程序项目中粘贴的):

public static event EventHandler TestEvent;

private static EventHandler saved = (s, e) => DoSomething();

static void Main(string[] args)
{
    TestEvent += saved;
    TestEvent -= saved;
}

internal static void DoSomething()
{
}

或者使用大规模退订:

foreach (Delegate d in TestEvent.GetInvocationList())
{
    TestEvent -= (EventHandler)d;
}

或者,如果您拥有该事件,您也可以使用它取消订阅所有:

TestEvent = null;

或者只是使用你一直使用的语法,创建一个非匿名方法,就像你上面展示的那样。这种语法没有错。你可以做义务工作

if (sender == null) 
    throw ArgumentNullException(nameof(sender));

为了摆脱警告;)

 类似资料:
  • 我刚刚将Intellij Idea的SonarLint插件更新为2.3.2版。Changelog表示,由于2.3版,连接模式下的规则排除应该可用。 下面是我的配置,似乎被更正了,然而,忽略的规则仍然弹出。

  • 我遇到了一个问题: 移除这个未使用的方法参数“messageId”。 我的方法看起来像: 用于过滤器的。这不是字段。它是方法参数。 那是一个< code >声纳错误还是我忽略了什么?我们用的是声纳5.6

  • 我想删除,同时删除中具有匹配的 目前,我有一个外键设置为on delete,更新设置为for。

  • 我正在尝试使用Opendaylight氮气开发一个应用程序。 出于调试目的,我想删除opendaylight缓存的所有流规则(这些规则在交换机重新连接时重新安装)。我想删除这些规则并重新启动容器以检查行为。Opendaylight在哪里存储这些(在哪个文件中)? 谢啦 兰加

  • 问题内容: 如果您有如下代码: gofmt重写规则可以将其更改为: 我试过了: 但是我得到: 我也尝试过: 但这给int而不是t带来了类似的错误 我已经阅读了gofmt文档。网络搜索没有发现任何有用的信息。 我故意使用单个字符标识符来匹配表达式。 我怀疑问题可能在于尝试匹配类型,因为它可能不被视为“表达式” 使用gofmt可以做到这一点吗? 问题答案: 不,这不可能- 因为将fmt视为模式是“表达

  • 下面是这个问题:我被要求从哪里开始一个新问题。 问题是我对JUnit了解不够,或者对等的了解不够,无法以Jeff Bowman提到的方式解决这个问题。