我通过从代码中复制代码并将其添加到监视窗口,在运行时从代码中添加代码片段。如果代码包含.NET的默认命名空间(如System.IO,System.Xml等)的Convert.ToString(),XMLDocument.Load(),File.Write()等方法,则会出现错误: “转换”这个名称在当前上下文中不存在“但是当我在监视窗口中为添加的代码片段添加完整的命名空间时,它不会出错,例如:System.Convert.ToString(123)给出正确的值。我的程序代码在调用任何.NET框架方法之前没有完整的命名空间,因为如果我在任何方法调用之前添加命名空间,那么使用“using”关键字在每个文件的顶部添加命名空间的用途是什么。如果我在文件中的代码上方添加命名空间,那么在方法调用之前,我不必在该文件的代码中添加整个命名空间。除了每次将代码复制到监视列表时在监视窗口中添加完整命名空间,我还能做些什么,以便监视不会出错。请看下面的截图:
更新:我在监视列表中添加方法,以在方法执行之前检查方法的结果。它确保方法执行不会在执行时产生任何错误或异常,并且我可以编辑代码,因为该方法实际上并未在程序的代码执行中执行。我在该方法的调用代码上设置了一个断点,并首先在监视窗口中添加该代码以检查是否有任何错误,因为如果我不这样做,那么我必须重新运行整个程序以更正下一个值时间。
答案 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的调用会引起副作用。
希望有所帮助。