[英]A property's value is being changed in memory without hitting the setter
我有一个List<T>
和一种Video
类型。 Video
类类似于以下内容:
public class Video {
public bool IsActive { get; set; }
public string Name { get; set; }
private int videoID;
public int VideoID {
get { return videoID; }
set {
if (Equals(value, videoID)) return;
videoID = value;
}
}
}
我有一个还无法复制的复杂场景,因此我没有在寻找确切的答案,但是有一些理论上的可能性可以帮助我进行调试。
情境
加载包含自定义ListBox
视图。 MeasureOverride()
已被覆盖以检查值,然后立即调用base.MeasureOverride()
。 在执行base.MeasureOverride()
之前,我已经设置了一个平行观察器来检查列表中任一项目上的VideoID
值都是正确的值。 假设138
。 一次向前移动,该值已“神奇地”更改为一致的其他值158
。 VideoID.set
处的断点永远不会命中。
在没有调试器到达断点的情况下,可以用什么方式操纵对象的值? 我的猜测是反射-我正在使用( fastJSON
)反序列化。
感谢您的任何想法。
(1)私营领域的videoID
仅在参考Video
中获取类和设置的VideoID
(2)我有另一个怀疑者是另一个线程中的某个东西,这可能就是为什么它似乎在视图加载之后的某个持续时间发生,而未必发生在代码中任何一致点的原因。 base.MeasureOverride()
是一个[对于我来说]耗费时间的函数,暗示着我可能离此错误的源头很远。
(3)我还要补充一点,即使VideoID是自动属性,也会出现此问题。 因此,在我的示例中,我无法合理地接受它与后备字段有关。
如果使用的是Visual Studio,请在videoID(后备存储小写版本)和“查找所有引用”上单击光标。 您的示例代码不包含videoID的定义,但我怀疑它是public
而不是private
...属性的后备存储通常应为“私有”。
查找所有引用应查明可以直接修改videoID后备存储的位置,而绕开设置程序。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.