C#懒惰的财产

Dja*_*ave 12 c#-4.0

我班上有一个懒惰的房产:

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

也是一种使用这种方法的方法:

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

        SmtpClient.Value.Send(message);
    }
Run Code Online (Sandbox Code Playgroud)

但是在我的SmtpClient中,在Send(字符串消息)中,methode是我在上面的SendEmail(MailMessage消息)方法中初始化的所有预测,null.

我怎样才能解决这个问题?

提前致谢.

Dan*_*rth 22

你使用Lazy<T>错了.

在使用时,Lazy<T>您公开了实际类型的属性,并且您有一个Lazy<T>实例.每次访问该属性时都不会创建新的:

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

private ISmtpClient SmtpClient
{
    get
    {
        return _smtpClient.Value;
    }
}
Run Code Online (Sandbox Code Playgroud)

现在,第一次SmtpClient访问该属性时,对象创建者会创建一个新实例MySmtpClient.这是返回的.在后续调用中,返回相同的实例.

用法如下:

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

    SmtpClient.Send(message);
}
Run Code Online (Sandbox Code Playgroud)