2013-02-06 80 views
12

我有我的課慵懶屬性:C#懶財產

public void SendEmail(MailMessage message) 
    { 
     SmtpClient.Value.ServerName = "testServer"; 
     SmtpClient.Value.Port = 25; 

     SmtpClient.Value.Send(message); 
    } 

但在我的SmtpClient,在發送(字符串消息)梅索德是:

private Lazy<ISmtpClient> SmtpClient 
    { 
     get 
     { 
      return new Lazy<ISmtpClient>(() => _objectCreator.Create<ISmtpClient>(), true); 
     } 
    } 

而且使用此proptery一個梅索德我在上面的SendEmail(MailMessage消息)方法中初始化的所有propifier都爲null。

我該如何解決這個問題?

在此先感謝。

回答

22

您正在使用的是Lazy<T>錯誤。

使用Lazy<T>時,顯示的是實際類型的屬性,並且有一個Lazy<T>實例。你不創建一個新的每次訪問該屬性時:

Lazy<ISmtpClient> _smtpClient = 
    new Lazy<ISmtpClient>(() => _objectCreator.Create<MySmtpClient>(), true); 

private ISmtpClient SmtpClient 
{ 
    get 
    { 
     return _smtpClient.Value; 
    } 
} 

現在,第一次SmtpClient屬性進行訪問,對象創建者創建的MySmtpClient一個新的實例。這是返回。在後續調用中,返回相同的實例。

的用法是這樣的:

public void SendEmail(MailMessage message) 
{ 
    SmtpClient.ServerName = "testServer"; 
    SmtpClient.Port = 25; 

    SmtpClient.Send(message); 
} 
+0

謝謝,但我沒有張貼懶財產的錯誤代碼,實際的代碼是這樣的: 私人懶 SmtpClient { 得到 { 返回新懶惰(()=> _objectCreator.Create ( ),true); } } 它是不是很好? – Djave

+0

@Djave:請用您的實際代碼更新您的問題。 –

+0

我更新了代碼。謝謝 – Djave

1

丹尼爾的答案是正確的。只是想補充說明爲什麼你的代碼不起作用。

每次訪問SmtpClient時,都會在您的原始代碼中創建一個新的Lazy<ISmtpClient>對象,然後立即使用SmtpClient.Value對其進行初始化。這會在每行上爲您提供新的ISmtpClient對象。

您需要構造Lazy<T>對象一次,然後在Property的getter中返回該對象,如在Daniels代碼中。該屬性的類型應該是您想要使用的類型(即,您不會向消費者公開Lazy<T>類型)。