一直困扰我的是C#没有专用的引用相等运算符,一个不能重载的运算符。要测试引用是否为null,我想编写如下代码:
if (thing == null)
但总是有这种唠叨的想法,“如果这个类超载了==运算符怎么办?”。我对该类是否认为该对象等效于null不感兴趣。我对对象引用是否为空感兴趣。替代方案似乎是在反对:
if ((object)thing == null)
和Object.ReferenceEquals():
if (Object.ReferenceEquals(thing, null)) // long form
if (ReferenceEquals(thing, null)) // short form
但最近我一直在编写这样的代码:
if (thing is object) // thing != null
if (!(thing is object)) // thing == null
我把它读成“如果事物是一个物体”,也就是说它被设置为一个物体。我意识到这不是“is”运算符的目的,但它检查空引用并且所有引用类型都继承自object,所以......为什么不呢?
我发现,至少对我来说,像这样的代码更易读,更容易输入,特别是因为肯定的情况(事物是对象)在我的代码中比在负面情况下更常见(!(事情)是对象))。
所以我的问题是,是否有任何我不知道的陷阱或边缘情况?它被认为是不好的做法还是效率低下的?这让人困惑吗?为什么我没有看到这样的代码?
答案 0 :(得分:3)
用
if (thing is object)
...
你混淆了你想做的事 - 检查null
。你现在可能很明显也很干净,但可能不会在几个月内(鉴于你已经放弃了这种做法)而且对任何人来说肯定是不其他。如果我遇到这个,它会让我对作者的意图感到困惑。如果你需要一个评论来解释你做了什么......不要这样做。 (当然,有些情况下你可以而且应该,但绝对不能像null
那样简单 - 检查。)
最终,您将使代码的可维护性降低,因为理解您的代码总是需要双重代码。帮自己一个忙,让你的代码尽可能干净,这意味着诚实地对待你的意图。
答案 1 :(得分:1)
我只是在寻找一种更易读的形式。
如果你的目标是简洁,那么扩展方法可能是你最好的选择。
public static class NullExtensions
{
public static bool ExactlyNull(this object toCheck)
{
return ReferenceEquals(toCheck, null);
}
}
老实说,我只是按原样使用ReferenceEquals
。使用这样的扩展方法往往会降低可维护性,并且通常会导致某些工具(例如Resharper)提供较少有用的建议'