【发布时间】:2017-10-10 11:49:49
【问题描述】:
C# 没有一个不能重载的专用引用相等运算符,这一直困扰着我。为了测试引用是否为空,我想编写如下代码:
if (thing == null)
但总有这样一个烦人的想法,“如果类重载了 == 运算符怎么办?”。我对类是否认为对象等效于 null 不感兴趣。我对对象 reference 是否为空感兴趣。替代方案似乎正在转换为对象:
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”运算符的目的,但它确实检查空引用并且所有引用类型都从对象继承,所以......为什么不呢?
我发现,至少对我来说,这样的代码更易读,打字也更舒服,特别是因为在我的代码中,肯定情况(事物是对象)比否定情况(!(事物是对象))。
所以我的问题是,有没有我不知道的陷阱或边缘情况?它被认为是不好的做法还是效率低下?是否令人困惑?为什么我从来没有见过这样的代码?
【问题讨论】:
-
直到现在,我从来没有考虑过
is为false返回null值,所以我认为这会很混乱。主要是因为一个对象不是一个对象会很奇怪,至少对我来说 -
我不确定我是否理解为什么你这样做。如果一个对象已经覆盖了 == 以及它与 null 的比较,那么你为什么不直接使用它呢?如果对象实际上是一个空引用,而不是告诉你它相当于空的对象,我想不出任何你想做不同的事情的情况。该课程的作者应该担心它的
== null逻辑是否正确,我不知道你什么时候会决定你知道得更好...... -
@Steven c# 既有值比较,又有参考比较。这是2个不同的东西。这意味着它们相等或不相等并不是那么微不足道。
-
Object.ReferenceEquals有什么问题?这是惯用的。 -
这是基于意见的,但我认为您在简洁方面获得的任何优势都会被降低的可读性所抵消,即使仅仅是因为
thing == null如此无处不在。
标签: c#