web-dev-qa-db-fra.com

Comment remplacer le réglage dans C # de propriétés automatiques

Je souhaite utiliser des propriétés de mise en œuvre automatique, mais dans le même temps, je veux appeler une méthode chaque fois que la propriété est modifiée.

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

Le code précédent fait-il un appel récursif à la propriété? Si c'est le cas, comment implémenter cela?

24
MhdSyrwan

Si vous fournissez votre propre get/Set, vous devez fournir votre propre stockage pour la variable.

private float _inverseMass;

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

Utilisez un champ de support à la place:

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

private float _inverseMass;

Une fois, j'ai lu quelque part que les gars C # ont décidé qu'ils voulaient couvrir le large des scénarios d'utilisation avec ces propriétés automatiques, mais pour des cas particuliers, vous devez retourner à de bons champs de sauvegarde.

(Pour être honnête, je crois que Jon Skeet leur a dit comment les mettre en œuvre

8
Uwe Keim

Vous auriez besoin de casser ce qui précède dans les membres privés/publics afin de ne pas avoir de problèmes récursifs:

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

Cependant, avez-vous regardé dans le INotifyPropertyChanged interface? Il fait à peu près ce que vous recherchez et en fonction de ce que vous écrivez, cela pourrait être soutenu de manière nativement.

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"); }
  }
}
5
Brad Christie

Vous ne pouvez pas faire cela en C #.

Sa propriété automatique ou une propriété avec champ de support.

4
Euphoric

Cela ne compile pas, il est donc difficile de dire si c'est récursif ou non.

Vous ne pouvez spécifier qu'une partie d'une propriété automatique. Vous devrez utiliser un champ de support dans ce cas:

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

Cependant, un cadre de programmation orienté orienté aspecté comme postSharp peut être capable de vous aider avec cela.

1
vcsjones

Les bonnes réponses sont données ci-dessus, mais au cas où vous souhaitiez le faire rapidement dans Visual Studio, vous pouvez utiliser des extraits de code plutôt que pour générer la propriété pour vous.

Enregistrer cet article qui devrait l'expliquer un peu mieux: http://www.roelvanlisdonk.nl/?p=1007

Si vous le souhaitez, vous pouvez même créer votre propre code de code pour ajouter le code répétitif. Vous pouvez même l'utiliser pour générer rapidement la mise en œuvre inotifypropertychanged telle que mentionnée ci-dessus.

1
Richard

Utilisez une variable privée comme champ de sauvegarde pour la propriété publique.

private float inverseMass;

public float InverseMass{

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

}
0
Shyju