我的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是自动属性,也会出现此问题。所以我无法合理地接受它与我的例子中的支持字段有关。
答案 0 :(得分:0)
如果您使用的是Visual Studio,请单击videoID上的光标(后备存储小写版本)和“查找所有引用”。您的示例代码不包含videoID的定义,但我怀疑它是public
而不是private
...属性的后备存储通常应该是“私有”。
查找所有引用应该精确定位可以直接修改videoID后备存储的位置,绕过你的setter。