17
14

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

.NET (C#) の比較色々

Last updated at Posted at 2014-02-14

いつも調べるのでまとめておく。(書きかけっぽい感じですみません。。。)

比較についてのコラム的なものはこちらのコメントを参照してください。

Object.ReferenceEquals(Object objA, Object objB) メソッド

  • その名の通り参照の等価を比較
  • Object 型に対する a == b と等価
  • ==演算子をオーバーロードするときにお世話になるかも(普通に a == null を呼び出すと無限ループになるため)

Object.Equals(Object objA, Object objB) メソッド

  • 両方、あるいは片方が null であればその場で true もしくは false を判定して返す。
  • そうでなければ(両方とも null でなければ) objA.Equals(objB) を呼び出す。
  • IEquatable<T> は利用されない。
class Program
{
    static void Main(string[] args)
    {
        Console.WriteLine(Object.Equals(new Hoge { Fuga = "abc" },
                                        new Hoge { Fuga = "abc" }));
        // -> True

        Console.WriteLine(Object.Equals(new Hoge { Fuga = "abc" },
                                        new Hoge { Fuga = "xyz" }));
        // -> False

        Console.Read();
    }
}

public class Hoge : IEquatable<Hoge>
{
    public string Fuga { get; set; }

    public override bool Equals(object obj)
    {
        if (Fuga == "xyz") throw new NotImplementedException();
        if (obj == null) return false;
        if (obj is Hoge)
        {
            return ((Hoge)obj).Fuga == Fuga;
        }
        return base.Equals(obj);
    }

    public override int GetHashCode()
    {
        return (Fuga != null ? Fuga.GetHashCode() : 0);
    }

    public bool Equals(Hoge other)
    {
        throw new NotImplementedException();
    }
}

EqualityComparer.Default.Equals(T x, T y) メソッド

IEquatable<T> が利用される点が異なる。

  • null チェックについては Object.Equals(Object, Object) と同様。
  • xIEquatable<T> を実装する場合は IEquatable<T>.Equals(T other) が呼び出される。
  • さもなければ Object.Equals(Object obj) が呼び出される。

EqualityComparer クラス

  • IEqualityComparer<T> を実装するための基底クラス。
  • Equals(T x, T y) および GetHashCode(T obj) をオーバーライドして使用する。

StringComparer クラス

  • IComparer<string>, IEqualityComparer<string> の 2 つを実装。
  • StringComparison 列挙体に対応した序列判定、等価性判定を提供する。

IStructuralEquatable インターフェース

^m^

17
14
1

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
17
14

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?