C#-インラインメソッドFunc< T>の定義方法パラメータとして?

StackOverflow https://stackoverflow.com/questions/156779

質問

これらの厄介な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&lt; T&gt;を渡して、実際にこれをどのように使用しますか?インラインメソッドパラメータとして

役に立ちましたか?

解決

これはfuncなので、ラムダが最も簡単な方法です:

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

[new Foo(&quot; blah&quot;)]は、デフォルトとして呼び出される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の場合にのみ使用されます。

他のヒント

デフォルト値を直接渡さないのはなぜですか?ファンクターの用途は何ですか?

ところで、 defaultValue.Invoke()は非常に冗長です。 defaultValue()と記述することもできます。

var log = SessionItem.GetItem("logger", () => NullLog.Instance)

通常よりもGetItem {T}呼び出しで{T}指定をスキップできます(Func {T}が同じタイプのオブジェクトを返す場合)

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top