繁体   English   中英

在内存中更改属性的值而不会触及设置器

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM