web-dev-qa-db-ja.com

GetHashCodeを使用してEnumint値を取得する

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

_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()の使用について少し混乱しています。それを使って何か問題はありますか?

25
Mohit Vashistha

GetHashCode()の使用は正しくありません。 intにキャストする必要があります。それをあなたのやり方で使うことは、猛禽類(またはレイモンド)があなたを食べに来るように頼むことです。

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

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

私の経験則では、GetHashCodeが定数値を返す場合でも、定数GetHashCodeは簡単に満たされるため、プログラムは正しく機能するはずです(ただし、潜在的にはるかに遅くなります)。契約ですが、配布特性が悪いです。

48
CodesInChaos

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

4
Pauli Østerø

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

2
Vijay Vepakomma

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

GetHashCodeを使用しないもう1つの理由は、 パフォーマンス。ボクシングの原因になります。 私のクイックテストでは、GetHashCodeは約50倍遅くなりました(重要な場合)。

1
nawfal

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

1
Victor Haydin

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

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

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

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

0
IAbstract

多くの理由でGetHashCode()を使用することの欠点を説明するコメントがいくつかあります。

(int)INFLOW_SEARCH_ON.ON_LABELが機能しない場合があります。

列挙型からint値を取得する良い方法は、GeTTypeCode()メソッドを使用することです。このメソッドは、基になるタイプに関係なく機能します。この場合、それはintです。

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

INFLOW_SEARCH_ON selectedType = INFLOW_SEARCH_ON.ON_LABEL;

object val = Convert.ChangeType(selectedType, selectedType.GetTypeCode());
Console.WriteLine(val);

この場合の出力は「1」です。

参照: 列挙型からint値を取得

0
Sundeep