2012-08-06 6 views
8

Ich versuche, zum ersten Mal lazy loading zu verwenden, um ein Fortschrittsobjekt in meiner Klasse zu initialisieren. Aber ich bin immer folgende Fehlermeldung:Lazy <T> Lazy loading error: Ein Feldinitialisierer kann nicht auf das nicht statische Feld, die Methode oder die Eigenschaft verweisen

A field initializer cannot reference the non-static field, method, or property.

private Lazy<Progress> m_progress = new Lazy<Progress>(() => 
{ 
    long totalBytes = m_transferManager.TotalSize(); 
    return new Progress(totalBytes); 
}); 

In .NET 2.0, kann ich folgende tun, aber ich würde mehr auf dem neuesten Stand Ansatz bevorzugen:

private Progress m_progress; 
private Progress Progress 
{ 
    get 
    { 
     if (m_progress == null) 
     { 
      long totalBytes = m_transferManager.TotalSize(); 
      m_progress = new Progress(totalBytes); 
     } 
     return m_progress; 
    } 
} 

Kann jemand helfen?

Vielen Dank.

Antwort

20

Dieser Initialisierer würde this benötigen, um in eine Capture-Klasse übergeben zu werden, und this ist nicht von einem Feldinitialisierer verfügbar. Es ist jedoch ist in einem Konstruktor zur Verfügung:

private readonly Lazy<Progress> m_progress; 
public MyType() 
{ 
    m_progress = new Lazy<Progress>(() => 
    { 
     long totalBytes = m_transferManager.TotalSize(); 
     return new Progress(totalBytes); 
    }); 
} 

Persönlich würde ich nur die get Accessor verwenden, obwohl; p

+0

Vielen Dank :) – bobbo

+0

Der faule initializer null zurückkehren können, und noch initialisiert werden. Der Property Getter würde in diesem Fall versuchen, immer wieder zu initialisieren. – wensveen

+0

@wensveen nein wird es nicht: https://gist.github.com/mgravell/b547455bb4afe25cdae44d8cc78b8bdd –

Verwandte Themen