9

これらの厄介な null チェックをすべて処理し、存在しない場合はデフォルト値を挿入する単純な SessionItem 管理クラスを作成しました。ここに私の GetItem メソッドがあります:

public static T GetItem<T>(string key, Func<T> defaultValue)
{
    if (HttpContext.Current.Session[key] == null)
    {
        HttpContext.Current.Session[key] = defaultValue.Invoke();
    }
    return (T)HttpContext.Current.Session[key];
}

では、Func<T> をインライン メソッド パラメーターとして渡して、これを実際にどのように使用すればよいでしょうか。

4

3 に答える 3

16

これは関数なので、ラムダが最も簡単な方法です。

Foo foo = GetItem<Foo>("abc", () => new Foo("blah"));

[new Foo("blah")] は、デフォルトで呼び出される func です。

次のように簡略化することもできます。

return ((T)HttpContext.Current.Session[key]) ?? defaultValue();

どこ ??null 合体演算子です。最初の引数が null でない場合は、それが返されます。それ以外の場合は、右手が評価されて返されます (そのため、アイテムが null でない限り、defaultValue() は呼び出されません)。

最後に、デフォルトのコンストラクターを使用するだけの場合は、「new()」制約を追加できます。

public static T GetItem<T>(string key)
    where T : new()
{
    return ((T)HttpContext.Current.Session[key]) ?? new T();
}

これはまだ怠惰です - new() は項目が null の場合にのみ使用されます。

于 2008-10-01T09:08:07.717 に答える
2

デフォルト値を直接渡さないのはなぜですか? ファンクタはどのような用途に使用されますか?

ちなみに、defaultValue.Invoke()かなり冗長です。と書くだけでも可能defaultValue()です。

于 2008-10-01T09:03:43.297 に答える
1
var log = SessionItem.GetItem("logger", () => NullLog.Instance)

通常よりも、GetItem{T} 呼び出しで {T} の指定をスキップできることに注意してください (Func{T} が同じタイプのオブジェクトを返す場合)。

于 2008-10-01T09:08:27.093 に答える