C#어떻게 정의하는 인라인 방법 Func<T> 으로 매개 변수는?
-
03-07-2019 - |
문제
썼는 간단하 SessionItem 관리 등을 처리하는 모든 그 성가신 null 검사 및 삽입하는 기본값이 없는 경우가 존재합니다.여기에 내 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> 으로 인라인 방법을 매개 변수는?
해결책
이후 func,람다는 것이 가장 간단한 방법:
Foo foo = GetItem<Foo>("abc", () => new Foo("blah"));
는[신 Foo("ㅋ")]는 func 호출되는 기본값으로.
당신은 또한 단순화:
return ((T)HttpContext.Current.Session[key]) ?? defaultValue();
Where??은 null 통합 운영자는 경우 첫 번째 arg is non-null 이 반환됩니다;그렇지 않으면 오른쪽 손가(그래서 기본값()호출되지 않으면 않는 항목이 null).
마지막으로,당신은 단지 사용하려면 기본 생성자를,다음을 추가할 수 있습니다"새로운()"제약:
public static T GetItem<T>(string key)
where T : new()
{
return ((T)HttpContext.Current.Session[key]) ?? new T();
}
이것은 여전히 게-새로운()경우에만 사용됩 항목이 null 입니다.
다른 팁
기본값을 직접 전달하지 않는 이유는 무엇입니까? Functor는 어떤 용도로 사용됩니까?
그런데, defaultValue.Invoke()
상당히 장점입니다. 글을 쓰는 것도 가능합니다 defaultValue()
.
var log = SessionItem.GetItem("logger", () => NullLog.Instance)
메모, 일반적으로 getitem {t} 호출에서 {t} 사양을 건너 뛸 수 있습니다 (func {t} 동일한 유형의 개체를 반환합니다)
제휴하지 않습니다 StackOverflow