.NET属性值变更时set方法易被忽略的if判断

来源:互联网 发布:软件测试地位 编辑:程序博客网 时间:2024/06/07 18:21
BODY, P, TD { font-family: Verdana, Arial, Helvetica, sans-serif; font-size: 9pt }H2,H3,H4,H5 { color: #0000FF; font-weight: bold; }H2 { font-size: 13pt; }H3 { font-size: 12pt; }H4 { font-size: 10pt; color: black; }PRE { BACKGROUND-COLOR: #FBEDBB; FONT-FAMILY: "Courier New", Courier, mono; WHITE-SPACE: pre; }CODE { COLOR: #990000; FONT-FAMILY: "Courier New", Courier, mono; } (原创文章·转载请注明来源:http://blog.csdn.net/hulihui)

名著《C#设计模式》第9章“观察者模式”涉及了标准的事件处理流程,作者在探讨属性值变更时给出一个如下示例代码(P73-74):
pulbic abstract class TpeakFunction
{
private double _tPeak;
public event EventHandler Change;
....
public double Tpeak
{
get{ return _tPeak; }
set
{
_tPeak = value; // 直接给值
if(Change != null) // 非空调用事件处理方法
{
Change(this, EventArgs.Empty);
}
}
}
}
在上述代码的set方法中,不管是否修改了当前的_tPeak值,都将引发Change事件(如果事件处理方法非空)。一般而言,只有修改了当前值才需要引发属性值变更通知事件。好的set方法编码习惯是:先判断值是否改变,即使没有事件通知调用。修改上述set方法如下:
set
{
if(_tPeak != value) // 先判断值是否改变
{
_tPeak = value;
if(Change != null)
{
Change(this, EventArgs.Empty);
}
}
}
效率上看,虽然增加了一个if判断,但事件处理或赋值语句的代价一般而言更高。

另一个问题就是,创建对象时如何获得初始值的变更通知?一个解决方法是:在类的构造函数中调用Change()事件。
原创粉丝点击