我有点感到困惑的时候,正是我的财产是被初始化。

假设我有一个酒店宣布这样的:

private Dictionary<string, Dictionary<string,string>> MessageLookup
    {
        get
        {
           return messages ?? doSomething();
        }
    }

对或重写现有的方法填充信息的字典和返回。

我的问题是,当时是这样的代码跑?如果我把一个断点进入或重写现代码,是不是打,但MessageLookup酒店是保持数据(这是唯一的地方进行初始化)时,我认为它在调试器。

这是码在运行的建设?并调试器自动运行,当我悬停的变量名字?如果是这样,为什么不断点打?

有帮助吗?

解决方案

每当有人指属性即代码运行,而不是之前。

如果您使用调试器,你会看到它,因为调试器会尝试自动获取属性值(这样你就可以看到该对象的状态)。我不知道调试器是否忽略断点,而它的评估本身的属性 - 这可以解释一切

尝试运行代码的不是一个调试器的,并提出一些代码访问你的财产:

var lookup = someObject.MessageLookup;

doSomething()转储堆栈跟踪,你会看到发生了什么事情。

其他提示

据当你的属性首先计算运行。没有背景的东西怎么回事。

我猜,因为你使用快速监视窗口来检查你的对象,你没有看到这一点。在这一点上它会被执行,断点会被跳过。

酒店干将(和 ToString() 对于这个问题)被假定为是 纯粹的, ,这基本上意味着评估它没有副作用。你应该重写代码,坚持这样的假设或者你会面 讨厌的后果.如果必须使用延迟的初始化在访问时间,使用 GetMessageLookup() 方法来代替。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top