在常量上使用. equals来避免(保存)null检查

本文关键字:保存 检查 null 常量 equals | 更新日期: 2023-09-27 18:08:25

这是IValueConverter的标准代码

{
 if (value == null)
  return null;
 if (value.Equals(true))
  return Colors.Red;
 return null;
}

另一种方式:

{
 if (true.Equals(value))
  return Colors.Red;
 return null;
}

因此,通过使用true.Equals(),我们节省了一次空检查。关于使用true.Equals()或"Hello".Equals()类型检查的一般方法和最佳实践是什么?

p。我的问题是:你对这件事的总体看法是什么:坏的/hacky的还是ok/nice的?

在常量上使用. equals来避免(保存)null检查

. equals方法通常检查null,但是如果您试图通过删除单个null检查来优化代码,那么您真的错过了标记。这在几乎任何应用程序中都不会有什么不同。

我强烈倾向于更短的代码(我的意思是更少的令牌,而不是使用无法辨认的短标识符)——它通常更易于阅读和理解,更不容易出现bug,并且给您更少的代码维护。

因此,通过使用true将空检查留给。equals。在我看来,Equals是一个明显的赢家。

在这个特殊的例子中,您甚至可以删除重复的返回并执行

return true.Equals(value) ? Colors.RedColors.Red : null;

首先,您应该可能使用转换器的基泛型类,它具有virtual强类型方法,在这种情况下,您不处理object,而是在转换器代码中使用bool

如果我们被对象值所困扰,我建议使用可读和可维护的代码和简短的函数来代替将来可能变得模糊的If。

所以我要用

{
 if(IsValueBoolAndTrue(value){
    return ErrorColor;
 }
 else {
    return DefaultColor;
 }
}

Color.Rednull是常量,这也使得它们的意图不明确。另外,定义这两个常量可以帮助转换回IValueConverter的第二个方法

虽然方法IsValueBoolAndTrue在技术上和true.Equals(value)做同样的事情(实际上它自己可以调用这个),有一个特殊的方法将帮助人们,谁在未来看到这个,不要做一个"重构",这会破坏代码,因为他会看到没有注释的true.Equals(value),认为它实际上不是合适的,或者会认为它的代码不优雅,重构它,而不让它的功能保持不变。

您可以通过使用静态Object.Equals方法来避免NullReferenceException和像true.Equals(value)这样的"有趣"调用。因为该方法是由Object实现的,所以它在所有方法中都可用,并且它将为您执行必要的null检查:

return Equals(value, true) ? (Object) Color.Red : null;

或者如果你不喜欢三元操作符:

if (Equals(value, true))
  return Color.Red;
return null;