如何覆盖C#自动属性中的set

时间:2012-01-03 20:05:34

标签: c# c#-3.0 properties automatic-properties

我想使用自动实现的属性,但同时我想在每次更改属性时调用方法。

public float inverseMass
{
    get;
    set
    {
        onMassChanged();
        inverseMass = value;
    }
}

以前的代码是否对属性进行了递归调用?如果是的话,如何实现呢?

5 个答案:

答案 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();
        }
    }
}