我想使用自动实现的属性,但同时我想在每次更改属性时调用方法。
public float inverseMass
{
get;
set
{
onMassChanged();
inverseMass = value;
}
}
以前的代码是否对属性进行了递归调用?如果是的话,如何实现呢?
答案 0 :(得分:24)
如果您提供自己的get / set,那么您需要为变量提供自己的存储空间。
private float _inverseMass;
public float inverseMass
{
get { return _inverseMass; }
set
{
_inverseMass = value;
onMassChanged();
}
}
答案 1 :(得分:5)
您需要将上述内容分解为私人/公共成员,以免出现递归问题:
private float _inverseMass;
public float inverseMass
{
get { return this._inverseMass; }
set { this._inverseMass = value; onMassChanged(); }
}
但是,您是否查看了INotifyPropertyChanged
界面?它几乎可以满足您的需求,并且根据您正在编写的内容,可以在本地支持它。
public class MyClass : INotifyPropertyChanged
{
public event PropertyChangedEventHandler PropertyChanged;
private void NotifyPropertyChanged(String property)
{
var event = this.PropertyChanged;
if (event != null)
{
event(this, new PropertyChangedEventArgs(property));
}
}
private float _inverseMass;
public float inverseMass
{
get { return this._inverseMass; }
set { this._inverseMass = value; NotifyPropertyChanged("inverseMass"); }
}
}
答案 2 :(得分:4)
你不能用C#做到这一点。
其自动属性或具有支持字段的属性。
答案 3 :(得分:1)
那不编译,所以很难说它是否是递归的。
您不能仅指定自动属性的一部分。在这种情况下,您将需要使用后备字段:
private float _inverseMass;
public float inverseMass
{
get { return _inverseMass; }
set
{
onMassChanged();
_inverseMass = value;
}
}
尽管如此,像PostSharp这样的面向预期的编程框架可能能够为您提供帮助。
答案 4 :(得分:-3)
public float inverseMass
{
get;
set
{
if (inverseMass != value)
{
inverseMass = value;
onMassChanged();
}
}
}