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

时间:2019-05-31 08:13:43

标签: c# resharper

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

我正在使用VS2019 + ReShaper构建C#项目。当R#的“值分析模式”设置为“悲观(假设一个实体没有显式的NotNull属性时),它会警告senderd 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]?
}

2 个答案:

答案 0 :(得分:0)

写空检查总是安全的:

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

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

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

答案 1 :(得分:0)

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

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

        mc.DoSomething();        
    }