"ReferenceEquals(myObject,null)"比"myObject == null"更好吗?

mdr*_*den 41 .net c# vb.net

我有一个同事,他喜欢写下他的空检查,如下所示:

if (!ReferenceEquals(myObject, null))
Run Code Online (Sandbox Code Playgroud)

另一方面,我觉得这种语法很难阅读并且更喜欢:

if (myObject != null)
Run Code Online (Sandbox Code Playgroud)

我发现一些文章和堆栈溢出问题讨论了关于运算符重载的ReferenceEquals的优点,但是在运算符重载方案之外,ReferenceEquals vs ==有什么好处?

Ree*_*sey 40

但是在运算符重载方案之外,ReferenceEquals与==有什么好处?

不 - 明确使用的唯一优势(并且我认为它没有多大优势)Object.ReferenceEquals将永远不会使用重载运算符equals.在非重载的情况下,==运算符被定义为"如果它的两个操作数引用同一个对象",则返回"对于除"字符串以外的所有"引用类型".因此,它的等价物(假设它没有超载).

我个人也赞成使用第二种语法,并发现它对于空检查更易于维护.我还要争辩说,任何超载operator==都应该提供适当的检查null,如果它没有出于某种原因(这将是奇怪的),那么这个决定背后可能会有一个特定的理由导致你想要使用过载,而不是ReferenceEquals.


Ber*_*rdV 31

使用c#7,您可以使用:

if ( !(myObject is null) )
Run Code Online (Sandbox Code Playgroud)

它相当于

if (!ReferenceEquals(myObject, null))
Run Code Online (Sandbox Code Playgroud)

  • 你确定吗?[C# 参考](https://docs.microsoft.com/en-us/dotnet/csharp/language-reference/keywords/is#constant-pattern) 表示“表达式的值由对静态`Object.Equals(expr,constant)`方法。” 并且 `if ( !(myObject is null) )` 翻译为 `if (myObject != null)` [在 SharpLab 中](https://sharplab.io/#v2:CYLg1APgAgTAjAWAFBQMwAJboMLoN7LpGYYBGA9uQDboCSAzgHICuVVAFOaQFYCmAxgBd0AWwCeAeR4DBASnyFiSgJYAzdO3Q BCduKl8h6ZfXQA7VlXnyCSJXeJQA7OkEAnZrwDci+wF8fdgFKTuiqAIZU9F4B/ki+QA)。相关:/sf/answers/2997010901/ (2认同)

Ser*_*rvy 5

好吧,如果有人要覆盖==或!=运算符,他们可以让他们做任何他们想做的事情.该甚至可以把它做一些真正的意思是像return true;return false;.另外,如果有一个重载的运算符,它有一个不太好的机会,它不会表现得好ReferenceEquals(不保证,它可能不够重要,但仍然).

话虽如此,由于任何重载运算符的任何合理实现,这根本不是问题.我个人不使用,ReferenceEquals除非我有令人信服的理由不在==该类型或特定情况下使用运算符.

  • 如果重载的`==`运算符执行得不好/不正确,那么*那是*应该修复的错误.使用`ReferenceEquals()`来解决它并不是正确的方法. (8认同)
  • @MichaelBurr你假设你可以控制类型,因此有能力修复它.情况并非总是如此. (4认同)