c# - C# 的行为在 VS2008 调试器中获取类的成员

标签 c# visual-studio-2008

我正在向我的一位 friend 解释一些模块,我不得不进入 Debug模式以通过设置断点来显示某些变量/属性的某些值。

对于正常情况,如果我在 get/set 中设置断点,则正常程序流会命中断点并显示正确的结果。
我发现有趣的是 VS 调试器也将使用相同的方法(即调用 get 方法)来了解属性值。

作为调试器,它应该能够在不干扰程序或产生任何副作用的情况下获取程序的状态。

尝试下面的代码设置几个断点并将鼠标悬停在 console.write() 的属性计数上。您会发现 count 发生了变化,而实际上并没有被 get 中的断点击中。
只需将鼠标悬停在属性上,它就会从中获取值,这在一些奇怪的调试 session 中可能很难理解。

我知道人们会说 get 不应该修改成员或糟糕的设计,但在某些情况下,最好在 get() 中编写,例如测试是否为 null,如果为 null 则返回一个新对象;

public class Test
{
    int _count;
    public int Count
    {
        get
        {
            _count++;
            return _count;
        }
    }
}
public class Program
{
    static void Main(string[] args)
    {
        Test tCount = new Test();
        Console.Write(tCount.Count);
    }
}

你觉得这是 VS 的正确行为吗?,

因为调试器不应该修改程序的状态。 即使它修改了状态,它也应该通过断点。

我能想到为什么调试器不通过断点的唯一原因是它必须停止/中断自身的调试线程才能到达将停止它的断点。

最佳答案

属性 getter 或 setter 基本上与方法相同。调试器在评估时无法防止副作用。如果您不想要副作用,则直接使用调试器读取字段的值(在您的示例中为 _count)。

关于c# - C# 的行为在 VS2008 调试器中获取类的成员,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8257149/

相关文章:

c# - MVC Identity 的记住我功能

c# - 使用 Unity 注册 Mock 对象的问题

c# - Windows 窗体可见性问题

c# - 覆盖文件最快的方法是什么?

c# - 在 C# 中使用 DataGridView 和 BindingList 时的线程安全建议

c# - Crystal 报表显示数据库登录要求?

visual-studio-2008 - Visual Studio C++ - 链接 LIBCMT.lib 和 LIBCMTD.lib(调试版)

visual-studio-2008 - CMake-使用Intel编译器生成Visual Studio项目

c++ - 如何使用 vsinstr/vsperfmon 获得真正的代码覆盖率

C++:如何检查模板函数中使用的数据类型?