【问题标题】:Why can't I declare new variables in the immediate window?为什么我不能在即时窗口中声明新变量?
【发布时间】:2010-03-07 17:26:48
【问题描述】:

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

MyObject.Function1.Fuction2.Fuction3.Fuction2

相反,我可以只声明几个新变量并以更结构化的方式执行此操作。

但是不允许这样做。

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

【问题讨论】:

    标签: .net visual-studio debugging


    【解决方案1】:

    只回答标题中的问题:

    在 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"
    

    【讨论】:

    • 来自here 的信息:问号 (?) 是 Debug.Print 的别名
    • 好像就这么简单……
    【解决方案2】:

    不要使用暗淡

    jack = 12
    ? jack
    12 {Integer}
    

    【讨论】:

    • 我发现允许您进行这样的隐式分配有点令人不安......但是正确的答案就是正确的答案,+1。
    【解决方案3】:

    澄清@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
    

    【讨论】:

      【解决方案4】:

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

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

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

      【讨论】:

      • 我不太会使用 c#。为什么 c# 总是能得到所有很酷的东西?
      • 投反对票时请发表评论。
      • 我投了-1,因为你可以。只是不能使用DimAs ...
      • @AMissico:我并没有真正声称任何东西。正如我所说,我不是 VB 程序员,但错误消息表明这是不可能的。 OP 没有指定哪种语言,因此该链接可以提供一些解释。我将删除对 VB 的提及。
      • 我明白了。这可能是最具误导性的错误信息。糟糕,我在评论中的语法完全错误。 (已经很晚了。)应该是“......因为你可以设置一个变量。”
      【解决方案5】:

      @AMissico 指出了我之前的错误——显然你可以在 VB.NET 中通过隐式赋值来做到这一点。

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

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

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

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

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

      【讨论】:

      • 你不懂,我在调试层次结构。他们就是这样设计的。我需要声明一些变量以便有效地调试它们。
      • @diamandiev:所以在代码中声明变量,而不是在调试器中。或者创建一个可视化工具,它根本不需要更改任何代码。有什么东西阻止你这样做吗?
      • @diamandiev:在代码中创建变量,以便您可以在即时窗口中使用它们。将变量放在具有公共范围的模块中。此外,由于您正在调试,请在模块中创建测试程序,以便您可以从即时窗口调用它们并在测试程序中设置断点。
      • “我仍然认为这是一个拐杖” 是的,我同意。在我编程的这些年里,我只需要这样做几次。如果我不能很快弄清楚,我会在需要的地方创建测试方法和程序,然后在完成故障排除后将其删除。
      • @diamandiev:您可以将这些变量和方法调用添加到 Watch 窗口以做您想做的事情。
      【解决方案6】:

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

      【讨论】:

      • 我一直在使用它(在 VB 中)。它只能用于解决方案中的活动项目。您可以使用 Class View 窗口创建实例(或调用静态方法),并使用 Object Test Bench 窗口本身操作实例方法。
      • 哦,对了!仅活动项目。我总是忘记这一点。就像我忘记了我可以更改活动项目以获取相关对象。
      • +1(但它不会让我投票,因为投票太旧了,这很奇怪,因为我还没有投票。)
      • 我现在在我的显示器上有一个便利贴来记住对象测试台!非常感谢 M.A. Hanin。你太棒了!
      【解决方案7】:

      除了 Aaronaught 所说的之外,您描述的此类构造违反了 Law of Demeter 。您可能需要考虑重组您的程序,以便不需要此类结构。事实上,即使提供的解决方案也违反了适当的关注点分离。

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

      【讨论】:

        猜你喜欢
        • 2016-04-23
        • 2013-03-16
        • 1970-01-01
        • 2021-11-24
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多