.net column
.NET開発者のためのブログメディア

インフラエンジニア データベースエンジニア

C# Equals

2021年07月21日

SE
Equalsメソッドとはなんですか?

PM
Equalsメソッドと等値演算子「==」では比較処理の違いがあります。詳しく見ていきましょう。

C# 文字列を比較するEqualsメソッドとは?「==」との違いは?


今回は、C#でオブジェクトを比較するときに使用するEqualsメソッドと等値演算子「==」の違いについて書いていきたいと思いますので、ぜひ参考にしてみてください。

Equalsメソッドと「==」の違い

C#で文字列を比較する際の、string.Equalsメソッドと等値演算子「==」での比較処理の違いは下記となっております。

・処理速度が違う
・タイプセーフかどうか

処理速度が違う

「==」とEqualsメソッドの違いの一つ目はまず、処理速度の違いです。いくつかのサイトをのぞいてみましたが、どのサイトもEqualsメソッドの方が高速との記載がありました。

百聞は一見に如かずということで実際に、1千万回比較する処理を行って、処理速度を比較してみましょう。

paiza.ioというサイトではブラウザ上でC#など様々な言語のプログラムを実行できるので、このサイトの埋め込みを使用してC#のプログラムを動かしてみます。

私が実行したときは、約30msの違いがありEqualsメソッドの方が速くなりました。

タイプセーフかどうか

次にタイプセーフかどうかです。

C#では「==」演算子がタイプセーフである一方、Equalsメソッドは違う型であっても比較できてしまい、タイプセーフではありません。

string型はobject型を継承しているため、Equalsメソッドの引数にobject型を受け取ることができてしまうためです。

これも、実際にコードを動かして確かめてみましょう。
Equalsメソッドの引数は、object型を受け取れるためint型の数値とstring型の数字を比較することができてしまいます。

実行すると、コンパイルエラーが発生するのがわかると思います。このように、「==」演算子はタイプセーフなので、エラーが発生しますが、Equalsメソッドはobject型(int型はobject型を継承している) を受け入れるためエラーが発生しません。

int型とstring型をEqualsメソッドで比較するような実装をすることはなかなかないと思いますが、「==」演算子で比較する場合は、ビルド時にエラーが発生するため、意図しない動作をビルド時に防げるというメリットがあります。

Equalsメソッドとは

ここで、Equalsメソッドについての説明です。
string.Equalsメソッドは、2つの文字列を比較できるメソッドです。

引数にStringComparison列挙体の値を指定すれば、カルチャに依存した文字列の比較や大文字と小文字を区別した文字列の比較が可能です。

StringComparisonには次のようなものが用意されています。

CurrentCulture 0 カルチャに依存した並べ替え規則と、現在のカルチャを使用して、文字列を比較します。
CurrentCultureIgnoreCase 1 カルチャに依存した並べ替え規則と、現在のカルチャを使用し、比較対象の文字列の大文字と小文字の区別を無視して、文字列を比較します。
InvariantCulture 2 カルチャに依存した並べ替え規則とインバリアント カルチャを使用し、文字列を比較します。
InvariantCultureIgnoreCase 3 カルチャに依存した並べ替え規則と、インバリアントカルチャを使用し、比較対象の文字列の大文字と小文字の区別を無視して、文字列を比較します。
Ordinal 4 序数 (バイナリ) の並べ替え規則を使用して、文字列を比較します。
OrdinalIgnoreCase 5 序数 (バイナリ) の並べ替え規則を使用して比較対象の文字列の大文字と小文字の区別を無視し、文字列を比較します。

Equalsメソッドを使用して実際に文字列を比較してみましょう。

“encyclopaedia” と”encyclopædia” は、en-US(英語)では同じ文字として判断されますが、se-SE(サーミ語)カルチャでは同じ文字として認識されないことがわかります。

C#で文字列を比較する適切な方法は?

C#での「==」演算子での比較、Equalsメソッドを使用した文字列の比較それぞれの違いを挙げました。
・「==」はタイプセーフである
・Equalsメソッドは処理が速い

しかし、C#での文字列比較では結局どちらを使用するのが良いのでしょうか?

速さを重視するなら、実際に動かしてみて速いということを実感したEqualsメソッドを使用するべきだと思いますが、その処理速度の違いは微々たるものです。

それよりも、タイプセーフでわかりやすい「==」演算子を使う方が「保守性」「可読性」を向上させられるため「==」演算子を使用するのが良いでしょう。

ただ、Equalsメソッドは大文字と小文字を区別しない比較やカルチャに依存した比較などができるため、C#ではEqualsメソッドを使用した比較を行う場面が多いと思います。

大文字と小文字を区別しない比較を行うときだけEqualsメソッドを使用して、通常は「==」演算子を使用するような書き方をしたら、混在してしまい統一性がないため、Equalsメソッドを使用した方がいいと思うところもあります。

結局のところ、適材適所で使い分けるのが良いということでしょう。

C#で文字列を比較する他の方法

C#では「==」演算子、Equalsメソッド以外にも文字列を比較する方法があります。

まず、string.Compareメソッドです。

string.Compareメソッドも、二つの文字列を比較できるメソッドですが、返す値がEqualsメソッドとは違います。EqualsメソッドではTrueかFalse(bool)を返していましたが、Compareメソッドでは比較した文字列の並び替え順序を整数で返します。

返される値は以下のようになります。
・等しい:0
・大きい:0 より大きい
・小さい:0 より小さい

今回も実際に動かしてみましょう。

次に、string.CompareToです。
こちらのメソッドも、二つの文字列を比較できるメソッドで、Compareメソッド同様文字列の並び替え順序を整数で返します。また、カルチャに依存し、大文字と小文字を区別する比較を実行するため、Equalsメソッドのようなカルチャに依存しない比較、大文字と小文字を区別した比較を行うことはできません。

返される値も、Compareメソッドと同じで以下のようになります。
・等しい:0
・大きい:0 より大きい
・小さい:0 より小さい

今回も実際に動かしてみましょう。

最後は、String.CompareOrdinalメソッドです。

String.CompareOrdinalメソッドは、二つの文字列の部分文字列を比較できるメソッドです。文字列から部分文字列を比較したい場合に活用できるメソッドです。

返される値は、上記二つのメソッドと同じです。
・等しい:0
・大きい:0 より大きい
・小さい:0 より小さい

このようにC#では、いくつかの方法で文字列を比較する方法があります。そのため、いくつかある文字列の比較方法の中から、一番良いパフォーマンスを出せる処理を適材適所で使い分ける必要があります。

SE
Equalsメソッドのことがわかりました。

PM
「Equals」メソッドと「==」を使い分け、実際にコードを書いてみましょう。

「Equals()」「==」を使い分けてC#での文字列比較をマスターしよう!

「==」はタイプセーフというメリットがありますが、「==」演算子が提供されていない参照型では、Equalsメソッドを使うしかないなど、使い分ける必要があります。

参照の等価を調べる場合は「Equals」メソッド、値の等価を調べたい場合は「==」演算子を使用するなど使い分けることで、C#の文字列比較をマスターしましょう。


.NET分野でのキャリアアップをお考えの方は、現在募集中の求人情報をご覧ください。

また、直接のエントリーも受け付けております。

エントリー(応募フォーム)

Search

Popular

reccomended

Categories

Tags