使用“is object”而不是“!= null”或Object.ReferenceEquals()

时间:2017-10-10 11:49:50

标签: c#

一直困扰我的是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,所以......为什么不呢?

我发现,至少对我来说,像这样的代码更易读,更容易输入,特别是因为肯定的情况(事物是对象)在我的代码中比在负面情况下更常见(!(事情)是对象))。

所以我的问题是,是否有任何我不知道的陷阱或边缘情况?它被认为是不好的做法还是效率低下的?这让人困惑吗?为什么我没有看到这样的代码?

2 个答案:

答案 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)提供较少有用的建议'