属性的值在内存中被更改而不会触及setter

时间:2013-10-04 14:47:24

标签: c# wpf

我的List<T>类型为VideoVideo类类似于以下内容:

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。单步前进一次,该值已“神奇地”更改为始终158VideoID.set处的断点永远不会被击中。

在没有调试器到达断点的情况下,可以以什么方式操作对象的值?我的猜测是反思 - 我正在使用它(fastJSON)进行反序列化。

感谢你提出的任何想法。

编辑

(1)私人字段videoID仅在Video

的获取和设置中的VideoID类中引用

(2)我拥有的另一个嫌疑人是另一个线程中的某些东西,这可能是为什么它在视图加载后似乎发生在某个持续时间,而不一定是中的任何一致点代码base.MeasureOverride() [对我而言]是一项耗时的功能,暗示我可能无法接近这个错误的来源。

(3)我还想补充说,即使VideoID是自动属性,也会出现此问题。所以我无法合理地接受它与我的例子中的支持字段有关。

1 个答案:

答案 0 :(得分:0)

如果您使用的是Visual Studio,请单击videoID上的光标(后备存储小写版本)和“查找所有引用”。您的示例代码不包含videoID的定义,但我怀疑它是public而不是private ...属性的后备存储通常应该是“私有”。

查找所有引用应该精确定位可以直接修改videoID后备存储的位置,绕过你的setter。