visual-studio - 在断点处执行带有副作用的 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") 的单独条件断点。唉,这不起作用,因为代码执行,但没有副作用。
任何解决方法?
解决方案
推荐阅读
- php - PHP 在类的静态方法中调用函数
- jenkins - Windows 中的 Jenkins 工作区设置问题
- java - 比较文本文件中类似字符串的行
- r - r 在安装 lightgbm 期间相应地发生错误 internalsID
- eclipse - 尝试从 Mbed 编译器编译导入的项目时出错
- sql - where 子句中的多个 Case 条件
- angular - 如何从 Angular Guard 的流中返回布尔值?
- jquery - Owl Carousel 使用单个 jQuery 脚本进行 2 个或更多部分
- c++ - 如何编译 LLVM Kaleidoscope 教程?
- python - SOCIAL_AUTH_LOGIN_ERROR_URL 不工作 Django 2.0.6