visual studio setters property getters generate example automatically automatic and c# properties setter

studio - C#Objeto Setter no llamado cuando miembro se modifica



getters and setters c# visual studio (3)

Tengo la siguiente clase de contenedor:

public class Wrapper { public int Member; }

En una clase separada, tengo lo siguiente:

public class ContainerClass { private Wrapper data; public Wrapper Property { get { return data; } set { data = value; } } public void Foo() { Property.Member = 42; } }

Cuando Property.Member se modifica en Foo() , no ocurre nada (se omite el setter). Sin embargo, aún puedo hacer lo siguiente, por ejemplo:

public void Foo() { Property = Property; }

e ingrese el setter deseado. Entonces mi pregunta es, ¿por qué la modificación del miembro de una propiedad de objeto no llama a esa propiedad?


En el constructor de foo, está configurando el campo de la clase Wrapper.

public void Foo() { Property.Member = 42; // No property set, you are accessing a field. }

En el segundo ejemplo, está configurando una propiedad

public void Foo() { // Setting Property "Property" to the value of "Property" // You should see both the getter and the setter called. Property = Property; }

No sé lo que estás intentando hacer, pero tal vez querías que Wrapper también tuviera una propiedad.

public class Wrapper { private int member; public int Member { get { return data; } set { data = value; } } }

Entonces se llamaría al colocador en Wrapper.Member cuando lo hiciste Property.Member = 42


Porque no está estableciendo el valor de la Property . Su código solo invoca el captador de Property , luego establece el valor del campo Member (que invocaría al colocador de Member si fuera una propiedad, que no es el caso aquí).

Si desea ejecutar el código cuando se configura el Member , debe tener

public class Wrapper { private int member; public int Member { get { return this.member; } set { this.member = value; DoSomething(); } } }

O tal vez una solución más elegante sería usar eventos. La interfaz incorporada INotifyProperyChanged te da una plantilla bastante buena para este tipo de cosas.

using System.ComponentModel; public class Wrapper : INotifyPropertyChanged { public event PropertyChangedEventHandler PropertyChanged; private int member; public int Member { get { return this.member; } set { this.member = value; this.OnPropertyChanged("Member"); } } protected void OnPropertyChanged(string name) { PropertyChangedEventHandler handler = PropertyChanged; if (handler != null) { handler(this, new PropertyChangedEventArgs(name)); } } } public class ContainerClass { private Wrapper data; public Wrapper Property { get { return data; } set { data = value; } } public void Foo() { data.PropertyChanged += data_PropertyChanged; Property.Member = 42; } private void data_PropertyChanged(object sender, PropertyChangedEventArgs e) { if (e.PropertyName == "Member") { DoStuff(); } } }


Porque no estás modificando la referencia. Está modificando el miembro de referencia.

Digamos, por ejemplo, si tuviera que pararte en la esquina de la habitación y decir: "Sostenga esta manzana". Si entro y cambio la manzana con un plátano ... No te cambié, entonces eres feliz. Pero si te cambio con otra persona, te quejas de que te estoy reemplazando.

..que es mi analogía para esto de todos modos.

Además, has prefijado una clase con I ... esto generalmente se usa en interfaces en .NET land ..

EDITAR: Me doy cuenta de que si tuviera que pararte en una esquina sosteniendo un trozo de fruta ... probablemente no te quejas cuando te cambie.