1

シングルトンパターンに基づいて次のクラスを作成しました。

public sealed class UTrans
{
    private static volatile UTrans _instance;
    private static readonly object syncRoot = new Object();
    private UTrans(){}

    private static UTrans Instance
    {
        get
        {
            if (_instance == null)
            {
                lock (syncRoot)
                {
                    if (_instance == null)
                        _instance = new UTrans();
                }
            }
            return _instance;
        }
    }
}

このクラス内で、enumプロパティとstringプロパティを作成しました

    private static MethodType _method; // Alphabectic 1 - 50
    public static MethodType Method
    {
        get {  return _method; }
        set { _method = value; }
    }
    private static string _uName;
    public static string UserName
    {
        get { return _uName; }
        set { _uName = value; }
    }

このクラスでいくつかの引数を取るメソッドもいくつかあります。コードでクラスインスタンスを呼び出すときに、ユーザーがプロパティに値を割り当てた場合。それらの値が使用されます。それ以外の場合は、引数として渡された値が使用されます。

これは、UserNameプロパティの場合、プロパティのnull値をチェックすることで正常に機能します。

var un = UserName ?? user;

ただし、列挙型プロパティが割り当てられていない場合、プロパティは列挙型の最初の値を自動的に想定しているように見えるため、列挙型プロパティに対して同じチェックを実行できません。

列挙型の最初の値を「未指定」として割り当てることで、この問題を回避しようとしました。それから私はそのようにコーディングに進むかもしれません:

var processMethod = TranslateMethodType(Method) == "Unspecified" ? method : Method;

ここで、TranslateMethodTypeは、選択した列挙型を同等の文字列値に変換するプライベートメソッドです。

しかし、これがこの問題に対する最も洗練されたアプローチであるとは思わないので、この問題の可能な代替案についてフィードバックをお願いします。

この値は値がないことを示す方法としてのみ存在するため、最初の値として「未指定」の値を追加することなく、クラスのユーザーがMethodTypeプロパティに値が設定されていないことを確認する方法はありますか?セットする?

明らかに、ユーザーが値を使用することを決定した場合、これは当てはまらない可能性があり、この方法でコードを作成すると望ましくない結果が生じる可能性があります。

列挙メソッドをnull許容としてマークできますか?

4

3 に答える 3

2

列挙型メソッドを null 許容としてマークできますか?

はい。

public Nullable<MyEnum> Bob(){
    //stuff
}

var bob = Bob() ?? MyEnum.Default;
于 2012-08-26T23:17:10.177 に答える
1

はい、Methodフィールド/プロパティを null 可能にすることができます。

private static MethodType? _method; // Alphabectic 1 - 50
public static MethodType? Method
{ 
    get {  return _method; } 
    set { _method = value; }
} 

それからあなたはすることができます

var processMethod = Method == null ? method : Method.Value;

また

var processMethod = Method.HasValue ? Method.Value: method;
于 2012-08-26T23:21:08.410 に答える
0

null 可能としてマークすることはできますが、発生しているのは予想される動作です。

参照型のメンバーである値型は 0 に初期化されます。これが、列挙型に常に 0 の値を指定する必要がある理由です。そうしないと、クラスのユーザーは、クラスが無効な状態であることを知ることはありません。

于 2012-08-26T23:19:26.463 に答える