C# 当String.IsNullOrEmpty为false时,C if语句求值为true

C# 当String.IsNullOrEmpty为false时,C if语句求值为true,c#,asp.net,if-statement,behavior,C#,Asp.net,If Statement,Behavior,我在助手类中有一个静态方法,它通过电子邮件通知管理员错误。在发送电子邮件之前,我会检查web.config中是否提供了必要的电子邮件地址 当第一个String.IsNullOrEmpty运行时,将跳过if后面的语句。但是,将执行第二个if后面的语句。在 在这两种情况下,我都可以在VisualStudio调试器中检查相应的电子邮件变量,并且可以验证每个变量中是否有实际的电子邮件地址。我还调试了没有手表的手表,只是为了确保手表没有效果 此外,我尝试在if后面的每个语句周围放置{},但这并没有改变行为

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

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

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

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

如果我改变这些If语句的顺序,同样的事情也会发生;跳过第一次抛出,但执行第二次抛出

在写这篇文章时,我注意到将Console.WriteLine向下移动到ifs下面会使一切都按预期工作。不过,我仍然很好奇,如果我把代码留在下面,为什么会发生这种情况。如果将来能够避免这个问题,那就太好了

方法:

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中的信息:

但如果我尝试一个最小的情况,第二次抛出仍然会发生:

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

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

  return true;
}
更新3: 我试着在VS Express 2013中打开这个网站,因为我一直在使用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,确认了调试器已经告诉我的内容。

@robg37好的,现在您知道我们没有人疯了;-接下来我需要知道的是,这些代码是否都在一个项目中,或者MyUtility类是否位于与主web项目完全不同的项目中。@RussWilson我有点担心自己会发疯:-无论如何,这些代码都在一个网站中,而不是web应用程序中。该网站位于包含另一个项目(控制台应用程序)的解决方案中。控制台应用程序也有一个MyUtility类,其中包括相同的方法,但它位于单独的命名空间中。@robg37 Hmmm。。。所以,如果我理解正确的话,你是说你实际上用相同的方法创建了两个MyUtility类。您能确保没有添加对控制台应用程序的引用吗?另外,当您进入MyUtility.NotifyAdmin时。。。方法在VisualStudio中调试时,是否会将您带到网站名称空间而不是控制台应用程序名称空间中的正确类/方法?注释不用于扩展讨论;这段对话已经结束。我不完全确定在回答这个问题时需要做些什么,但尽我所能,Visual Studio调试器出现了一些问题,但它对我的代码没有任何实际影响。
  if (String.IsNullOrEmpty(programEmail))
    throw new Exception("programEmail not specified in AppSettings.");

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

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