visual studio setters getters example and c# coding-style accessor automatic-properties

studio - C#Custom getter/setter sin variable privada



getters and setters c# visual studio (3)

Aprendí c # recientemente, así que cuando aprendí a escribir propiedades, me enseñaron a hacerlo así:

public string Name { get; set; }

¡Las propiedades automáticas son geniales! Pero ahora estoy tratando de hacer algo un poco más complicado, así que necesito escribir un par de accesores personalizados.

private string _Name; public string Name { get { return _Name; } set { _Name = value } }

Sé que el compilador crea una variable de instancia privada en sus oscuras profundidades cuando uno usa autos, pero estoy arruinado y no quiero que esa variable privada se quede sin sentido.

¿Hay alguna forma de usar accesores personalizados sin una variable privada?


Las propiedades no necesitan variables de respaldo (campos) en absoluto. Si bien pueden usarse para encapsular campos simples, también puede usarlos para acceder a otros datos.

public Decimal GrandTotal { get { return FreightTotal + TaxTotal + LineTotal; } }

o

public string SomeStatus { get { return SomeMethodCall(); } }

Si el objetivo es simplemente encapsular algún campo con una propiedad, necesitaría algún tipo de campo de respaldo si no está utilizando propiedades automáticas.


No, me temo que no. El compilador es lo suficientemente inteligente como para hacer que esto suceda por ti en las propiedades generadas automáticamente, pero con las propiedades estándar, me imagino que la lógica detrás de algo como eso terminaría interfiriendo y haciendo más daño que bien.

Por ejemplo, ¿qué pasa si creo una propiedad como esta ...

public int SomeValue { get { return 0; } }

¿El compilador (con la característica que está buscando) creará una variable privada de respaldo? ¿Por qué? No necesita uno.

Además, si el valor privado no se crea hasta el momento de la compilación, ¿qué va a hacer referencia en su código:

public string Name { get { return _Name; } set { _Name = value } }

¿Qué es _Name ? ¿Qué pasa si tienes otro valor en otro lugar llamado _Name ? Entonces, ¿cómo llamaría el compilador el valor de respaldo para esta propiedad? ¿Qué pasa si necesito dos valores de respaldo? ¿Sería el compilador lo suficientemente inteligente para eso?

public string Name { get { return string.Format("{0} {1}", _FirstName, _LastName); } set { // some parsing magic } }

Se ha preguntado antes, pero me imagino que la respuesta seguirá siendo "no" en el futuro previsible.

Una propiedad automática es una taquigrafía sintáctica para un acceso directo simple a los miembros. (Y me imagino que uno de sus impulsores fue simplemente intentar que las personas dejen de crear valores public directamente). Las propiedades pueden crecer en complejidad más allá de eso muy fácilmente y personalmente no querría que el compilador intente averiguar lo que puedo Fácilmente simplemente dile que haga.


La respuesta es No, no puedes hacer eso . Es a causa de la recursividad. (Ver los números de línea 9 y 7):

Line 1 : public string Name Line 2 : { Line 3 : get Line 4 : { Line 5 : return FirstName + " " + LastName; Line 6 : } Line 7 : set Line 8 : { Line 9 : Name = value; // <-- Goes back to Line 7 Line 10 : } Line 11 : }