为什么我不能在即时窗口中声明新变量?

时间:2010-03-07 17:26:48

标签: .net visual-studio debugging

这可以节省我这么多时间。有时我发现自己在手表或即时窗口中写这样的东西:

MyObject.Function1.Fuction2.Fuction3.Fuction2

相反,我可以声明几个新变量,并以更有条理的方式执行此操作。

但是不允许这样做。

有什么方法可以做到这一点吗?在未来的版本中是否会支持我想要的东西?

7 个答案:

答案 0 :(得分:33)

回答标题中的问题:

在VS2015中,您可以在即时窗口中声明变量。但是你必须用分号

结束你的命令
var abc = "abcdef";
Expression has been evaluated and has no value

var n = 7;
Expression has been evaluated and has no value

int o = 8;
Expression has been evaluated and has no value

要显示结果,只需输入变量的名称:

abc
"abcdef"

?abc
"abcdef"

?abc;
"abcdef"

abc;
"abcdef"

答案 1 :(得分:20)

不要使用Dim

jack = 12
? jack
12 {Integer}

答案 2 :(得分:3)

使用C#,您可以在调试期间在即时窗口中声明变量(我真的不知道它是否只是VS2008功能,但我刚刚在VS2008团队版中验证过它。)

您无法在Watch窗口中声明变量(实际上错误消息显示“声明语句仅允许在即时窗口中显示”),但您可以在即时窗口中观看您创建的任何变量。

此外,在即时窗口中声明变量时,您无法使用var,但除此之外,您可以执行您所要求的操作。

答案 3 :(得分:2)

@AMissico指出了我之前的错误 - 显然你可以在VB.NET中用隐式赋值完成这个。

我仍然认为这是一个拐杖,如果我发现自己需要这样做,我会开始问为什么程序的结构是这样的,这使得必要。

如果您需要这种级别的调试信息,那么将它放在程序逻辑中是一种更好的做法 - 这样,当未来的维护程序员必须调试相同的代码路径时,它们将具有所有相同的详细信息信息,而不必“询问”深层嵌套的对象图。不要写MyObject.Function1().Function2().Function3(),而是写:

var first = MyObject.Function1();
var second = first.Function2();
var third = second.Function3();

然后,您可以在调试器中单步执行实际的程序逻辑,而不是在立即窗口中编写整个测试脚本。

如果您需要获得复杂对象或层次结构的详细表示,您也可以考虑编写自己的Debugger Visualizer

答案 4 :(得分:2)

@huha答案的澄清。如果看到error CS0726: '' is not a valid format specifier,您可能只是忘记了 semicolon ;

示例:

DateTime t = DateTime.Parse("2020-01-01 00:00:00")
error CS0726: 't' is not a valid format specifier
t
error CS0103: The name 't' does not exist in the current context
DateTime t = DateTime.Parse("2020-01-01 00:00:00");
Expression has been evaluated and has no value
t
{2020-01-01 00:00:00}
    Date: {2020-01-01 00:00:00}
    Day: 1
    DayOfWeek: Wednesday
    DayOfYear: 1
    Hour: 0
    Kind: Unspecified
    Millisecond: 0
    Minute: 0
    Month: 1
    Second: 0
    Ticks: 637134336000000000
    TimeOfDay: {00:00:00}
    Year: 2020

答案 5 :(得分:1)

这可能是另一种选择:您可以使用Object Test Bench创建MyObject实例,并使用您需要的任何参数调用实例的方法(或者只调用该方法而不创建实例,如果它是静态方法)。

答案 6 :(得分:0)

除了Aaronaught所说的,你所描述的这种结构违反了Law of Demeter。您可能需要考虑重构程序,以便不需要这样的构造。实际上,即使提供的解决方案仍然存在违反正确的关注点的情况。

如果方法引用的间接不超过一个级别,那么调试器的行为将更适合应用程序。