以下は C# メソッドの例でありEquals()
、実行中にエラーが報告されます。
static void Main(string[] args)
{
string name = "sandeep";
string myName = null;
Console.WriteLine("== operator result is {0}", name == myName);
Console.WriteLine("Equals method result is {0}", myName.Equals(name));
Console.ReadKey();
}
エラーメッセージは次のとおりです。
NullReferenceException が処理されませんでした
オブジェクト参照がインスタンス オブジェクトに設定されていません。
等しいエラー: NullReferenceException が処理されませんでした
null 参照例外が処理されなかったこと、つまりオブジェクト参照がオブジェクト インスタンスに設定されなかったことを意味します。
その原因をどのように分析すべきでしょうか?これには、==
演算子とメソッドEquals()
の違いを理解する必要があります。
==
演算子とEquals()
メソッドはいずれも、2 つの値型データ項目または参照型データ項目を比較するために使用されます。等価演算子 ( ) は、文字列の内容を比較する==
比較演算子です。オペレーターは参照 ID を比較しますが、メソッドはコンテンツのみを比較します。いくつかの例を見てみましょう。Equals()
==
Equals()
以下の例では、文字列変数を別の変数に代入しています。文字列は参照型です。この例では、ある文字列変数が別の文字列変数に割り当てられているため、それらはヒープ内の同じ ID を参照し、両方とも同じ内容を持つため、True 出力が得られます。==
Equals()
using System;
namespace ComparisionExample
{
class Program
{
static void Main(string[] args)
{
string name = "sandeep";
string myName = name;
Console.WriteLine("== operator result is {0}", name == myName);
Console.WriteLine("Equals method result is {0}", name.Equals(myName));
Console.ReadKey();
}
}
}
ここでプログラムを実行すると、図 1.1 に示す結果が得られます。
図 1.1 最初のプログラムの出力
2 つのオブジェクト変数の内容は同じですが、両方の参照が異なる別の例を見てみましょう。したがって、==
演算子は参照 ID を比較するためfalseを返し、Equals()
メソッドはオブジェクトの内容を比較するためtrueを返します。
using System;
namespace ComparisionExample
{
class Program
{
static void Main(string[] args)
{
object name = "sandeep";
char[] values = {'s','a','n','d','e','e','p'};
object myName = new string(values);
Console.WriteLine("== operator result is {0}", name == myName);
Console.WriteLine("Equals method result is {0}", myName.Equals(name));
Console.ReadKey();
}
}
}
ここでプログラムを実行すると、図 1.2 に示す結果が得られます。
図 1.2 プログラム 2 の出力
ここで、この記事の冒頭のエラー例に戻りましょう。この例では、文字列変数に null 値を代入してその変数を使用すると、そのメソッドは文字列クラスの拡張メソッドであり、Equals()
メソッドEquals()
はnull 参照例外があるため、Equals()
メソッドを呼び出すときは、変数に null 値が含まれていないことを確認する必要があります。変数の 1 つに NULL 値が含まれている場合は、その変数をEquals()
メソッドの引数として使用する必要があります。
図 1.3 Null 参照例外
経験則として、文字Equals
列を除いて、ほぼすべての参照型について、参照の同一性ではなく等価性をテストする場合に使用します。==
比較文字列を使用すると、処理が単純になり読みやすくなりますが、演算子の両側を覚えておく必要があります。比較が正しく機能するには、文字列型の式である必要があります。