在Visual Studio中添加不完整命名空间的监视器

6
我可以通过将代码复制并添加到观察窗口来在运行时从代码中添加代码片段到观察窗口。如果代码包含.NET的默认命名空间(如System.IO、System.Xml等)中的Convert.ToString()、XMLDocument.Load()、File.Write()等方法,则会出现错误:“当前上下文中不存在名称'Convert'”。但是,如果我在观察窗口中添加完整的命名空间,例如:System.Convert.ToString(123)会给出正确的值,并且不会出现错误。我的程序代码在调用任何.NET框架方法之前没有完整的命名空间,因为如果在任何方法调用之前添加命名空间,那么使用“using”关键字在每个文件顶部添加命名空间有什么用呢?如果在文件中的代码之前添加命名空间,则不必在该文件的代码中添加整个命名空间以调用方法。除了每次将完整命名空间添加到观察窗口以避免观察出错外,我还能做什么?请参见下面的屏幕截图: enter image description here 更新:我将一个方法添加到观察列表中以在执行之前检查方法的结果。这确保了方法的执行不会在执行时出现任何错误或异常,并且我可以编辑代码,因为该方法实际上尚未在程序的代码执行中执行。我在调用该方法的代码上放置一个断点,并首先将该代码添加到观察窗口中,以检查是否有错误,因为如果我不这样做,则下一次需要重新运行整个程序才能更正该值。

我从未见过监视窗口用于方法,通常我使用它来观察变量的 - Sayse
@Sayse 在执行方法之前,您将如何检查其结果以确保在执行时不会出现任何错误或异常。我会在调用该方法的代码上设置断点,并首先将该代码添加到监视窗口中以检查是否存在任何错误。否则,如果我不这样做,那么下一次我就必须重新运行整个程序来更正值。 - Computer User
我倾向于尝试编写不会引起异常的代码,如果确实发生异常,那么 MSDN 有广泛的文档,通常会告诉我应该捕获什么。对于调试,就像我说的,观察变量和断点。我并不是说你做错了什么,只是我不会以那种方式使用监视器,这对我来说似乎很奇怪。 - Sayse
@Sayse 抱歉,我的意思是在监视中添加一个方法有助于在实际执行代码之前检查方法的执行结果。如果它在监视中运行不好,你可以修改代码。否则,如果它在实际代码执行中给出错误的结果,那么你必须重新开始调试并再次到达相同的点以查看代码中新更正的结果。 - Computer User
是的,我刚刚尝试了自己做,感觉这是一个有趣的概念。顺便说一下,对我来说它运行良好。 - Sayse
@Sayse 很好。这个练习的整个重点是在你不确定其执行结果的方法调用代码上方或正上方添加断点。例如,数据库更新SQL调用、XML文件加载调用等,然后在观察窗口中进行尝试,直到你在观察窗口中获得所需的结果,然后继续代码的执行。 - Computer User
1个回答

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

因此,如果您停在的代码行顶部有“using System;”,则应该能够在监视窗口中键入Convert.ToInt32(123)。如果您在没有此 using 的其他文件中,则需要完全限定名称。

我使用以下测试案例尝试了这一点:

// 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文件中的任何一点进行复制转换表达式并将其放入监视窗口,而没有System命名空间限定符,它们将被评估。但是,如果我进入(或运行到断点)Foo()构造函数中,我会得到“当前上下文中不存在‘Convert’名称”的错误,除非我在开头添加System命名空间限定符。
注意:即使可以评估表达式,您最终仍需要经常点击刷新按钮(监视窗口右侧的两个箭头组成的循环),因为调试器无法确定对CLR的调用是否会导致副作用。
希望这有所帮助。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接