c# - 时间: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。我希望现在能够解决主要问题,否则....(这是对您空闲时间的威胁:))
解决方案
这就像编译器调用 Dou 属性的 get 访问器一样。我不知道为什么。
不是编译器,而是调试器。当您查看类的属性时,它会获取所有属性的值,然后运行代码。
调试器不运行方法,因此可以使用:
double GetDou()
{
if (dou_isValid) return _dou;
dou_isValid = true;
return _dou = 3 * _num;
}
推荐阅读
- powershell - 字符串上的百分比比较运算符
- java - 如何在非 Spring Boot 应用程序中设置 Prometheus 端点
- c++ - QT_VERSION 不正确?
- r - 如何将因子转换为数字
- java - 部署到不同机器时如何使用 selenium/standalone-chrome?
- android - PreferenceFragmentCompant 在 rootKey 上的 onCreatePreferences 中显示 null
- perl - Net::SSH::Perl:收到断开连接消息:用户名身份验证失败太多
- reactjs - 在redux中API调用成功后调用另一个动作?
- networking - NS2中的Linux TCP拥塞控制算法
- r - 在R中一次替换矩阵中的多个值