当String.IsNullOrEmpty为false时,C#if语句评估为true

时间:2015-05-06 15:10:12

标签: c# asp.net if-statement behavior

我在帮助程序类中有一个静态方法,通过电子邮件发送给管理员以通知错误。在发送电子邮件之前,我会检查是否在web.config中提供了必要的电子邮件地址。

当第一个String.IsNullOrEmpty运行时,将跳过if后面的语句。但是,第二个if后的语句执行。在

在这两种情况下,我都能够在Visual Studio调试器中检查相应的电子邮件变量,并且我可以验证每个变量中是否包含实际的电子邮件地址。我还调试了没有设置手表,只是为了确保手表没有效果。

此外,我尝试在if后面的每个语句周围放置{},但这并未改变行为。

如果我改变这些if语句的顺序,就会发生同样的事情;跳过第一个投掷,但第二个投掷会执行。

在写这篇文章时,我注意到将控制台上的Console.WriteLine向下移动会导致一切按预期工作。不过,我仍然很好奇,如果我留下下面发布的代码,为什么会发生这种情况。能够在将来避免这个问题会很高兴!

方法:

public static bool NotifyAdmin(string subject, Exception e, string additionalInfo = "")
{
  String message = String.Format("Exception Message: {0}\n\nStackTrace:\n{1}\n\nAdditional Info:\n{2}", e.Message, e.StackTrace, additionalInfo);

  Console.WriteLine(message);

  String adminEmail = ConfigurationManager.AppSettings["adminEmail"];
  String programEmail = ConfigurationManager.AppSettings["programEmail"];

  // Check to ensure that the necessary app settings have been provided
  if (String.IsNullOrEmpty(adminEmail))
    throw new Exception("adminEmail not specified in AppSettings.");

  if (String.IsNullOrEmpty(programEmail))
    throw new Exception("programEmail not specified in AppSettings.");

  try
  ...
}

更新1:

web.config中存储的信息:

<configuration>
  <appSettings>
    <add key="adminEmail" value="person1@company.com;person2@company.com"/>
    <add key="programEmail" value="program@company.com"/>
  </appSettings>
  ...

更新2:

此外,我删除了try..catch块,让方法结束,并且工作正常:

  ...
  if (String.IsNullOrEmpty(programEmail))
    throw new Exception("programEmail not specified in AppSettings.");

  return true;
}

但是,如果我尝试最小的情况,第二个throw仍然会发生:

  if (String.IsNullOrEmpty(programEmail))
    throw new Exception("programEmail not specified in AppSettings.");

  try
  {
    message = "";
  }
  catch (Exception ex)
  {
  }

  return true;
}

更新3:

我尝试在VS Express 2013 for Web中打开这个网站(我一直在使用2012 Pro),但我仍然得到相同的结果。

我也可以这样做第二个if语句:

if (String.IsNullOrWhiteSpace(programEmail))
{
  message = "";
  throw new Exception("programEmail not specified in AppSettings.");
  message = "something else";
}

调试器命中了引发异常的行(尽管我在调用此方法时添加了try/catch,并且它没有捕获此异常)。

最后,在Visual Studio的选项中,我选择了“启用.NET Framework源步进”,String.IsNullOrWhiteSpace评估为false,确认调试器已经告诉我的内容。

0 个答案:

没有答案