【问题标题】:SonarLint Rule S1172 "Unused method parameters should be removed" and EventHandlersSonarLint 规则 S1172“应删除未使用的方法参数”和 EventHandlers
【发布时间】:2015-11-11 18:39:35
【问题描述】:

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

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

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

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

您可以使用 Reactive Extensions 重写代码并制作“Observables”,但这对于简单的事件处理程序来说是相当复杂的解决方案。另一种选择可能是重写代码,如:

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

但接下来的问题是你如何处理UnSubscribe()?我认为未使用的参数不适用于事件处理程序方法。但在 SonarLint 中可能很难检测到。

【问题讨论】:

  • 如下所述,将委托存储在字段中是一种选择。但我认为如果这是一种常见情况,我们应该在 SonarLint 中正确处理这个问题。我的感觉是,如果您根本不需要senderEventArgs,那么您可以使用没有这些的自定义委托。但这仅在您控制事件类型时才有效。是这样吗?您是否有需要这两个参数的订阅者?您认为这违反事件处理最佳实践吗?
  • 我认为它的设计准则是事件总是应该是(派生的)EventHandler 类型。这意味着您将始终收到发件人和EventArgs。因此,即使订阅者不使用这些参数,.Net 框架中的所有事件都是使用此范例构建的,因此 SonarLint 应该能够处理此问题。我认为 resharper 正确识别事件处理方法并忽略这些未使用的参数。
  • 谢谢,我们在github.com/SonarSource/sonarlint-vs/issues/211继续讨论
  • 这似乎是 C# 或 VisualStudio feature,但确实引发了其他问题,请参阅我的问题:stackoverflow.com/q/41162335/1845672。顺便说一句,github 上的讨论链接已失效

标签: c# visual-studio-2015 sonarlint


【解决方案1】:

如果您需要退订,您需要store the delegate(删除静态以获得正确的代码,这是从被黑的控制台应用程序项目中粘贴的):

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()
{
}

或者使用a mass-unsubscribe:

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

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

TestEvent = null;

或者只使用您一直使用的语法并创建一个非匿名方法,如上所示。这种语法没有错。你可以做强制性的

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

摆脱警告;)

【讨论】:

  • PS:我认为这应该被视为S1172中的一个错误。
  • 这并不能解决我的问题。必须将 EventHandler 存储在字段中以解决规则警告 S1172 似乎不是解决警告的正确方法。所以是的,我还要说它是 S1172 中的一个错误
  • 只需添加 ArgumentNullChecks ;)。如果您确实开始使用这些参数,那么您将遇到下一个 SonarLint 错误;)。
  • 在 GitHub 上的 SonarLint 问题上提出:github.com/SonarSource/sonarlint-vs/issues/211
猜你喜欢
  • 2016-01-28
  • 1970-01-01
  • 2017-03-02
  • 1970-01-01
  • 2020-07-10
  • 2016-12-02
  • 2021-12-06
  • 2019-02-22
  • 1970-01-01
相关资源
最近更新 更多