【问题标题】:Running multiple lines on the immediate window in Visual Studio with C#使用 C# 在 Visual Studio 中的即时窗口上运行多行
【发布时间】:2017-01-17 16:10:33
【问题描述】:

有没有办法在 Visual Studio 的即时窗口中的单个条目中运行多个命令?我正在运行 Visual Studio 2013。

当我可以在即时窗口中创建输入对象并逐步执行时,我遇到了一个更容易调试的问题,但是每次我对代码进行更改时,我都必须像这样重新创建对象:

var inputObject = new InputObject();
inputObject.Property1 = "value";
inputObject.Property2 = "value";
inputObject.Property3 = "value";
//etc.

不得不通过单独运行每一行来帮助调试我遇到的这个问题来重建这个对象是很痛苦的。有没有办法在一个命令中运行它们?像这样的东西(虽然显然这不起作用):

var inputObject = new InputObject(); inputObject.Property1 = "value"; inputObject.Property2 = "value"; inputObject.Property3 = "value";

我确实从这个链接看到在 Visual Basic 中是可能的:Using colons to put two statements on the same line in Visual Basic

也欢迎对实现最终目标的其他方法提出任何建议。

【问题讨论】:

  • 是否支持 { Property = 1, Another = 2}?
  • 这似乎不是一个有用的评论,但听起来你可以从使用单元测试中受益。
  • @CodeCaster 我同意,这是我们希望最终进入我们的流程的东西

标签: c# visual-studio visual-studio-2013


【解决方案1】:

简而言之,没有。我不相信即时窗口目前支持多个语句。

edit -- @Christopher_G_Lewis 实际上是正确的,您可以声明和实例化新变量,但我发现该语句必须以分号结束,这与许多其他表达式可能不带分号进行评估不同。

您正在做的事情被认为是一种困难的调试方法。如果您遇到的问题在没有传统方法的情况下难以调试(例如,单步执行代码、断点、跟踪),您应该考虑使用调试辅助工具

调试辅助工具可能会有所不同,但为什么不只是临时编译一小段 sn-p 代码来帮助您解决问题呢? Visual Studio 中的即时窗口并非真正用于按需创建控制流或新对象,而是更适合执行简单语句和表达式以进行快速分析。

不过,您的示例有点含糊,无法推荐特定的方法,我不确定您实际上要完成什么。代码中一个简单的struct 仍然允许您通过即时窗口使用它,如果您担心不小心将它留在代码中,您可以使用#DEBUG 常量来确保它不会被编译到您的版本中配置。

#if DEBUG
struct DebuggingAid
{
    public string A;
    public string B;
    public string C;
}
#endif

#if DEBUG
public void f()
{
    var aid = new DebuggingAid { A = "TestValue1", B = "TestValue2" };

    // var real data

    MethodBeingDebuggedWithStubDebuggingAidData(aid.A, A.B);
}
#endif

不过,我肯定会考虑您可以使用的不同调试方法。

  • 断点比你想象的更强大。您可以设置条件语句,也可以在遇到断点时打印出信息,甚至可以调用函数。
  • 函数断点允许您在某个特定名称的方法上中断,以防您无法追踪何时调用该方法或从何处调用该方法。您还可以设置条件和操作。
  • 使用System.Diagnostics.DebugSystem.Diagnostics.Trace 进行跟踪以协助IDE 中的调试器输出,您还可以将跟踪写入文件。
  • 调试辅助,如已显示的,完成后将其从代码中删除,或者保留它们但编译出#if DEBUG
  • 单元测试 - 将单元测试添加到您的代码库中没有错误的时间。您将需要稍微重构您的代码以促进可测试性,例如传递依赖项,这似乎是您正在尝试做的事情? (将测试值存入某个东西?)。
  • 即时窗口,只需操作您尝试处理的真实数据(存根?),而不是创建调试辅助工具或测试对象

如果您能提供更多关于您要完成的工作的详细信息,那么提供一些指导会更容易一些,但希望这对您有所帮助。

【讨论】:

  • 感谢您的信息。这里的问题是我正在尝试调试服务。由于我无法控制的原因,我无法在本地主机上触发该服务。我试图看看断点会发生什么,所以我试图在 VS 中模拟服务调用。理想情况下,这将通过单元测试来完成,但我希望测试当前情况而不必更改我拥有的代码,因为我正在调试生产问题
  • 看起来像一个调试辅助工具,完成后将其删除是目前的方法。谢谢。
【解决方案2】:

实际上在即时窗口中启动一个对象非常简单:

inputObject = new InputObject()
{TestMVC.Areas.UI.Controllers.ServersController.InputObject}
    Property1: null
    Property2: null
    Property3: null

inputObject = new InputObject() {Property1 = "1", Property2 ="2", Property3 = "3"}
{TestMVC.Areas.UI.Controllers.ServersController.InputObject}
    Property1: "1"
    Property2: "2"
    Property3: "3"

但这仍然是一个命令。不支持多个命令。

【讨论】:

    【解决方案3】:

    如果这些只是同一类的道具,我会喜欢 ChristopherGLewis 的回答

    您可以运行多个不同的赋值(即在不同的类中设置道具,或分配不相关的变量),方法是将它们全部填充到同一行的数组中;不要忘记 c# 中的赋值返回值...

    new object[]{ some.Prop1 = "hello", other.Prop2 = "goodbye", third.Prop3 = GetSomeValue(), myArray[0] = 2, _timeNow = DateTime.Now }
    

    你得到一个对象数组(immed 将它转储到窗口),但作为创建数组的一部分,immed 运行了语句..

    some.Prop1 = "hello";
    other.Prop3 = "goodbye";
    third.Prop3 = GetSomeValue();
    myArray[0] = 2;
    _timeNow = DateTime.Now;
    

    ..捕获它们的返回值,并将它们放入数组中。作为每次评估的副作用,你想做的任务已经完成——你可能不关心返回值


    我不知道如何使用 void 来执行此操作(即,我不知道如何使 immed 窗口在一行上运行 2 个 void 方法);我尝试过的所有操作都通过调用本地方法 Microsoft.Win32.Win32Native.GetStdHandle(int) 来响应。不支持在此上下文中评估本机方法

    //doesn't work
    new [] {(Action)(() => { Console.WriteLine("a"); Console.WriteLine("b"); })}.ToList().ForEach(x => x())
    

    【讨论】:

      【解决方案4】:

      实际上它确实有效,可能是因为我在写这个问题 5 年后才写这个答案。 您在下面看到我在即时窗口中声明了一个本地变量,然后按 Enter 并在即时窗口的后面一行中使用它。我正在使用 Visual Studio v.16.11.6

      【讨论】:

        猜你喜欢
        • 2021-10-23
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2020-09-03
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多