ValueType.GetHashCode メソッド

定義

このインスタンスのハッシュ コードを返します。

public:
 override int GetHashCode();
public override int GetHashCode ();
override this.GetHashCode : unit -> int
Public Overrides Function GetHashCode () As Integer

戻り値

このインスタンスのハッシュ コードである 32 ビット符号付き整数。

次の例では、GetHashCode メソッドを派生値型でオーバーライドする方法を示します。

public ref struct Complex
{
public:
   double m_Re;
   double m_Im;
   virtual bool Equals( Object^ ob ) override
   {
      if ( dynamic_cast<Complex^>(ob) )
      {
         Complex^ c = dynamic_cast<Complex^>(ob);
         return m_Re == c->m_Re && m_Im == c->m_Im;
      }
      else
      {
         return false;
      }
   }

   virtual int GetHashCode() override
   {
      return m_Re.GetHashCode() ^ m_Im.GetHashCode();
   }
};
public struct Complex
{
    public double m_Re;
    public double m_Im;

    public override bool Equals( object ob ){
        if( ob is Complex ) {
            Complex c = (Complex) ob;
            return m_Re==c.m_Re && m_Im==c.m_Im;
        }
        else {
            return false;
        }
    }

    public override int GetHashCode(){
        return m_Re.GetHashCode() ^ m_Im.GetHashCode();
    }
}
type Complex() =
    member val m_Re = 0. with get, set
    member val m_Im = 0. with get, set

    override this.Equals(ob) =
        match ob with
        | :? Complex as c ->
            this.m_Re = c.m_Re && this.m_Im = c.m_Im
        | _ -> false
        
    override this.GetHashCode() =
        this.m_Re.GetHashCode() ^^^ this.m_Im.GetHashCode()
Public Structure Complex
   Private m_Re As Double
   Private m_Im As Double
       
   Public Overloads Function Equals(ob As Object) As Boolean
      If TypeOf ob Is Complex Then
         Dim c As Complex = CType(ob, Complex)
         Return m_Re = c.m_Re And m_Im = c.m_Im
      Else
         Return False
      End If
   End Function
   
   
   Public Overloads Function GetHashCode() As Integer
      Return m_Re.GetHashCode() ^ m_Im.GetHashCode()
   End Function

End Structure

注釈

GetHashCode メソッドは、ValueTypeから派生した型に適用されます。 戻り値の計算には、派生型の 1 つ以上のフィールドが使用されます。 派生型の GetHashCode メソッドを呼び出した場合、戻り値はハッシュ テーブルのキーとして使用するのに適していない可能性があります。 さらに、これらのフィールドの 1 つ以上の値が変更されると、戻り値がハッシュ テーブルのキーとして使用できない可能性があります。 どちらの場合も、型のハッシュ コードの概念をより厳密に表す GetHashCode メソッドの独自の実装を記述することを検討してください。

詳細については、「Object.GetHashCode」および「System.Collections.Hashtable」を参照してください。

.NET 9 以降では、InlineArrayAttribute が型に適用されている場合、ValueType.GetHashCode の既定の実装では NotSupportedException がスローされます。

Windows ランタイムに関する注意事項

Windows ランタイム構造体で GetHashCode メソッドを呼び出すと、GetHashCodeをオーバーライドしない値型の既定の動作が提供されます。 これは、.NET が Windows ランタイムに対して提供するサポートの一部です (Windows ストア アプリと Windows ランタイムの .NET サポート 参照)。 Windows ランタイム構造体は、メソッドを持つことができないため、C# または Visual Basic で記述されている場合でも、GetHashCodeをオーバーライドできません。 (さらに、Windows ランタイム自体の構造体は ValueTypeを継承しません)。ただし、C# または Visual Basic コードでメソッドを使用すると、ToStringEquals、および GetHashCode メソッドが含まれるように見えます。.NET では、これらのメソッドの既定の動作が提供されます。

適用対象