2012-01-03 10 views
15

Quiero utilizar propiedades implementadas automáticamente, pero al mismo tiempo quiero llamar a un método cada vez que se cambia la propiedad.cómo anular el conjunto en C# de propiedades automáticas

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

¿El código anterior hace una llamada recursiva al establecimiento? Si lo hace, ¿cómo implementar esto?

+6

No puede hacer eso en C#. Tienes que usar un campo de respaldo. –

+2

La respuesta es SÍ ... crearía un bucle continuo. –

+2

@UweKeim, esa debería ser una respuesta. – driis

Respuesta

22

Si proporciona su propio get/set, entonces necesita proporcionar su propio almacenamiento para la variable.

private float _inverseMass; 

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

Es una pena. Sería bueno usar algún tipo de palabra predefinida común como 'valor' en lugar de crear propiedad automática. –

4

No se puede hacer eso en C#.

Es propiedad o propiedad automática con campo de respaldo.

8

utiliza un campo de respaldo en su lugar:

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

private float _inverseMass; 

una vez que leí en alguna parte que los de C# chicos decidieron que querían cubrir el amplio de los escenarios de uso con esas propiedades automáticas, pero para casos especiales hay que ir volver a buenos viejos campos de respaldo.

(Para ser honesto, creo que Jon Skeet les dijo cómo ponerlas en práctica)

4

Usted tendría que romper el anterior en que los miembros privados/públicos para que no se obtiene problemas recurrentes:

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

Sin embargo, ¿has mirado en la interfaz INotifyPropertyChanged? Hace más o menos lo que estás buscando, y dependiendo de lo que estés escribiendo, podría ser compatible de forma nativa.

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

Eso no se compila, por lo que es difícil decir si es recursivo o no.

No puede especificar solo una parte de una propiedad automática. Usted tendrá que utilizar un campo de respaldo en este caso:

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

embargo, un marco de programación orientado a aspectado como PostSharp puede ser capaz de ayudarle con esto.

0

Utilice una variable privada como su campo de respaldo para la propiedad pública.

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

¿Qué estás tratando de decir aquí? Esta respuesta no compila. – vcsjones

1

Las respuestas correctas se han dado anteriormente, pero en caso de que querían hacer esto de manera rápida en Visual Studio, se pueden utilizar fragmentos de código en lugar de generar la propiedad para usted.

tener una lectura de este artículo que debe explicarlo un poco mejor: http://www.roelvanlisdonk.nl/?p=1007

Si lo desea, puede incluso crear su propio fragmento de código para agregar el código repetitivo. Incluso podría usarlo para generar rápidamente la implementación INotifyPropertyChanged como se mencionó anteriormente.

Cuestiones relacionadas