我应该假设发件人可以为空吗?
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();
}
我是否应该假设 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();
}