【问题标题】:VSC17 debugging nulls variables if edited in a foreach如果在 foreach 中编辑,VSC17 调试空变量
【发布时间】:2019-06-02 12:19:42
【问题描述】:

我遇到了一个小问题(这次),如下所示:

当我在 Visual Studio Community 2017 中调试我的代码并在 foreach 中编辑任何内容时,该范围内的所有变量(包括被迭代的变量)都设置为 null。

foreach (var bFile in baseCache) {
    var file = lastFolder + "\\" + bFile.Value.relPath;
    if (!lastCache.ContainsKey(file)) {
        if (file.Length > 255) { continue; }
        // TODO: do stuff when the file isn't present in the last backup
    }

    var lFile = lastCache[file];
    var comp = bFile.Value.compare(lFile);
    if (!comp.HasFlag(FileData.CompareFlags.CRC32 & FileData.CompareFlags.Size)) {

    }
}

例如,在这部分中,我在第 4 行设置了一个断点,如果“lastCache”不包含当时由“file”表示的键,则断点所在的位置。

那时只有继续;坐在那个地方,我改变了它,就像现在显示的那样,当我按下 F10 时,因为我想在那个时候验证这个问题,所以 sn-p 中显示的所有变量都变成了“null”。

有人可以向我解释为什么会发生这种情况以及如何避免这种情况吗?

目前,当我更改内容时,这只是一个小麻烦,但如果稍后在更大的项目中发生这种情况,那将是一个真正的问题......

编辑:这是整个代码的链接,它只是一个控制台应用程序,幸运的是,这很容易完成 https://www.pastiebin.com/5cf3e7dfa2985

【问题讨论】:

    标签: c# visual-studio debugging


    【解决方案1】:

    在循环体中声明的变量范围就是这个循环体。当您进入循环体时,它们尚未定义。例如。 lFilecomp 在分配执行之前不会有值。

    如果要在多个循环中保留值,请在循环之前声明变量。


    使用字典的注意事项。使用TryGetValue 测试密钥的存在并立即获取值更有效

    if (lastCache.TryGetValue(file, out string lFile)) {
        // do something with lFile.
    } else {
        // file is missing
    }
    

    【讨论】:

    • 我知道它是否必须重置循环范围内的变量,但问题是它还会重置循环上方范围内的变量。正如我所说,无论出于何种原因,它所迭代的变量也会被重置。我用VS已经有一段时间了,上次还是WS Express,不是VS Community,但我记得当时这种编辑不是问题。
    • 我们必须查看整个相关代码才能知道发生了什么。例如。当您使用 new MyClass 创建对象时,类字段(类级别的变量)将重置为 null
    • 我已经添加了一个指向源的链接,因为你提到的内容听起来像是一个可能的原因,但如果我说我完全理解你的意思,那我就是在撒谎。
    • 请注意,Edit and Continue (Visual C#) 有其局限性。有Unsupported changes to code
    • 这很有帮助,所以在这一点上感谢您,但我有点困惑我的案例属于哪个限制。一开始我以为是.Net 4之前的框架的迭代器修改,但我的程序是针对4.6.1的,所以我认为不是吗?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-07-01
    • 1970-01-01
    • 1970-01-01
    • 2013-06-25
    相关资源
    最近更新 更多