31

私は列挙型を持っています

public enum INFLOW_SEARCH_ON
{
  ON_ENTITY_HANDLE = 0,         
  ON_LABEL = 1,                 
  ON_NODE_HANDLE = 2            
} // enum INFLOW_SEARCH_ON

グリッド列を検索するには、この列挙型を使用する必要があります。

私が使用している列インデックスを取得するには

  MyEnumVariable.GetHashCode() 

どちらが問題なく動作しますか、または使用する必要があります

  (short)MyEnumVariable

を使用することについて少し混乱してGetHashCode()います。それを使って何か問題はありますか?

4

7 に答える 7

57

使い方GetHashCode()が間違っています。にキャストする必要がありintます。あなたがするようにそれを使用することは、猛禽類(またはレイモンド)が来てあなたを食べるように頼むことです.

たまたまGetHashCode()列挙型の整数値を返すのは実装の詳細であり、.net の将来のバージョンで変更される可能性があります。

GetHashCode()equal2 つの値がハッシュ コードである場合、それらの値も等しいことを保証します。その逆は保証されません。

私の経験則では、定数はコントラクトを自明に満たしますが、分布特性が悪いためGetHashCode、定数値を返す場合でもプログラムは正しく動作するはずです (ただし、はるかに遅くなる可能性があります) 。GetHashCode

于 2011-01-03T13:10:07.357 に答える
6

プロファイリングを行ったとき、Enum.GetHashCode には多くのサイクルがかかりました。可能な場合は (int)Enum を使用することで改善できました。

于 2013-02-05T18:11:52.380 に答える
5

リテラル値を取得するために使用する必要(int)MyEnumVariableがあります...次のように他の方法で変換することもできます(INFLOW_SEARCH_ON)int

于 2011-01-03T13:04:52.647 に答える
4

他の人は、int へのキャストが優れている理由を述べています。

使用しないもう 1 つの理由GetHashCodeは、パフォーマンスです。それはボクシングを引き起こします。私の簡単なテストでGetHashCodeは、約 50 倍遅くなりました (問題がある場合)。

于 2013-06-10T20:14:53.557 に答える
1

を使用する必要があります(int) MyEnumVariable。デフォルトでは、すべての列挙型はから継承されますint

于 2011-01-03T13:04:01.803 に答える
0

Enum 静的クラスによって提供されるオプション メソッドもあります。例えば:

Enum.TryParse<TEnum>(string ValueType, out TEnum Result)

あなたがしようとしているのは、列挙型の値を取得することだけです。「ON_ENTITY_HANDLE」などの文字列 ValueType を で取得できますEnum.GetName(...)

それ以外の場合は、 (int) へのキャストが確実に優先されGetHashCode()ます。

于 2011-01-03T13:13:12.767 に答える