首页 > 解决方案 > 我应该假设发件人可以为空吗?

问题描述

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

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

标签: c#resharper

解决方案


每个人都建议我检查一个对象是否为空。因此,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();        
    }

推荐阅读