Pregunta ¿Las propiedades de C # son realmente métodos?


Hasta ahora, tenía la impresión de que Properties & Methods son dos cosas diferentes en C #. Pero luego hice algo como a continuación.

enter image description here

y este fue un "Abridor de ojos" para mí. Esperaba una propiedad stringProp y un método stringProp pero en cambio tengo esto.

¿Por qué sucedió esto? alguien puede explicar por favor


74
2018-04-16 07:23


origen


Respuestas:


Sí, el compilador genera un par de métodos get y set para una propiedad, más un campo de respaldo privado para una propiedad implementada automáticamente.

public int Age {get; set;}

se convierte en el equivalente de:

private int <Age>k__BackingField;

public int get_Age()
{
     return <Age>k__BackingField;
}

public void set_Age(int age)
{
    <Age>k__BackingField = age;
}

El código que accede a su propiedad se compilará para llamar a uno de estos dos métodos. Esta es exactamente una de las razones por las que cambiar un campo público por ser una propiedad pública es un cambio radical.

Ver Jon Skeet's Por qué las propiedades importan.


107
2018-04-16 07:26



Estrictamente hablando, las propiedades no son métodos, aunque son de hecho es compatible con los métodos getter y setter (también llamados accessors). Cuando escribe código como este (siempre que modifique el código para eliminar el error de compilación que se menciona a continuación)

myFoo.stringProp = "bar";

El compilador realmente genera código IL como este:

ldstr       "bar"
callvirt    foo.set_stringProp

Dónde set_stringProp es el método setter para esa propiedad. De hecho, si así lo desea, puede invocar estos métodos directamente a través de la reflexión.

Sin embargo, la muestra del código que publicó puede verse bien en intellisense de Visual Studio, pero no se compilará. Intenta construir el proyecto y verás un error como:

El tipo 'foo' ya contiene una definición para 'stringProp'


24
2018-04-16 07:29



Este es un problema visual de intelicencia en el estudio, que elige por nombre. Por cierto, su código no se compilará, debido a la colisión del nombre en el mismo tipo.

Pero tienes razón, esas propiedades son métodos al final:

public class A {

   public string Name  {get;set;}  
}

aquí Name la propiedad se convierte en 2 métodos: get_Name() y set_Name().

De hecho, si defines una clase como esta:

public class A {

   public string Name  {get;set;}  

   public string get_Name() {
       return "aaa"; 
   }
}

obtendrá un error de compilación, ya que ya está definido get_Name (propiedad)


18
2018-04-16 07:28



Sí. Las propiedades son mutator métodos.

En informática, un método de mutador es un método utilizado para controlar los cambios en una variable. También son ampliamente conocidos como métodos setter. A menudo, un colocador se acompaña de un getter (también conocido como un descriptor de acceso), que devuelve el valor de la variable miembro privada.

El método del mutador se usa con mayor frecuencia en la programación orientada a objetos, de acuerdo con el principio de encapsulación. De acuerdo con este principio, las variables miembro de una clase se hacen privadas para ocultarlas y protegerlas de otros códigos, y solo pueden ser modificadas por una función miembro pública (el método mutador), que toma el nuevo valor deseado como parámetro, opcionalmente valida y modifica la variable de miembro privado.

Los métodos de mutación también se pueden usar en entornos no orientados a objetos. En este caso, una referencia a la variable que se va a modificar se pasa al mutador, junto con el nuevo valor. En este escenario, el compilador no puede restringir el código de eludir el método del mutador y cambiar la variable directamente. La responsabilidad recae en los desarrolladores para garantizar que la variable solo se modifique a través del método del mutador y no se modifique directamente.

En los lenguajes de programación que los admiten, las propiedades ofrecen una alternativa conveniente sin renunciar a la utilidad de la encapsulación.

Referencia: http://en.wikipedia.org/wiki/Mutator_method


-1
2018-04-23 14:14