代码之家  ›  专栏  ›  技术社区  ›  Razor

.NET:调试器突出显示未实际执行的代码行

c#
  •  5
  • Razor  · 技术社区  · 14 年前

    在vs.添加对system.web和system.web.services的引用时,将以下内容复制并粘贴到新的控制台应用程序中(我知道控制台应用程序不需要这些程序集,我只是向您显示一段在我的Web应用程序中不起作用的代码)。

    虽然if语句中的两个条件都是错误的,但结果却是正确的。有人知道为什么吗?(Visual Studio 2008 9.0.30729.1).NET 3.5 SP1

    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Text;
    using System.Web.Services;
    using System.Web;
    
    namespace ConsoleApplication8
    {
        class Program
        {
            static void Main(string[] args)
            {
                string x = "qweqweqw";
                string y =
                    "{\"textMedia\":[-1,-1,-1,-1,-1],\"textOperand\":[1,1,1,1,1],\"textString\":[\"\",\"\",\"\",\"\",\"\"],\"dateSite\":[-11],\"dateOperand\":[],\"dateString\":[],\"status\":[-11,0,0],\"media\":[-11,0,0],\"subItem\":true,\"context\":false,\"branchSearch\":false,\"profileIDs\":[2,5,18],\"profileViewIDs\":[48,58,38],\"currentSelectedBranch\":0}";
    
                SaveSearch(x, y);
            }
    
            [WebMethod]
            public static object SaveSearch(string name, string encodedSearch)
            {
                object response = new { };
    
                string x = name;
                string y = encodedSearch;
    
                // Why does this if statement throw an exception if both equal false?
                if (x.Trim().Equals(string.Empty) || y.Trim().Equals(string.Empty))
                    throw new AjaxErrorException("Save Search", "Something went wrong", "JSFunction");
    
    
                try
                {
                    {
                        return new
                        {
                            error = false,
                            name = name,
                            userID = 123,
                            date = DateTime.Now
                        };
                    }
                }
                catch (Exception ex)
                {
                    String e;
    
                    if (HttpContext.Current.IsDebuggingEnabled)
                        e = ex.Message + "\n\n" + ex.StackTrace;
                    else
                        e = "error error aliens approaching";
    
                    throw new AjaxErrorException("Save Search", e, "");
                }
    
                return response;
            }
    
            public class AjaxErrorException : System.Exception
            {
                public AjaxErrorException(string title, string details, string function)
                    : base(title)
                { }
                string _stackTrace;
                public override string StackTrace
                {
                    get
                    {
                        return _stackTrace;
                    }
                }
            }
        }
    }
    
    6 回复  |  直到 14 年前
        1
  •  8
  •   Community Reversed Engineer    7 年前

    我实际上检查了,尽管调试器单步执行if(throw语句)后面的语句,但实际上并不是抛出异常。我怀疑这是IDE、IL生成和调试器之间的不一致,特别是对于throw语句。如果你尝试其他类型的陈述,你实际上看不到问题所在。它似乎也与这篇文章有关 If statement weirdness in Visual Studio 2008

    我在if块中插入了assert语句,如下所示,以确保没有触发断言。

    System.Diagnostics.Debug.Assert(false);
    
        2
  •  1
  •   David Hogue    14 年前

    所以我尝试在VS2008中将这个精确的代码粘贴到一个新的控制台应用程序中,并添加必要的引用。这是它为我做的:

    运行应用程序似乎没有引发任何异常。 然而 ,当我在调试器中运行它并跨过第30行(带有if的行)时,调试器用黄色突出显示了net行(带有throw)。我能够不断地跳过代码,而不会抛出任何实际的异常。如果我在第31行(罚球线)设置了一个断点,它就不会被击中。

    我认为调试器用户界面只是关闭了。它似乎并没有实际执行该代码。我不知道是什么原因造成的,但似乎没有什么好担心的。

        3
  •  0
  •   Joel Coehoorn    14 年前

    空值与空值不同。所以 null.Equals(string.Empty) 返回false。但是 null.Trim() 引发空引用异常,因此需要首先在此代码中测试空值。 string.IsNullOrEmpty() 正如@otavio建议的那样,这是正确的方法。在检查完之后,不要忘记修剪字符串,因为您显然也担心只包含空格的字符串。

    我知道它现在对您没有帮助,但是.NET 4将有一个内置的方法,在同一个方法中执行修剪、空检查和空检查。


    这应该可以满足您的需要:

    if (string.IsNullOrEmpty(x) || string.IsNullOrEmtpy(y) || x.Trim().Length == 0 || y.Trim().Length == 0)
    
        4
  •  0
  •   Ron Warholic    14 年前

    我刚试过这个:

        string x = "   text   \t\t\n";
        string y = "not empty";
    
        if (x.Trim().Equals(string.Empty) || y.Trim().Equals(string.Empty))
            Console.WriteLine("TRUE");
    

    它并没有像预期的那样打印“真”。一定还有其他错误,或者在您的实际代码中,“if”语句后面有分号?

    编辑:除了抛出异常而不是写入行,它也不会抛出异常。你确定这是正在抛出的代码吗?

        5
  •  0
  •   Jeffrey L Whitledge    14 年前

    这样可以解决问题。首先,删除项目中obj和bin目录的内容。然后重新启动计算机。

    如果这不能解决问题,则可能需要重新安装Visual Studio。

        6
  •  -1
  •   Novitzky    14 年前

    您的一个/两个字符串变量可能为空,而不是空。

    编辑 你们为什么投反对票? 我猜他的声明会引发nullreferenceexception。

    不管怎样,也许我的回答不够清楚:(