2011-07-14 12 views
29

Not belleği uygulamak için Lazy T kullanmak istiyorum, ancak başlatma işlevi statik bir bağlam gerektiriyor gibi görünüyor.Neden Lazy <T> statik ortamlarda kısıtlanmış?

Örneğin, aşağıdaki kod statik olmayan üyeler bir ve b erişilemez uyarısında derlemeye reddeder. Bu neden Lazy nesnesinin bir örnek üye olduğu ve statik bir bağlamda görünürlüğü olmadığı için neden açık değildir.

public class SomeExpensiveCalculation 
{ 
    private int a; 
    private int b; 
    public Lazy<int> Result = new Lazy<int>(() => a + b); //nope! 
} 
+9

Buradaki hata, Lazy'de değil, lambda ifadesinde. 'A' ve 'b' lambda bağlamında henüz mevcut değil. – MattDavey

cevap

32

Nesne başlatıcıları bir yapıcı (ya yöntemiyle) dışında, yalnızca statik üyeleri başvurmak zorundadır. Bunun nedeni, örnek yapıcı çalıştırılıncaya kadar yapılandırılmamış olması, dolayısıyla alanların "henüz hazır değil" olması ve bu nedenle başvuruda bulunmamasıdır. Statik alanlar, alanlardan önce başlatıldıkları için çalışır.

Hata, Lazy<T> neden olmadığına dikkat edin, bunun nedeni lambda ifadesidir. Geçici çözüm (ve bunu yapmanın uygun yolu) bir kurucuda Result'u başlatmaktır.

+5

ChessHound için: Bu, NEDEN kod çalışmıyor. Lazy tipi ile ilgisi yok. –

11

Ben senin kod neden çalışmıyor bilmiyorum ama bu çalışması gerekir:

public class SomeExpensiveCalculation 
    { 
     private int a; 
     private int b; 
     public Lazy<int> Result; 
     public SomeExpensiveCalculation() 
     { 
      Result = new Lazy<int>(() => a + b); 
     } 
    } 
1

@ Ondra'nın yanıtını genişletmek için, bu, enjekte edilmiş bir fabrikada da kullanılabilir. Bir uyarı - tembel ve fabrikanın göreceli ömürleri konusunda dikkatli olun:

İlgili konular