2008-10-01 11 views
9

모든 성가신 null 검사를 처리하고 존재하지 않는 경우 기본값을 삽입하는 간단한 SessionItem 관리 클래스를 작성했습니다.인라인 메서드 Func <T>을 매개 변수로 정의하려면 어떻게해야합니까?

이제
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> 전달이 사용합니까 : 여기 내를 GetItem 방법이다?

답변

16

는 람다 가장 간단한 방법이 될 것입니다.

당신은 또한 단순화 수 :

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

어디? null 병합 연산자입니다. - 최초의 arg가 null가 아닌 경우는 돌려 주어집니다. 그렇지 않으면 오른손이 계산되고 반환됩니다 (따라서 item이 null이 아닌 경우 defaultValue()가 호출되지 않습니다).() 새로운 항목 만 경우에 사용됩니다 -이 여전히 게으른

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

: 당신은 그냥 기본 생성자를 사용하려는 경우

마지막으로, 당신은 "새로운()"제약 조건을 추가 할 수 있습니다 null이었다.

+2

?? 버전은 세션의 값을 설정하지 않습니다. –

2

왜 기본값을 직접 전달하지 않습니까? 펑터는 어떤 용도로 사용됩니까?

한편, defaultValue.Invoke()은 매우 장황합니다. defaultValue()으로 쓸 수도 있습니다.

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

[새로운 푸 ("어쩌구은")] 기본으로 호출되는 FUNC이다 : 그것은 FUNC이기 때문에

+0

(Func을 {T}는 같은 유형의 객체를 반환하는 경우) 나는 그가 기본값을 원하는 것 같아요 필요한 경우에만 평가된다. 기본값을 계산하는 데 비용이 많이 드는 경우 – OregonGhost

+1

기본값을 직접 전달하면 기본값이 새 개체 인스턴스 인 경우 GetItem을 호출 할 때마다 해당 개체를 사용할지 여부에 관계없이 기본 개체를 만들게됩니다. Func을 사용하면 필요할 때만 인스턴스 생성을 지연 할 수 있습니다. – tags2k

+1

인스턴스 생성을 처리하고 기본 생성자를 사용하는 경우 ": new()"제네릭 제약 조건이 유용 할 수 있습니다 (포함 할 게시물을 편집했습니다). Func 접근법은 기본이 아닌 생성자를 사용하는 경우 유용합니다. –

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

주, 일반적으로보다 할 수 있습니다 건너 {T} 준 getItem {T} 호출 사양