在Visual Studio中添加没有完整命名空间的监视

时间:2013-07-04 18:01:07

标签: c# visual-studio debugging visual-studio-2012 visual-studio-debugging

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

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

1 个答案:

答案 0 :(得分:1)

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

因此,如果您停止的代码行有“using System;”在文件的顶部,您应该能够在观察窗口中键入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命名空间限定符添加到开头。

注意:即使可以评估表达式,您也必须经常点击刷新按钮(观察窗口右侧附近的圆圈中的两个箭头),因为调试器无法判断是否有对CLR的调用会引起副作用。

希望有所帮助。