首页 > 解决方案 > 在断点处执行带有副作用的 C# 代码

问题描述

我想使用断点在 Visual Studio 2017 中执行代码,并让该代码的副作用影响程序。当断点被击中时,它出现在执行代码中?这在过去版本的 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);
    }

我在运行“迭代”的行上设置了一个断点,如下所示:

断点设置

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

迭代 0 迭代 1 迭代 2 计数器:0

这是一个真正的技术奇迹!Visual Studio 确实会运行代码——如果我将 Increment() 中的“return false”更改为“return true”,就会触发断点。但它神奇地避免了副作用。那太棒了!但我想要副作用。换句话说,除了“将消息记录到输出窗口”之外,我真的想要一个操作选项,它允许执行具有副作用的代码。有没有办法绕过这个 Visual Studio 功能?

你可能想知道我为什么要这样做。我想根据已通过的另一个条件断点创建一个条件断点。(例如,我知道骑士见到公主后说话很有趣,所以我想在 KnightTalks() 上设置一个断点,该断点只有在 KnightMeetsPrincess() 中的某些代码执行时才停止。我一直遇到这种情况并且当我必须禁用 KnightTalks 断点并在 KnightMeetsPrincess 之后重新启用它时会很生气,尤其是当事件链较长时。)基于条件断点取决于其他断点,我认为没有内置的方法可以做到这一点。但是如果我可以执行任意代码,我可以做类似的事情——例如,如果我可以设置和获取一个伪变量。或者可以使用如下代码:

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") 的单独条件断点。唉,这不起作用,因为代码执行,但没有副作用。

任何解决方法?

标签: visual-studiobreakpoints

解决方案


推荐阅读