【发布时间】:2015-09-23 20:59:12
【问题描述】:
这总是让我发疯,我仍然无法理解它。在下面的代码中,if 语句被编辑器标记为“表达式始终为真”
public Task ConfigSendMailAsync(IdentityMessage message)
{
const string usertoken = "Sent";
var mailMessage = new MailMessage();
mailMessage.To.Add(new MailAddress(message.Destination));
mailMessage.From = new MailAddress("service@tradertoolkit.com");
mailMessage.Subject = message.Subject;
mailMessage.Body = message.Body;
var credentials = new NetworkCredential(
ConfigurationManager.AppSettings["mailAccount"],
ConfigurationManager.AppSettings["mailPassword"]
);
var mailClient = new SmtpClient {Credentials = credentials};
***if (mailClient != null)***
{
mailClient.SendAsync(mailMessage, usertoken);
return Task.FromResult(0);
}
else
{
//log error
return Task.FromResult(-1);
}
}
它怎么总是正确的,如果传递的消息无效怎么办,如果创建凭据失败怎么办,等等。当然可以使 if 语句为真。我知道如果之前有任何失败,我会得到一个例外。如果我想确保凭证有效,我肯定会对此进行测试。
if (credentials != null)
{
}
但你猜怎么着,显然这也总是正确的。怎么可能,如果这些应用程序设置中没有存储任何内容怎么办?有人能解释一下这实际上是如何工作的以及如何最好地构造这段代码
【问题讨论】:
-
你直接在上面赋值,因为构造函数不能返回null,它总是not为null。为什么要在那里检查 null ?正如编译器所说,它不可能为空,因此不需要检查。
-
您正在分配一个值。如果该分配失败,那么会有一些例外。假设该值不为空是公平的。
-
var mailClient = new SmtpClient {Credentials = credentials};。不为mailClient分配值的唯一方法是,如果有一个异常会破坏所有内容(在这种情况下,您将永远无法到达if语句)。在您到达if语句的所有情况下,mailClient将包含您在上面的赋值语句中实例化的SmtpClient实例。
标签: c# async-await