C# 為什麼你應該更喜歡 is 關鍵字而不是 == 運算子

Crazy Struggle發表於2021-08-12

前言

  在C# 進行開發中,檢查引數值是否為null大家都用什麼?本文介紹除了傳統的方式==運算子,還有一種可以商用is關鍵字。

C# 7.0 中 is 關鍵字的使用

  傳統的方式是使用==運算子:

if(person == null) { }

  從 C# 7 開始,可以使用is關鍵字進行空檢查:

if(person is null) { }

  1、is關鍵字有一個很大的優勢,它會忽略在要檢查的例項的類上定義的任何運算子過載。

  2、當使用==運算子時,該運算子可能會被過載,並且會得到意想不到的結果。

示例

  1、is關鍵字

  我們來看一個簡單的例子,建立一個.NET 控制檯應用程式,在Main 方法中編寫如下所示程式碼。

  首先宣告瞭一個person型別的變數Person,並且賦值null, 然後將person == null和結果person is null寫入控制檯。

static void Main(string[] args)
{
  Person person = null;
​
  Console.WriteLine("Is Person null?");
​
  Console.WriteLine($"== says: {person == null}");
​
  Console.WriteLine($"is says: {person is null}");
}
public class Person
{
  ...
}

  可以猜猜,上面程式碼的執行結果會是什麼?

  大家可能認為控制檯會輸出下面結果:

Is Person null? 
== says: True 
is says: True

  實際上,可以從上面的程式碼中肯定地說, person is null肯定會返回true,因為person變數實際上是null

  但是 person == null 返回 truefalse,是不確定的,因為 Person類沒有定義任何的內容。如果Person類過載了==操作符,它就可以為所欲為。

  2、過載==運算子

  現在我們再來建立一個Person類像下面這樣的,如下所示,過載了==運算子,並且只返回 false:

public class Person
{
  public static bool operator ==(Person x, Person y)
  {
    return false;
  }
  public static bool operator !=(Person x, Person y)
  {
    return !(x == y);
  }
  public override bool Equals(object obj)
  {
    return base.Equals(obj);
  }
}

  現在執行控制檯應用程式時,可以看到下面的輸出結果:

Is Person null? 
== says: False 
is says: True

  is關鍵字執行的結果是正確的,因為person變數實際上是null,但是過載過的的操作符返回的結果可能就不同。

總結

  因此在程式碼中我們可以進行明智的選擇,如果想要進行null的判斷,is關鍵字就是最好的選擇。你一旦使用習慣了,它在程式碼中看起來是比較清晰簡潔。

  原文:https://www.thomasclaudiushuber.com
  作者:Thomas Claudius Huber

 

優秀是一種習慣,歡迎大家關注學習  

 

 

相關文章