C# 在常量上使用.Equals以避免(保存)空检查

C# 在常量上使用.Equals以避免(保存)空检查,c#,equals,C#,Equals,这是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()或“He

这是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()类型检查的一般方法和最佳实践是什么


另外,我的问题是:你对这个问题的总体看法是什么:坏的/黑的还是好的/好的?

Equals方法通常会检查空值,但是如果你试图通过删除一个空值检查来优化代码,那么你就真的找不到目标了。实际上,这在任何应用程序中都不会有什么不同。

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

我非常喜欢较短的代码(我的意思是更少的标记,而不是使用不可解析的短标识符)-它通常更可读、更容易理解,更不容易出现错误,并且让您维护的代码更少

因此,在我的书中,使用true.Equals将空检查保留为.Equals是一个明显的胜利

在这个特定的示例中,您甚至可以删除重复返回并执行以下操作

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

但是有些人可能会发现它的可读性不如if语句。

我非常喜欢较短的代码(我的意思是更少的标记,而不是使用不可解析的短标识符)——它通常更可读、更容易理解,更不容易出现错误,并且让您维护的代码更少

因此,在我的书中,使用true.Equals将空检查保留为.Equals是一个明显的胜利

在这个特定的示例中,您甚至可以删除重复返回并执行以下操作

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

但是有些人可能会发现它的可读性不如if语句。

首先,您可能应该为转换器使用基本泛型类,它有一个
虚拟的
强类型方法,在这种情况下,您不处理
对象
,而是在转换器代码中使用
bool

如果我们坚持使用对象值,我主张使用可读的、可维护的代码和短函数来代替ifs,因为ifs在将来可能会变得模糊

所以我会使用类似smth的

{
 if(IsValueBoolAndTrue(value){
    return ErrorColor;
 }
 else {
    return DefaultColor;
 }
}
Color.Red
null
是常数,它们的意图也不清楚。另外,定义这两个常量有助于在IValueConverter的第二种方法中进行转换

{
 if (value == null)
  return null;

 if (value.Equals(true))
  return Colors.Red;

 return null;
}

虽然方法
IsValueBoolAndTrue
在技术上做的事情与
true.Equals(value)
做的事情是一样的(实际上它可以在内部调用它),但拥有一个特殊的方法将有助于人们在将来看到这个问题时,不要进行会破坏代码的“重构”,因为他会看到
true.Equals(value)
没有任何注释,认为它实际上不适合smth,或者会认为它不雅观的代码并对其进行重构,而不保留其功能性。

首先,您可能应该为转换器使用基本泛型类,它有一个
虚拟的
强类型方法,在这种情况下,您不是在处理
对象
,而是在转换器代码中处理
bool

如果我们坚持使用对象值,我主张使用可读的、可维护的代码和短函数来代替ifs,因为ifs在将来可能会变得模糊

所以我会使用类似smth的

{
 if(IsValueBoolAndTrue(value){
    return ErrorColor;
 }
 else {
    return DefaultColor;
 }
}
Color.Red
null
是常数,它们的意图也不清楚。另外,定义这两个常量有助于在IValueConverter的第二种方法中进行转换

{
 if (value == null)
  return null;

 if (value.Equals(true))
  return Colors.Red;

 return null;
}

虽然方法
IsValueBoolAndTrue
在技术上做的事情与
true.Equals(value)
做的事情是一样的(实际上它可以在内部调用它),但拥有一个特殊的方法将有助于人们在将来看到这个问题时,不要进行会破坏代码的“重构”,因为他会看到
true.Equals(value)
没有任何注释,认为它实际上不适合smth,或者会认为它不雅观的代码并重构它,而不保留其功能性。

使用静态方法可以避免
NullReferenceException
true.Equals(value)
之类的“有趣”调用。因为该方法是通过
对象实现的,所以它在所有方法中都可用,并且它将为您执行必要的空检查:

return Equals(value, true) ? (Object) Color.Red : null;
或者,如果您不喜欢三元运算符:

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

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

return Equals(value, true) ? (Object) Color.Red : null;
或者,如果您不喜欢三元运算符:

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

您认为空检查是性能瓶颈吗?不,这不是重点,它将在.Equals()中进行检查。我的想法是让代码变得更小更容易。你可以做的事情非常少(只想到字符串)。如果您可以使用类似于
true.Equals(value)
的内容,那么您很可能正在处理值类型,而不必担心空检查。除此之外,空检查也没什么大不了的。
{return true.Equals(value)?Colors.Red:null;}
这是在做一些事情时,比如删除那些你没有理由删除的东西,因为它们已经存在了。好吧,那么我就假设你的目标确实与编写好的可维护代码相冲突。您并没有使代码“更容易”(无论这意味着什么),而是使其意图更加模糊。您认为空检查是性能瓶颈吗?不,这不是重点,它将在.Equals()中进行检查。我的想法是让代码变得更小更容易。你可以做的事情非常少(只想到字符串)。如果你能得到像
true.Equals(value)
这样的东西,那么你很可能正在处理一个值