11

私はしばらくの間、Windows Mobile と Android 向けに開発を行ってきました。そして、私はこれら2つの概念について混乱しています。

ユーザーのデバイスの画面サイズに基づいて決定したいとしましょう。したがって、事前定義された値が期待されます。ロジックを処理するために switch ステートメントを使用できます。しかし、この目的で静的クラスの Enum を使用する必要があるかどうかはわかりません。どちらがより良いアプローチです。これら 2 つの異なる方法でロジックを実行できます。正しいアプローチはどれですか?よくわかりません。また、文字列値も使用できますか? 現在、私はクラスに固執しているため、すべての列挙型を使用するように更新する必要があります。では、クラスを文字列列挙型に変更するのはどうですか? ともかく。ありがとう。

列挙型の使用

//My predefined values
public enum ScreenSizeEnum
{
    Small, Medium, Large, XLarge,
}
//Handling Logic
private void SetScreenSize(ScreenSizeEnum Screen)
{
    switch (Screen)
    {
        case ScreenSizeEnum.Large:
            //Do Logic
            break;
        case ScreenSizeEnum.Small:
            //Do Logic
            break;
    }
}

クラスの使用

//My predefined values
public class ScreenSizeClass
{
    public const int Small = 0;
    public const int Medium = 1;
    public const int Large = 2;
    public const int XLarge = 3;
}
//Handling Logic
private void SetScreenSize(int Screen)
{
    switch (Screen)
    {
        case ScreenSizeClass.Large:
            //Do Logic
            break;
        case ScreenSizeClass.Small:
            //Do Logic
            break;
    }
}
4

4 に答える 4

9

これはまさに列挙型の目的です。定数で静的クラスを使用できないわけではありませんが、列挙型ははるかにクリーンです...

于 2012-12-04T04:30:41.327 に答える
9

列挙型から(C#プログラミングガイド)

列挙型 (列挙型または列挙型とも呼ばれます) は、変数に割り当てることができる一連の名前付き整数定数を効率的に定義する方法を提供します。

数値型の代わりに列挙型を使用する利点は次のとおりです。

  1. 変数に対して有効な値をクライアント コードに明確に指定します。

  2. Visual Studio では、IntelliSense によって定義された値が一覧表示されます。

を渡すenumと、強く型付けされるため、メソッドに渡すことができるものを自動的に制御できます。

ScreenSizeEnum size = ScreenSizeEnum.Medium;
SetScreenSize(size); 

constまたはstaticフィールドを使用する場合、渡されintた値が予想されるダイアパソンから取得されているかどうかを必ず確認する必要があります。

int somevalue = ...;//anything
SetScreenSize(somevalue); //compiles

private void SetScreenSize(int Screen)
{
    switch (Screen)
    {
        case ScreenSizeClass.Large:
            //Do Logic
            break;
        case ScreenSizeClass.Small:
            //Do Logic
            break;
        default: 
            // something else, what to do??
            break;
    }
}

コメントに基づく:

intで定義されているかどうかを確認する必要がある場合は、次のenumようにすることができます。

int somevallue = 0;
if(Enum.IsDefined(typeof(ScreenSizeEnum), somevallue))
{
    //it's ok
}

または拡張メソッド:

public static T GetEnumValue<T>(this string value) where T : struct
{
    Type t = typeof(T);
    if (!t.IsEnum)
        throw new Exception("T must be an enum");
    else
    {
        T result;
        if (Enum.TryParse<T>(value, out result))
            return result;
        else
            return default(T);
    }
}

使用できるもの

int somevalue = 1;
ScreenSizeEnum size = somevalue.GetEnumValue<ScreenSizeEnum>();

string(OPの編集された質問に基づく)に関しては:

列挙型から(C# リファレンス) :

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

したがって、文字列の列挙を持つことはできません。ただし、ToStringメソッドは列挙型の値ではなく名前を返すため、列挙型の名前を使用できます。

ScreenSizeEnum.Small.ToString(); //Small

したがって、文字列に対して別の拡張メソッドを使用できます。

public static T GetEnumValue<T>(this string value) where T : struct
{
    Type t = typeof(T);
    if (!t.IsEnum)
        throw new Exception("T must be an enum");
    else
    {
        if (Enum.IsDefined(t, value))
            return (T)Enum.Parse(t, value);
        else
            return default(T);
    }
}

となることによって

int i = (int)ScreenSizeEnum.Small;
string str = ScreenSizeEnum.Small.ToString();
ScreenSizeEnum isize = i.GetEnumValue<ScreenSizeEnum>();//ScreenSizeEnum.Small
ScreenSizeEnum strsize = str.GetEnumValue<ScreenSizeEnum>();//ScreenSizeEnum.Small
于 2012-12-04T04:33:12.153 に答える
1

列挙型は基本的に、変数またはパラメーターに可能な定数の固定セットからの値を持たせたい場合に使用されます。列挙型を一連の static final int 定数を持つクラスに置き換えることができます。しかし、列挙型を使用することは、後者よりも柔軟で読みやすいアプローチです。

于 2012-12-04T04:47:09.847 に答える