使用C#在Visual Studio中的即时窗口上运行多行

时间:2016-09-09 13:31:29

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

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

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

string cs4 = ConfigurationManager.ConnectionStrings["example"].ConnectionString;
StringBuilder sb4 = new StringBuilder();
using (SqlConnection con4 = new SqlConnection(cs4))
{
    string strTQuery = @"SELECT * FROM [dbo].[view]";
    SqlDataAdapter da4 = new SqlDataAdapter(strTQuery, con4);
    DataSet ds4 = new DataSet();
    da4.Fill(ds4);

    ds4.Tables[0].TableName = "Example";

    foreach (DataRow exDR in ds4.Tables["Example"].Rows)
    {
        sb4.Append(exDR["A"].ToString() + strDelimiter);
        sb4.Append(exDR["B"].ToString() + strDelimiter);
        sb4.Append(exDR["C"].ToString() + strDelimiter);
        sb4.Append(exDR["D"].ToString());
        sb4.Append("\r\n");
    }
}

StreamWriter file4 = new StreamWriter(@"\\Desktop" + todaysDate + ".csv");
file4.WriteLine(sb4.ToString());
file4.Close();

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

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

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

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

3 个答案:

答案 0 :(得分:3)

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

编辑 - @Christopher_G_Lewis实际上是正确的,您可以声明并实例化新变量,但我发现该语句必须以分号结束,不像许多其他表达式可以在没有它的情况下进行评估。

您正在做的事情是一种难以调试的方法。如果你有一个难以在没有传统方法的情况下调试的问题(例如单步执行代码,断点,跟踪),你应该考虑 Debugging Aid

调试辅助工具可能会有所不同,但为什么不能实际编译一小段代码,以帮助您排除故障? 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
  • 单元测试 - 没有错误的时间将单元测试添加到您的代码库中。您需要稍微重构代码以便于测试,例如传递依赖关系,这可能看起来就像您要做的那样? (将测试值存入某些东西?)。
  • 立即窗口,只需操作您尝试的实际数据(存根?)而不是创建调试辅助工具或测试对象

如果你能提供一些关于你想要完成什么的更多细节,那么提供一些指导会更容易,但希望这对你有所帮助。

答案 1 :(得分: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"

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

答案 2 :(得分:0)

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

您可以运行多个不同的赋值(即在不同的类中设置 props,或分配不相关的变量),方法是将它们都塞进一个数组中的同一行;不要忘记 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())