执行带有关于断点的副作用的C#代码

时间:2018-06-07 18:38:05

标签: visual-studio breakpoints

我想使用断点在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”的行上设置了一个断点,如下所示:

breakpoint setting

当它运行时,它会产生以下输出:

迭代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”)。唉,这不起作用,因为代码执行,但没有副作用。

有任何解决方法吗?

0 个答案:

没有答案