有没有办法在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
对于实现最终目标的其他方法的任何建议也是受欢迎的。
答案 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.Debug
和System.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())