C#
 Computer >> コンピューター >  >> プログラミング >> C#

C#のType.GetHashCode()メソッドの使い方とサンプルコード解説

C#のType.GetHashCode()メソッドは、現在のTypeインスタンスに対応するハッシュコードを返します。ハッシュコードは、DictionaryHashSetといったハッシュベースのコレクションでオブジェクトを効率的に管理・検索するために利用される整数値です。

構文

Type.GetHashCode()メソッドの構文は以下の通りです。

public override int GetHashCode ();

引数は不要で、戻り値として現在のインスタンスのハッシュコードを表すint型の値が返されます。

サンプル1:配列の型からハッシュコードを取得する

まず、文字列配列のTypeオブジェクトに対してGetHashCode()メソッドを使用する基本的な例を見てみましょう。

using System;
public class Demo {
    public static void Main(){
        string[] arr = {"tom", "amit", "kevin", "katie"};
        Type t1 = arr.GetType();
        Type t2 = t1.GetElementType();
        Console.WriteLine("Type = "+t2.ToString());
        Console.WriteLine("Hash Code = "+t1.GetHashCode());
    }
}

実行結果

上記のコードを実行すると、次のような出力が得られます。

Type = System.String
Hash Code = 9144789

この例では、GetType()で配列の型情報を取得し、GetElementType()によって配列の要素型(System.String)を表示しています。その後、Typeオブジェクトt1のハッシュコードを出力しています。

サンプル2:列挙型でGetHashCode()を使用する

次に、列挙型(enum)のTypeオブジェクトに対してGetHashCode()メソッドを使用する例を紹介します。あわせて、GetEnumNames()GetEnumUnderlyingType()GetEnumValues()といった関連メソッドも活用しています。

using System;
public class Demo {
    enum Vehicle {Car, Bus, Bike, Airplane}
    public static void Main(){
        try {
            Vehicle v = Vehicle.Bike;
            Type type = v.GetType();
            Console.WriteLine("Hash code = "+type.GetHashCode());
            string[] str = type.GetEnumNames();
            Console.WriteLine("GetEnumName() to return the constant name = " + str);
            Type type2 = type.GetEnumUnderlyingType();
            Console.Write("Enum Underlying type = "+type2);
            Array arrObj = type.GetEnumValues();
            Console.Write("Values = "+arrObj);
            Console.WriteLine("\nListing constants ..");
            for (int i = 0; i < str.Length; i++)
                Console.Write("{0} ", str[i]);
        }
        catch (ArgumentException e){
            Console.WriteLine("Not an enum!");
            Console.Write("{0}", e.GetType(), e.Message);
        }
    }
}

実行結果

上記のコードを実行すると、次のような出力が得られます。

Hash code = 44757566
GetEnumName() to return the constant name = System.String[]
Enum Underlying type = System.Int32Values = Demo+Vehicle[]
Listing constants ..
Car Bus Bike Airplane

この例では、列挙型Vehicleの値BikeからTypeオブジェクトを取得し、そのハッシュコードを表示しています。さらに、列挙型の定数名の一覧や基になる型(System.Int32)も確認できます。対象が列挙型でない場合は、try-catchブロックによりArgumentExceptionが捕捉され、エラーメッセージが表示されます。

補足:ハッシュコードを扱う際の注意点

  • ハッシュコードの具体的な値は実行ごとに変わる可能性があり、同一アプリケーションドメイン内での一貫性のみが保証されています。
  • 異なるオブジェクトが同じハッシュコードを持つことがあるため、ハッシュコードの一致だけでオブジェクトの等価性を判断してはいけません。
  • ハッシュコードは主にDictionary<TKey, TValue>HashSet<T>などの内部処理で使用されることを想定しています。
  1. C#のCharEnumerator.GetHashCode()メソッドの使い方を解説

    C#におけるCharEnumerator.GetHashCode()メソッドは、現在のオブジェクトのハッシュコードを返します。ハッシュコードは、オブジェクトを識別するための整数値であり、ハッシュテーブルなどのデータ構造で効率的な検索を行う際に利用されます。構文public virtual int GetHashCode ();このメソッドは引数を受け取らず、現在のオブジェクトを表すint型のハッシュコードを返します。CharEnumeratorクラスでは、Objectクラスから継承されたこのメソッドが仮想メソッドとして定義されています。それでは、CharEnumerator.GetHashCo

  2. C#のType.GetArrayRank()メソッドの使い方を徹底解説

    C#におけるType.GetArrayRank()メソッドは、配列の次元数(ランク)を取得するためのメソッドです。多次元配列が何次元であるかをプログラム上で確認したい場合に便利な機能です。構文public virtual int GetArrayRank ();このメソッドは、対象の型が配列である場合にその次元数をint型で返します。戻り値の「ランク」とは、配列の角括弧内のカンマの数+1、つまり配列のインデックスの数を表します。使用例1:3次元配列のランクを取得するまずは、3次元のint型配列に対してType.GetArrayRank()メソッドを使用する基本的な例を見てみましょう。using