7

私はEnums、一般的なことと、それらが具体的にどのように機能するかについて、いくつかのことを理解しようとしていCharsます。以下は私が働いている私の例です:

public enum AuditInteractionTypes
{
    Authorized = 'A',
    Created = 'C',
    Revised = 'R',
    Extracted = 'E',
    Deleted = 'D'
}

まず、それらを宣言することとenum AuditInteractionTypesenum AuditInteractionTypes : char

Enums第二に、私はそれを使用しようとすることとchars、それを前後に機能させる方法についての多数の投稿を見てきました。ばかげた質問の可能性がありますが、なぜ私は単純にを行ったり来たりすることができなかったのですかstring

したがって、たとえば、Authorized = "A"

私は、Linq To SQLをDALとして使用していますが、それが重要な場合は、私の環境に固有ではない、より広いレベルの質問をしたいと思います。

4

3 に答える 3

13

これは、列挙型の格納に使用される基になるタイプを示します。

enum他に何も使用せずに使用する場合int、基になるストレージタイプとしてを使用します。

を使用するenum : <type>と、そのタイプが基になるストレージタイプとして使用されます。

あなたの場合、基になる型を型にしようとしていますが、C#リファレンスcharによると、それは無効です:

列挙型に承認されているタイプは、byte、sbyte、short、ushort、int、uint、long、またはulongです。

値を保存charする場合は、2つのオプションがあります。

次のように、基になる型ushort(のような符号なし16ビット整数char)を使用できます。

public enum AuditInteractionTypes : ushort
{
    Authorized = 'A',
    Created = 'C',
    Revised = 'R',
    Extracted = 'E',
    Deleted = 'D'
}

char上記が機能するように暗黙の変換がありushortます。また、2つを簡単に比較できます。

値として文字列を使用する場合は、次のenumような-likeクラスをお勧めします。

public static class AuditInteractionTypes
{
    // You can make these static readonly if they are likely to change.
    public const string Authorized = "A";
    public const string Created = "C";
    public const string Revised = "R";
    public const string Extracted = "E";
    public const string Deleted = "D";
}

このクラスは、とほぼ同じように見え、同じようenumにコーディングされます。

同じトリックはどのタイプでも実行できますが、通常、これらのタイプは完全に不変である必要があります。 stringこのガイドラインを適切に満たし、完全に不変です(ほとんどのシステム値型、および正しく設計されている場合は他の値型も同様です)。

于 2012-12-12T14:34:26.237 に答える
2

列挙型の「基本型」は、整数値型である必要があります。文字列は修飾されません、それは参照型です。

デフォルト(int)を使用しないことは、通常、アンマネージコードと相互運用する場合にのみ必要です。CおよびC++言語では、同じ基本型を使用して列挙型のサイズを指定することもできます。[Flags]列挙値が多数ある場合に長い間役立つコーナーケースがあり、最大64個のフラグ値を区別できます。

本当にストレージ要件を絞り込もうとしている場合は、バイトまたはショートを選択できます。これにより、CPUキャッシュをより適切に使用できるため、コードを高速化できます。クラスまたは構造体の他のフィールドの配置要件のため、一般的にはあまりうまくいきません。また、値のテストやフラグの分離など、このような列挙値を操作すると、キャッシュの利点が失われる可能性があります。32ビットプロセッサはintが本当に好きで、変換の料金を支払うことになります。プロファイリングが必要です。

于 2012-12-12T14:47:07.857 に答える
0

これに答える:

ばかげた質問の可能性がありますが、なぜ私は単に文字列として行ったり来たりすることができなかったのですか。

次のような実装を使用できます。

using System.ComponentModel;

public enum AuditInteractionTypes
{
    [Description("A")] Authorized,
    [Description("C")] Created,
    [Description("R")] Revised,
    [Description("E")] Extracted,
    [Description("D")] Deleted
}

したがって、基本的にすべての要素は何らかの文字列値を受け取ります。

または、structを使用できます。

struct AuditInteractionTypes
{
    static string Authorized = "A";
    static string Created = "C";
    static int Revised = 0;
    static char[] Extracted = "E".ToCharArray(); //Not sure if this one is usefull
}
于 2017-08-07T22:54:46.063 に答える