首页 > 解决方案 > 时间:2018-05-10 标签:c#experiencedchange of value - 当心调试器

问题描述

Visual Studio 2017 上的 C#。

我创建了我的类并实例化了该类的一个对象。在该类中,只有两个私有值字段具有两个用于访问它们的属性和一个私有标志 (bool)。问题是:属性的 set 访问器仅触及他的(仅在逻辑上)相关的字段和标志,但在执行时,当我“调用”该属性的 set 访问器时,所有字段都会受到影响。

在我的实现中,我只有一个只有一个按钮的表单:按钮的单击使用他的属性增加了第一个字段的值。

我的代码。

public class DriveMeCrazyClass
{        
    public double _num; // a number
    public double _dou; // his double        
    public bool dou_isValid; // I'll really update the field value only on a request.

    // The idea is: 
    // _num e _dou are related, so when _num changes 
    //    I should calculate the new value for _dou.
    // BUT
    // I prefer to postpone the calculation 
    //    to the moment when I will be asked for the value
    // SO
    // I only "take note" of this fact on the flag dou_isValid

    public DriveMeCrazyClass()
    {
        _num = _dou = 0;
        dou_isValid = true;
    }

    public event EventHandler DMCCchanged;
    public double Num
    {
        get { return _num; }

        set
        {
            if (_num == value) return;
            _num = value;                
            dou_isValid = false;                

            DMCCchanged?.Invoke(this, EventArgs.Empty);
        }
    }

    public double Dou
    {
        get
        {
            if (dou_isValid) return _dou;
            dou_isValid = true;
            DMCCchanged?.Invoke(this, EventArgs.Empty);
            return _dou = 2 * _num;
        }
        set
        {                
            // ..... no matter now
        }
    }
}




public partial class Form1 : Form
{        
    public DriveMeCrazyClass aa = new DriveMeCrazyClass();        

    public Form1()
    {
        InitializeComponent();
    }

    private void Form1_Load(object sender, EventArgs e)
    {
        aa.DMCCchanged += new System.EventHandler(aa_changed);
        lblNum.Text = "0";
        lblDou.Text = "0";

    }

    private void Num_inc_Click(object sender, EventArgs e)
    {
        aa.Num++;
    }

    private void aa_changed(object sender, EventArgs e)
    {
        lblNum.Text = aa._num.ToString();
        lblDou.Text = aa._dou.ToString();
    }
}

这就像编译器调用 Dou 属性的 get 访问器一样。我不知道为什么。优化?或者是什么?真的,我不明白。有谁能够帮我?

*****编辑******

我换了一个新代码,略有改动。_num 和 _dou 现在是公开的,我添加了两个标签来显示它们的值 - 不使用访问器 Num e Dou。

没有调试:它工作得很好!

如果我在 Num.set 上设置一个断点并且我一步一步地继续 - WATCHING Num 和 Dou 值- 那就一团糟!调试器调用访问器 Dou.get 并更新 _dou 值并将标志 dou_isValid 设置为 true。我知道,我处理它。

好的,现在很清楚了!谢谢罗宾,谢谢卡米洛,谢谢大家,真的。

顺便说一句......这个问题是一个更大的问题的一部分,涉及到bindig。我希望现在能够解决主要问题,否则....(这是对您空闲时间的威胁:))

标签: c#properties

解决方案


这就像编译器调用 Dou 属性的 get 访问器一样。我不知道为什么。

不是编译器,而是调试器。当您查看类的属性时,它会获取所有属性的值,然后运行代码。

调试器不运行方法,因此可以使用:

double GetDou()
{
    if (dou_isValid) return _dou;
    dou_isValid = true;
    return _dou = 3 * _num;
}

推荐阅读