私は列挙型を持っています
_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()
の使用について少し混乱しています。それを使って何か問題はありますか?
GetHashCode()
の使用は正しくありません。 int
にキャストする必要があります。それをあなたのやり方で使うことは、猛禽類(またはレイモンド)があなたを食べに来るように頼むことです。
GetHashCode()
がたまたま列挙型の整数値を返すことは実装の詳細であり、.netの将来のバージョンで変更される可能性があります。
GetHashCode()
は、2つの値がequal
の場合、それらのハッシュコードも等しいことを保証します。逆の場合は保証されません。
私の経験則では、GetHashCode
が定数値を返す場合でも、定数GetHashCode
は簡単に満たされるため、プログラムは正しく機能するはずです(ただし、潜在的にはるかに遅くなります)。契約ですが、配布特性が悪いです。
リテラル値を取得するには、(int)MyEnumVariable
を使用する必要があります...(INFLOW_SEARCH_ON)int
のように他の方法で変換することもできます。
私がプロファイリングを行ったとき、Enum.GetHashCodeは多くのサイクルを要しました。可能な場合は(int)Enumを使用して改善することができました。
他の人は、intへのキャストが優れている理由を述べています。
GetHashCode
を使用しないもう1つの理由は、 パフォーマンス。ボクシングの原因になります。 私のクイックテストでは、GetHashCode
は約50倍遅くなりました(重要な場合)。
(int) MyEnumVariable
を使用する必要があります。デフォルトでは、すべての列挙型はint
から継承されます。
Enum静的クラスによって提供されるオプションメソッドもあります。例えば:
_Enum.TryParse<TEnum>(string ValueType, out TEnum Result)
_
あなたがしようとしているのが列挙型の値を取得することだけである場合。文字列ValueTypeを取得できます。例: 「ON_ENTITY_HANDLE」とEnum.GetName(...)
。
それ以外の場合は、(int)へのキャストがGetHashCode()
よりも確実に優先されます。
多くの理由で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値を取得