c# - 我应该假设发件人可以为空吗?
问题描述
我应该假设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]?
}
解决方案
每个人都建议我检查一个对象是否为空。因此,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();
}
推荐阅读
- javascript - 如何解决对变量的承诺?
- mysql - MYSQL 存储 JSON - 最好的方法?
- python-3.x - PyQt5 - 在 QAction() 和 menuBar.addMenu() 方法中,“&”代表什么?
- javascript - Attempting JavaScript Snake Game - Snake Tail 被画成碎片;不在一起
- python-3.x - 从配置文件中读取的 '\r\n' 不等同于 python 的解释或 '\r\n'
- entity-framework - 工作单元 sql 查询性能下降
- arrays - 在 Visual Basic 中对数组的浅拷贝感到困惑
- c# - ASP.NET MVC 登录 ReturnUrl=%2F
- python - Django:结合两个相似的 util 函数
- python - 如何迭代地实现牛顿法来估计根