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

Mhd*_*wan 21 c# properties automatic-properties c#-3.0

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

public float inverseMass
{
    get;
    set
    {
        onMassChanged();
        inverseMass = value;
    }
}
Run Code Online (Sandbox Code Playgroud)

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

Gar*_*ary 26

如果您提供自己的get/set,那么您需要为变量提供自己的存储空间.

private float _inverseMass;

public float inverseMass
{
    get { return _inverseMass; }
    set
    {
        _inverseMass = value;
        onMassChanged();
    }
}
Run Code Online (Sandbox Code Playgroud)

  • 这真遗憾.很高兴使用某种常见的预定义词,如`value`而不是创建自动属性. (6认同)

Uwe*_*eim 8

改为使用支持字段:

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

private float _inverseMass;
Run Code Online (Sandbox Code Playgroud)

我曾经读到某个地方,C#家伙决定用这些自动属性覆盖广泛的使用场景,但对于特殊情况,你必须回到良好的旧支持领域.

(说实话,我相信Jon Skeet告诉他们如何实施它们)


Eup*_*ric 6

在 C# 中你不能这样做。

它可以是自动属性,也可以是带有支持字段的属性。


Bra*_*tie 5

您需要将以上内容分为私人/公共成员,这样您就不会遇到递归问题:

private float _inverseMass;
public float inverseMass
{
  get { return this._inverseMass; }
  set { this._inverseMass = value; onMassChanged(); }
}
Run Code Online (Sandbox Code Playgroud)

但是,您是否已查看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"); }
  }
}
Run Code Online (Sandbox Code Playgroud)