.net 为什么可以';我不能在即时窗口中声明新变量吗?

.net 为什么可以';我不能在即时窗口中声明新变量吗?,.net,visual-studio,debugging,.net,Visual Studio,Debugging,这可以节省我很多时间。有时我发现自己在手表或即时窗口中写下这样的东西: MyObject.Function1.Fuction2.Fuction3.Fuction2 相反,我可以只声明几个新变量,并以一种更结构化的方式进行 然而,这样做是不允许的 有什么方法可以让我做到这一点吗?将来的版本会支持我想要的吗?@AMissico已经指出了我之前的错误-显然你可以在VB.NET中通过隐式赋值来实现这一点 我仍然认为这是一个拐杖,如果我发现自己需要这样做,我会开始问为什么这个程序的结构是必要的。 如果您

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

MyObject.Function1.Fuction2.Fuction3.Fuction2
相反,我可以只声明几个新变量,并以一种更结构化的方式进行

然而,这样做是不允许的


有什么方法可以让我做到这一点吗?将来的版本会支持我想要的吗?

@AMissico已经指出了我之前的错误-显然你可以在VB.NET中通过隐式赋值来实现这一点


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

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

var first = MyObject.Function1();
var second = first.Function2();
var third = second.Function3();
然后,您可以在调试器中单步执行实际的程序逻辑,而不是在即时窗口中编写整个测试脚本


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

这可能是另一种选择:您可以使用对象测试台创建MyObjor实例,并调用具有所需参数的实例的方法。(如果是静态方法,则只调用该方法而不创建实例)

< P>除了Aaronaught所说的,你描述的这些结构违反了。你可能需要考虑重构你的程序,这样的结构是不必要的。事实上,即使所提供的解决方案也保持了对关注点的适当分离的违反。

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

使用C#您可以在调试期间在即时窗口中声明变量(老实说,我不知道它是否仅是VS2008功能,但我刚刚在VS2008 team edition中验证了它)

您不能在监视窗口中声明变量(事实上,错误消息说“仅允许在即时窗口中声明语句”),但您可以监视在即时窗口中创建的任何变量

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

不要使用Dim

jack = 12
? jack
12 {Integer}

仅回答标题中的问题:

在VS2015中,您可以在即时窗口中声明变量。但您必须以分号结束命令:

var abc = "abcdef";
Expression has been evaluated and has no value

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

abc
"abcdef"


@huha答案的澄清。如果您看到
错误CS0726:''不是有效的格式说明符
,您可能只是忘记了一个
分号

例如:

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

你不明白,我正在调试层次结构。它们就是这样设计的。我需要声明一些变量才能有效地调试它们。@diamandiev:那么在代码中声明变量,而不是在调试器中。或者创建一个可视化工具,它根本不需要更改任何代码。有什么东西阻止你这么做吗?@diamandieV:在代码中创建变量,以便可以在即时窗口中使用这些变量。将变量放在具有公共作用域的模块中。此外,由于正在调试,所以在模块中创建测试过程,这样您就可以从即时窗口调用它们,并在测试过程中设置断点。“我仍然认为这是一个拐杖”。是的,我同意。在我编程的这些年里,我只需要做几次。如果我不能很快弄明白,我会在需要的地方创建测试方法和过程,然后在完成故障排除后删除它们。@diamandiev:你可以将这些变量和方法调用添加到“监视”窗口中,以完成你想要的操作。我不使用c#too bad、 为什么c#总是能得到所有很酷的东西?当否决投票时,请留下评论。我投了-1票,因为你可以。只是不能使用
Dim
As…
@AMissico:我并不是真的声称什么。正如我说的,我不是VB程序员,但错误消息表明这是不可能的。OP没有指定哪种语言,所以该链接可以提供一些解释。我将删除对VB的提及。我理解。这可能是最具误导性的错误消息。哎呀,我在注释中的语法完全错误。(时间太晚了。)应该是“…因为你可以设置变量。”我一直在使用它(在VB中)。它只能用于解决方案中的活动项目。您可以创建实例(或调用静态方法)使用“类视图”窗口,并使用“对象测试工作台”窗口本身操作实例方法。哦,没错!只有活动项目。我总是忘记这一点。就像我忘了我可以更改活动项目以访问相关对象一样。+1(但它不允许我投票,因为投票太旧了,这很奇怪,因为我没有投票。)我现在在我的显示器上贴了一个帖子来记住对象测试台!非常感谢M.a.Hanin。你太棒了!我发现允许你做这样的隐式作业有点令人不安…但是正确的答案就是正确的答案,+1。信息来源:问号(?)是调试的别名。打印
abc
"abcdef"
?abc
"abcdef"
?abc;
"abcdef"
abc;
"abcdef"
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