web-dev-qa-db-ja.com

列挙型を宣言するとき、256エンティティ未満のタイプを強制的にバイトにする必要がありますか?

アプリケーションに列挙型があり、アイテムが数個しかない場合、基になる型を可能な限り最小の型に強制する必要がありますか?

    enum smaller : byte
    {
        one,
        two,
        three
    };
37
ghost

いいえ。時期尚早に最適化しないでくださいそれ以外の場合プロファイラーを使用して、それが実際に問題であることを証明した。

43
JaredPar

ベストプラクティスに関して:

Enumを型バイトにする特別な理由がない場合は、デフォルトのままにします。

Switchステートメントでenumを使用する場合は常に、無効なenum値の「デフォルト」句が必要です。したがって、256-NumRealEnumValuesまたは2 ^ 32-NumRealEnumValuesをチェックするかどうかは問題ではありません。どちらにも、すべての無効なケースを処理するデフォルトの句があります。

Enumのタイプを明示的に設定する1つの理由は、enumをプログラムの別のタイプに対応させ、それらの間で明示的にキャストする必要がある場合です。

タイプを最小のフィットに変更しても、バージョン管理の問題には役立ちません。列挙の最大サイズが正確に入力されている場合を除きます。バージョン管理の問題とは、列挙型を使用してコンパイルされたdllがある場合に、新しい列挙型の値を追加すると、switchステートメントの「デフォルト」句に含まれていないコードが実行される可能性があることを意味します。

効率に関して:

それをバイトにする効率の面で利点はありません。

x86のCPUには32ビットのレジスタがあるため、intの方がより効率的です。レジスタへのコピーは一度に32ビットで行われます。

小さいタイプを使用する場合、レジスタの一部をゼロにして、レジスタの下位ビットの残りにコピーする必要があります。

30
Brian R. Bondy

これを行う唯一の理由は、フィールドがそのサイズであることを要求する定義済みのプロトコルを使用してこの値を格納または送信する場合です。

8
Juliano

Enumを含むモデルを別のモデルにマッピングする場合、またはモデルをシリアル化する場合、またはenumがデータベース列に反映される場合は、タイプを明示的に指定することをお勧めします。


シナリオ:データベースに列があります:status_idタイプtinyint。そして、あなたのコードに列挙型があります:enum Status { Well = 1, Bad = 2 }。そして、この列挙型をあるエンティティで使用します。エンティティフレームワークコア2.0を使用するとします。データベースからこのエンティティを読み書きしようとすると、byteタイプを明示的に指定しない限り、「オブジェクトをキャストできません」というエラーが発生します。

2
Sergey Koval

何が得られるでしょうか?わずかに実行速度が遅くなり、直感的または読みにくいコードが犠牲になりますが、なんと3バイトのメモリを節約できます。 (これを読んで、私はpyouが実際にそれをバイトにする理由があったかどうか、そしてその理由は何であったのか疑問に思わなければなりません。おそらく理由のためにデフォルト以外のタイプを使用するためにあなたの道を外れました)。

あなたがこれらの何百万ものものを保存することを計画しているなら、はい、それぞれに数バイトを節約することは報われるかもしれません。そうでなければ、いいえ。

これは、intの代わりに通常byteまたはshortを使用しないのと同じ理由です。

2
jalf

列挙型に特定の整数型を割り当てないでください。ただし、.NET環境に列挙型の最適な「サイズ」を割り出させます。 JaredParが言ったように、ifデータ型を変更した場合、間違いなくあるべきです実際に役立つかどうかを確認します。

問題は、32ビット整数は最適な方法で簡単に調整できるため、x86プロセッサーでは「自然」であることです。

0