C#のEqualsメソッドと等値演算子の違いとは?

- システム
エンジニア - Equalsメソッドとはなんですか?
- プロジェクト
マネージャー - 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#では、いくつかの方法で文字列を比較する方法があります。そのため、いくつかある文字列の比較方法の中から、一番良いパフォーマンスを出せる処理を適材適所で使い分ける必要があります。
- システム
エンジニア - Equalsメソッドのことがわかりました。
- プロジェクト
マネージャー - 「Equals」メソッドと「==」を使い分け、実際にコードを書いてみましょう。
「Equals()」「==」を使い分けてC#での文字列比較をマスターしよう!
「==」はタイプセーフというメリットがありますが、「==」演算子が提供されていない参照型では、Equalsメソッドを使うしかないなど、使い分ける必要があります。
参照の等価を調べる場合は「Equals」メソッド、値の等価を調べたい場合は「==」演算子を使用するなど使い分けることで、C#の文字列比較をマスターしましょう。
FEnet.NETナビ・.NETコラムは株式会社オープンアップシステムが運営しています。
株式会社オープンアップシステムはこんな会社です
秋葉原オフィスには株式会社オープンアップシステムをはじめグループのIT企業が集結!
数多くのエンジニアが集まります。

-
スマホアプリから業務系システムまで
スマホアプリから業務系システムまで開発案件多数。システムエンジニア・プログラマーとしての多彩なキャリアパスがあります。
-
充実した研修制度
毎年、IT技術のトレンドや社員の要望に合わせて、カリキュラムを刷新し展開しています。社内講師の丁寧なサポートを受けながら、自分のペースで学ぶことができます。
-
資格取得を応援
スキルアップしたい社員を応援するために資格取得一時金制度を設けています。受験料(実費)と合わせて資格レベルに合わせた最大10万円の一時金も支給しています。
-
東証プライム上場企業グループ
オープンアップシステムは東証プライム上場「株式会社オープンアップグループ」のグループ企業です。
安定した経営基盤とグループ間のスムーズな連携でコロナ禍でも安定した雇用を実現させています。
株式会社オープンアップシステムに興味を持った方へ
株式会社オープンアップシステムでは、開発系エンジニア・プログラマを募集しています。
年収をアップしたい!スキルアップしたい!大手の上流案件にチャレンジしたい!
まずは話だけでも聞いてみたい場合もOK。お気軽にご登録ください。


C#新着案件New Job
-
システム開発/東京都新宿区/【WEB面談可/C#経験者/20代前半の方活躍中/経験1年以上の方活躍中】/在宅勤務
月給29万~34万円東京都新宿区(新宿駅) -
システム開発/東京都新宿区/【WEB面談可/C#経験者/20代後半~40代の方活躍中/経験年数不問】/在宅勤務
月給41万~50万円東京都新宿区(新宿駅) -
デバック、テスト項目の作成/神奈川県横浜市/【WEB面談可/C#経験者/20代前半の方活躍中/経験1年以上の方活躍中】/在宅勤務
月給29万~34万円神奈川県横浜市(桜木町駅) -
デバック、テスト項目の作成/神奈川県横浜市/【WEB面談可/C#経験者/20代後半~40代の方活躍中/経験年数不問】/在宅勤務
月給41万~50万円神奈川県横浜市(桜木町駅) -
基幹システム開発導入/東京都新宿区/【WEB面談可/C#経験者/20代前半の方活躍中/経験1年以上の方活躍中】/在宅勤務
月給29万~34万円東京都新宿区(西新宿駅) -
基幹システム開発導入/東京都新宿区/【WEB面談可/C#経験者/20代後半~40代の方活躍中/経験年数不問】/在宅勤務
月給41万~50万円東京都新宿区(西新宿駅)