2012-01-03 13 views
15

Desidero utilizzare le proprietà implementate automaticamente, ma allo stesso tempo voglio chiamare un metodo ogni volta che la proprietà viene modificata.come eseguire l'override impostato in C# delle proprietà automatiche

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

Il codice precedente effettua una chiamata ricorsiva alla proprietà? Se lo fa, come implementarlo?

+6

Non è possibile farlo in C#. Devi usare un campo di supporto. –

+2

La risposta è SI .... creerebbe un ciclo continuo. –

+2

@UweKeim, quella dovrebbe essere una risposta. – driis

risposta

22

Se si fornisce il proprio get/set, è necessario fornire il proprio spazio di archiviazione per la variabile.

private float _inverseMass; 

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

Questo è un peccato. Sarebbe bello usare un tipo di parola predefinita comune come 'value' invece di creare una proprietà auto. –

4

Non è possibile farlo in C#.

È una proprietà o proprietà automatica con campo di supporto.

8

utilizzare un campo supporto invece:

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

private float _inverseMass; 

Una volta ho letto da qualche parte che i C# ragazzi hanno deciso che volevano coprire l'ampio degli scenari di utilizzo con quelle proprietà automatiche, ma per casi particolari si deve andare torna ai buoni vecchi campi di supporto.

(Per essere onesti, credo che Jon Skeet ha detto loro come realizzarle)

4

Si avrebbe bisogno di rompere il sopra in a soci privati ​​/ pubblici in modo da non avere problemi ricorsivi:

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

Tuttavia, hai guardato all'interfaccia INotifyPropertyChanged? Fa praticamente quello che stai cercando e, a seconda di cosa stai scrivendo, potrebbe essere supportato in modo nativo.

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"); } 
    } 
} 
1

Questo non viene compilato, quindi è difficile dire se è ricorsivo o meno.

Non è possibile specificare solo una parte di una proprietà automatica. Sarà necessario utilizzare un supporto-campo in questo caso:

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

Anche se, un quadro di programmazione in aspetto-oriented come PostSharp può essere in grado di aiutarvi con questo.

0

Utilizzare una variabile privata come campo di backup per la proprietà pubblica.

private float inverseMass; 

public float InverseMass{ 

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

} 
-2
public float inverseMass 
{ 
    get; 
    set 
    { 
     if (inverseMass != value) 
     { 
      inverseMass = value; 
      onMassChanged(); 
     } 
    } 
} 
+0

Cosa stai cercando di dire qui? Questa risposta non viene compilata. – vcsjones

1

Le risposte corrette sono date sopra, ma nel caso in cui si voleva fare in fretta in Visual Studio, è possibile utilizzare frammenti di codice, invece di generare la proprietà per voi.

Avere una lettura di questo articolo che dovrebbe spiegare un po 'meglio: http://www.roelvanlisdonk.nl/?p=1007

Se si desidera, si può anche creare il proprio frammento di codice per aggiungere il codice ripetitivo. Si potrebbe anche usarlo per generare rapidamente l'implementazione di INotifyPropertyChanged come menzionato sopra.