【发布时间】:2010-03-07 17:26:48
【问题描述】:
这可以节省我很多时间。有时我发现自己在手表或即时窗口中写了这样的东西:
MyObject.Function1.Fuction2.Fuction3.Fuction2
相反,我可以只声明几个新变量并以更结构化的方式执行此操作。
但是不允许这样做。
有什么方法可以做到这一点吗?未来的版本是否会支持我想要的功能?
【问题讨论】:
标签: .net visual-studio debugging
这可以节省我很多时间。有时我发现自己在手表或即时窗口中写了这样的东西:
MyObject.Function1.Fuction2.Fuction3.Fuction2
相反,我可以只声明几个新变量并以更结构化的方式执行此操作。
但是不允许这样做。
有什么方法可以做到这一点吗?未来的版本是否会支持我想要的功能?
【问题讨论】:
标签: .net visual-studio debugging
只回答标题中的问题:
在 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"
【讨论】:
不要使用暗淡
jack = 12
? jack
12 {Integer}
【讨论】:
澄清@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
【讨论】:
使用 C# 可以在调试时在即时窗口中声明变量(老实说我不知道它是否只是 VS2008 的功能,但我刚刚在 VS2008 团队版中验证过)。
您不能在 Watch 窗口中声明变量(实际上错误消息是“仅在即时窗口中允许声明语句”),但您可以在即时窗口中查看您创建的任何变量。
此外,在即时窗口中声明变量时,您不能使用var,但除此之外,您可以按照您的要求进行操作。
【讨论】:
Dim 或As ...。
@AMissico 指出了我之前的错误——显然你可以在 VB.NET 中通过隐式赋值来做到这一点。
我仍然认为这是一个拐杖,如果我发现自己需要这样做,我会开始问为什么程序的结构如此必要。
如果您需要此级别的调试信息,最好将其放入您的程序逻辑中 - 这样,当未来的维护程序员必须调试相同的代码路径时,他们将拥有所有相同的详细信息信息,而不必“询问”深度嵌套的对象图。不要写MyObject.Function1().Function2().Function3(),写:
var first = MyObject.Function1();
var second = first.Function2();
var third = second.Function3();
然后您可以在调试器中单步执行实际的程序逻辑,而不是在“立即”窗口中编写整个测试脚本。
如果您需要获取复杂对象或层次结构的详细表示,您也可以考虑编写自己的 Debugger Visualizer。
【讨论】:
这可能是另一种选择:您可以使用 Object Test Bench 创建 MyObject 的实例,并使用您需要的任何参数调用该实例的方法(或者只调用该方法而不创建实例,如果它是静态方法)。
【讨论】:
除了 Aaronaught 所说的之外,您描述的此类构造违反了 Law of Demeter 。您可能需要考虑重组您的程序,以便不需要此类结构。事实上,即使提供的解决方案也违反了适当的关注点分离。
如果方法引用的间接级别不超过一级,则调试器的行为将更适合应用程序。
【讨论】: