C#-インラインメソッドFunc< T>の定義方法パラメータとして?
-
03-07-2019 - |
質問
これらの厄介な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}が同じタイプのオブジェクトを返す場合)
所属していません StackOverflow