我应该假设发件人可以为空吗?

Should I assume sender can be null?

我是否应该假设 sender(CLR 事件处理程序)或 d(依赖事件处理程序)为 null 并为此编写一些代码?或者我可以简单地将它们标记为 [NotNull] 并忽略警告吗?

我正在使用 VS2019 + ReShaper 构建 C# 项目。当R#的"Value Analysis Mode"设置为"Pessimistic (an entity is assumed when it doesn't have explicit NotNull attribute)"时,它会警告sender并且d可以是null

//// R# warns sender can be null.
private void OnSomethingHappened(object sender, EventArgs e) {
    //// Should I throw an Exception when sender is null?
    //// Or can I simply mark sender as [NotNull]?
}

//// R# warns d can be null.
private static void (DependencyObject d, DependencyPropertyChangedEventArgs e) 
{
    //// Should I throw an Exception when d is null?
    //// Or can I simply mark d as [NotNull]?
}

写空检查总是安全的:

if(objectThatShouldNotBeNull == null)
{
  AppropriateAction();
  // if necessary
  return;
}

通常,如果稍后在代码中使用它,IMO 必须检查它的 null 值。

特别是有时您或其他开发人员可能想从代码中调用此方法(我有时这样做 - 然后我遵循 abocve 模式)并将 sender 设置为 null

每个人都推荐我检查一个对象是否为空。因此,IMO,如果我想在方法中使用 sender(或 d),这将是最佳实践。

    private void OnSomethingHappened([CanBeNull]object sender, EventArgs e) {
        if (!(sender is MyClass mc)) throw new ArgumentException();

        mc.DoSomething();        
    }

编辑: 现在我更喜欢这个:

    private void OnSomethingHappened([CanBeNull]object sender, EventArgs e) {
        var mc = sender as MyClass ?? throw new ArgumentException();

        mc.DoSomething();        
    }