我想使用断点在Visual Studio 2017中执行代码,并且该代码的副作用会影响程序。它出现在Execute code when breakpoint is hit?中,这在过去的Visual Studio版本中是可行的。
但请考虑以下代码。
int Counter = 0;
public bool Increment()
{
Counter++;
return false;
}
public void PrintNumbers()
{
for (int i = 0; i < 3; i++)
{
Debug.WriteLine($"Iteration {i}");
}
Debug.WriteLine("Counter: " + Counter);
}
我在运行“Iteration”的行上设置了一个断点,如下所示:
当它运行时,它会产生以下输出:
迭代0 迭代1 迭代2 计数器:0
这是一个真正的技术奇迹! Visual Studio确实运行代码 - 如果我将Increment()中的“return false”更改为“return true”,则会触发断点。但它神奇地避免了副作用。那很棒!但我想要副作用。换句话说,我真的想要一个动作选项,除了“将消息记录到输出窗口”,允许执行带副作用的代码。有没有办法解决这个Visual Studio功能?
您可能想知道我为什么要这样做。我想使一个条件断点依赖于已经传递的另一个条件断点。 (例如,我知道骑士在遇见公主后说话很有趣,所以我想在KnightTalks()上设置一个断点,只有当KnightMeetsPrincess()中的某些代码执行时才会停止。我会一直遇到这种情况。当我必须禁用KnightTalks断点并在KnightMeetsPrincess之后重新启用它时会感到恼火,特别是在有更长的事件链时。)基于Conditional breakpoint depends on other breakpoint,我认为没有内置方法可以做到这一点。但是如果我可以执行任意代码,我可以做类似的事情 - 例如,如果我可以设置并获得伪变量。或者可以使用如下代码:
public static class Bookmark
{
static Dictionary<string, int> HitCounts = new Dictionary<string, int>();
public static bool Set(string s)
{
if (!HitCounts.ContainsKey(s))
HitCounts[s] = 1;
else
HitCounts[s]++;
return false;
}
public static bool Set(string s, bool condition)
{
if (condition)
Set(s);
return false;
}
public static bool Get(string s)
{
return HitCounts.ContainsKey(s);
}
}
这段代码的想法是我会在KnightMeetsPrincess上放置一个条件断点,调用Bookmark.Set(“KnightMeetsPrincess”),然后放在KnightTalks上,这是一个单独的条件断点,名为Bookmark.Get(“KnightMeetsPrincess”)。唉,这不起作用,因为代码执行,但没有副作用。
有任何解决方法吗?