2008-10-01 10 views
9

Tüm bu sinir bozucu boş denetimleri işlemek ve varsa bir varsayılan değer eklemek için basit bir SessionItem yönetim sınıfı yazdım.C# - Bir satır içi yöntemi Func <T> parametresini nasıl tanımlarım?

Şimdi
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]; 
} 

, nasıl ben aslında bir satır içi yöntemi parametre olarak Func <T> geçen bu kullanıyorsunuz: İşte benim GetItem yöntemidir?

cevap

16

, bir lambda basit şekilde olacaktır.

Ayrıca etmek basitleştirmek olabilir:

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

nerede ?? null-coletcing operatörü - ilk arg boş değilse, döndürülür; aksi halde sağ el değerlendirilir ve döndürülür (yani öğe boş olmadığı sürece defaultValue() çağrılmaz).() Yeni sadece öğe ise kullanılır - Bu hala tembel

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

: varsayılan kurucusunu kullanmak istiyorsanız

Son olarak, o zaman "yeni()" kısıtlama eklemek olabilir null oldu.

+2

The ?? Sürüm, oturumdaki değeri ayarlamaz. –

2

Neden varsayılan değeri doğrudan aktarmıyorsunuz? Functor ne işe yarar? Bu arada, defaultValue.Invoke(), oldukça ayrıntılıdır. Ayrıca defaultValue() yazmak da mümkündür.

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

[yeni Foo ("fan")], bir varsayılan olarak çağrılan işlev: yani bir işlev olduğu

+0

(işlev {T} aynı türdeki nesnesi döndüren varsa) o varsayılan değer istediği tahmin sadece gerektiğinde değerlendirilmek üzere, örneğin Varsayılan değerin hesaplanması pahalıysa. – OregonGhost

+1

Varsayılan değeri doğrudan iletirsem, varsayılan olarak yeni bir nesne örneğiyse, her ne zaman kullanılıp kullanılmayacağına bakılmaksızın GetItem'i çağırdığım her zaman varsayılan nesneyi oluşturacağım. Bir Func içine koymak, sadece gerekli olduğunda, örneklemeyi yok eder. – tags2k

+1

Örnekleme ile uğraşıyorsanız ve varsayılan kurucu kullanıyorsanız - o zaman ": new()" genel kısıtlaması yararlı olabilir (Postamı içerecek şekilde düzenledim). Varsayılan olmayan bir kurucu kullanılıyorsa Func yaklaşımı yararlıdır. –

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

Not normalde daha yapabilirsiniz atlamak {T} GetItem {T} çağrısında şartname