5

私は次のコードスニペットに私の質問を要約しました

struct Point
{
    public int X;
    public int Y;

    public Point(int x, int y)
    {
        this.X = x;
        this.Y = y;
    }

    public override int GetHashCode()
    {
        return base.GetHashCode();
    }

    public void PrintValue()
    {
        Console.WriteLine(
            "{0},{1}",
            this.X, this.Y);
    }
}

上記の構造体は、GetHashCodeメソッドを含むValueTypeから派生しています。GetHashCode以下は、Objectから派生し、メソッドを含むクラスバージョンです。

class Point
{
    public int X;
    public int Y;

    public Point(int x, int y)
    {
        this.X = x;
        this.Y = y;
    }

    public override int GetHashCode()
    {
        return base.GetHashCode();
    }

    public void PrintValue()
    {
        Console.WriteLine(
            "{0},{1}",
            this.X, this.Y);
    }
}

前からちょっと知りたかったんだけど。これらの実装に違いはありますか?

4

1 に答える 1

6

はい; 値型(structs)は、デフォルトで、フィールドの値の複合としてハッシュコードを作成します。これを観察するには、次のことを試してください。

var s = new Point(1,2); // struct
Console.WriteLine(s.GetHashCode());
s.X = 22; // <=============== struct fields should usually be readonly!
Console.WriteLine(s.GetHashCode()); // different

Equals同様の規則に従うことに注意してください。

対照的に、参照型(class)は、デフォルトで、との両方に参照自体を使用ます。影響はありませGetHashCode()Equals()s.X = 22class

var s = new Point(1,2); // class
Console.WriteLine(s.GetHashCode());
s.X = 22;
Console.WriteLine(s.GetHashCode()); // same
于 2012-08-29T09:59:18.367 に答える