スタイルがズレているのはスキンのリファクタリング中だからです。

C#の基本的なメソッドの実装

csharpC#
この記事は約4分で読めます。
スポンサーリンク

GetHashCode

ハッシュコードを返すメソッドです。
Objectクラスに定義されているため、すべてのタイプが持っています。

この中では最も実装が楽なメソッドだと思います。

public override int GetHashCode()
{
    // 初期値を準備
    var hash = 0;
    // フィールドとの排他的論理和XORを求める
    hash = hash ^ field1.GetHashCode ();
    hash = hash ^ field2.GetHashCode ();
    // 求めたハッシュコードを返す
    return hash;
}

一行で書くと、こんな感じになる。

public override int GetHashCode() => field1.GetHashCode() ^ field2.GetHashCode();

どちらのソースも、対象のフィールドの排他的論理和XORでハッシュコードを算出しています。

Equals

インスタンス同士の「等価判定」を行うメソッドです。
Objectクラスに定義されているため、すべてのタイプが持っています。
また、IEqutableインタフェースを実装することでも得られます。

isスイッチを使うため、次のソースはC# 7.0以上で実行できます

ObjectクラスのEqualsをオーバーライド

public override bool Equals(Object tar)
{
    // nullのときはfalse
    if (tar == null)
    {
        return false;
    }
    // 自分自身のときはtrue
    if (tar == this)
    {
        return true;
    }
    // 型が違えばfalse
    if (tar is Main obj)
    {
        // ここのソースはIEquatableと同一
        return Equals(obj);
    }
    else
    {
        return false;
    }
}

IEquatableインタフェースを実装してEqualsをオーバーライド

public bool Equals(T tar)
{
    // それぞれのフィールドを比較
    // 1つでも相違があればfalseを返す
    if (! field1.Equals(tar.field1))
    {
        return false;
    }
    if (! field2.Equals(tar.field2))
    {
        return false;
    }
    // すべてのフィールドが等価であれば、インスタンスは等価
    return true;
}

ToString

インスタンスの文字列情報を返すメソッドです。
すなわち、インスタンスの情報を人間が読める文字列として返します。

どの情報を文字列として返すかによるため、実装方法は色々です。
そのため、このソースは一例です。

public override string ToString()
{
    // タイプ名@ハッシュコード
    return $"{GetType().FullName}@{GetHashCode().ToString()}";
}
public override string ToString()
{
    // タイプ名[フィールド名1: フィールド値, フィールド名2: フィールド値2]
    return $"{GetType().FullName}[field1:{field1}, field2:{field2}]";
}
public override string ToString()
{
    // フィールド名とフィールド値だけ
    return $"[field1:{field1}, field2:{field2}]";
}

CompareTo

インスタンスの自然順序付けを行うメソッドです。
Objectクラスに定義されていないため、必要に応じてIComparableインタフェースを実装してください。

CompareToメソッドは、整数を返します。
返された値によって、自然順序付けの順序の前後関係が決まります。

負の整数自分より前の位置
自分と同じ位置
正の整数自分より後の位置
public int CompareTo(T tar)
{
    // 自分より前の位置
    if (field1 > tar.field1)
    {
        return -1;
    }
    // 自分より後の位置
    if (field1 < tar.field2)
    {
        return 1;
    }
    自分と同じ位置
    return 0;
}

コメント

タイトルとURLをコピーしました