6

我通过从代码中复制代码并将其添加到监视窗口,在运行时将代码片段添加到监视窗口。如果代码中包含 .NET 默认命名空间(如 System.IO、System.Xml 等)的 Convert.ToString()、XMLDocument.Load()、File.Write() 等方法,则会报错:“名称 'Convert' 在当前上下文中不存在”,但是当我将完整的命名空间添加到监视窗口中添加的代码段时,它不会给出错误,例如:System.Convert.ToString(123) 给出了正确的值。我的程序代码在调用任何 .NET 框架方法之前没有完整的命名空间,因为如果我在调用任何方法之前添加命名空间,那么使用“using”关键字在每个文件顶部添加命名空间有什么用。如果我在文件中的代码上方添加命名空间,那么我不必在方法调用之前在该文件的代码中添加整个命名空间。每次我将代码复制到监视列表时,除了在监视窗口中添加完整的命名空间外,我还能做什么,这样手表就不会出错。请看下面的截图: 在此处输入图像描述

更新:我在监视列表中添加方法以在方法执行之前检查方法的结果。它确保方法执行不会在执行时给出任何错误或异常,并且我可以编辑代码,因为该方法实际上并未在程序的代码执行中执行。我在该方法的调用代码上放了一个断点,并首先在监视窗口中添加该代码以检查是否有任何错误,因为如果我不这样做,那么我必须再次重新运行整个程序以更正下一个值时间。

4

1 回答 1

1

调试器使用当前指令指针所在的上下文(源窗口左侧的黄色小箭头)来尝试评估函数。

因此,如果您停止的代码行有“使用系统;” 在文件的顶部,您应该能够在监视窗口中键入 Convert.ToInt32(123)。如果您在另一个没有使用该文件的文件中,则必须完全限定名称。

我尝试了以下测试用例:

// Main.cs
using System;
namespace TestCon
{
    class Program
    {
        static void Main(string[] args)
        {
            Foo foo = new Foo();

            Console.WriteLine(Convert.ToString(123));
            Console.WriteLine(Convert.ToInt32("234"));
        }
    }
}

//Foo.cs (note that there are no using statements in this file)
namespace TestCon
{
    class Foo
    {
       public Foo()
       { }
    }  
}

如果我进入 main.cs 文件中的任何点,我可以将 Convert 表达式复制到不带 System 命名空间限定符的监视窗口,它们将进行评估。如果我在 Foo() 构造函数中进入(或运行到断点),除非我将 System 命名空间限定符添加到开头,否则我会收到“当前上下文中不存在名称 'Convert'”错误。

注意:即使可以计算表达式,您最终也不得不经常点击刷新按钮(监视窗口右侧附近圆圈中的两个箭头),因为调试器无法判断对 CLR 的调用是否会导致侧效果。

希望有帮助。

于 2014-04-08T21:59:16.067 回答