2016-09-28 86 views
0

我有2类属性中定义的,如下所示:C#类属性getter调用自动

private static string _validationError; 
    public static string ValidationError 
    { 
     get { 
      var temp = _validationError; 
      _validationError = "abc"; 
      return temp; 
     } 

     set { _validationError = value; } 
    } 

    public static string CurrentError { get; set; } 

的方法:

public static bool IsErrorStringEmpty() 
    { 
     Console.WriteLine("dddd"); 

     return false; 
    } 

测试方法:

[TestMethod] 
    public void ValidationErrorTest() 
    { 
     CurrentError = "My Error"; 

     var empty = IsErrorStringEmpty(); 
    } 

当调试这个测试,这是我看到的行为:

  1. 在测试方法的第二行命中之前,ValidationError = null(Expected)。

    enter image description here

  2. 当它进入IsErrorStringEmpty(),所述第一线被击中之前,ValidationError = NULL(预期)。

    enter image description here

  3. 然后,权当它击中1号线,ValidationError = “ABC”。我不知道这个getter是如何被调用的,尽管我没有直接访问ValidationError属性的明确代码。

    enter image description here

我在吸气断点,但它并没有被打到,并调用堆栈,如下图所示。

enter image description here enter image description here

我敢肯定它的地方,但我似乎无法找到它。任何指针都非常感谢!

+2

在你的getter中放置一个断点,然后在代码中断时查看调用堆栈。 –

+7

您正在调试器中调用getter。请注意'_validationError'。 –

+0

哦,我的!谢谢 :)。 – AngieM

回答

4

您正在调试器中调用getter。当在评估一个属性的时候执行代码以在监视窗口中显示时,它确实正在执行,并带有真正的副作用。

请尝试观看_validationError

吸气剂中的副作用可能导致您进入循环。最好避免它们。

2

与量子效应一样,您可以通过观察来改变结果。看看你在调试什么。您尝试查看ValidationError中的内容,因此您正在调用getter。

您应该在调试器中添加_validationError而不是ValidationError

更好的问题是为什么此属性在第二次代码暂停时未更新。您之前观察过该物业,并且没有在任何地方重置该物业,因此这应该已成为​​。