¿Cuál es el {obtener; conjunto; } syntax en C #?

Estoy aprendiendo ASP.NET MVC, y puedo leer documentos en inglés, pero realmente no entiendo qué está pasando con este código:

public class Genre { public string Name { get; set; } } 

¿Qué significa esto? { get; set; } { get; set; } { get; set; } ?

Es una propiedad llamada auto, y es esencialmente una forma abreviada de lo siguiente (el comstackdor generará un código similar):

 private string name; public string Name { get { return this.name; } set { this.name = value; } } 

Entonces, según lo entiendo { get; set; } { get; set; } { get; set; } es una “propiedad automática” que, al igual que @Klaus y @Brandon, es una abreviatura para escribir una propiedad con un “campo de respaldo”. Entonces en este caso:

 public class Genre { private string name; // This is the backing field public string Name // This is your property { get => name; set => name = value; } } 

Sin embargo, si eres como yo, hace aproximadamente una hora, no entiendes realmente qué propiedades y accesorios son, y tampoco tienes la mejor comprensión de algunas terminologías básicas. MSDN es una gran herramienta para aprender cosas como esta, pero no siempre es fácil de entender para principiantes. Así que voy a tratar de explicar esto más en profundidad aquí.

get y set son accessors , lo que significa que pueden acceder a datos e información en campos privados (generalmente desde un campo de respaldo ) y generalmente lo hacen desde propiedades públicas (como se puede ver en el ejemplo anterior).

No se puede negar que la statement anterior es bastante confusa, así que veamos algunos ejemplos. Digamos que este código se refiere a los géneros de la música. Entonces dentro de la clase Genre, vamos a querer diferentes géneros de música. Digamos que queremos tener 3 géneros: Hip Hop, Rock y Country. Para hacer esto, usaríamos el nombre de la clase para crear nuevas instancias de esa clase.

 Genre g1 = new Genre(); //Here we're creating a new instance of the class "Genre" //called g1. We'll create as many as we need (3) Genre g2 = new Genre(); Genre g3 = new Genre(); //Note the () following new Genre. I believe that's essential since we're creating a //new instance of a class (Like I said, I'm a beginner so I can't tell you exactly why //it's there but I do know it's essential) 

Ahora que hemos creado las instancias de la clase Genre, podemos establecer los nombres de género usando la propiedad ‘Nombre’ que se configuró arriba.

 public string Name //Again, this is the 'Name' property { get; set; } //And this is the shorthand version the process we're doing right now 

Podemos establecer el nombre de ‘g1’ en Hip Hop escribiendo lo siguiente

 g1.Name = "Hip Hop"; 

Lo que está sucediendo aquí es algo complejo. Como dije antes, get y set información de acceso de campos privados a los que de otro modo no podría acceder. get solo puede leer información de ese campo privado y devolverlo. set solo puede escribir información en ese campo privado. Pero al tener una propiedad con get y set podemos hacer ambas funciones. Y escribiendo g1.Name = "Hip Hop"; estamos utilizando específicamente la función de set desde nuestra propiedad Nombre

set usa una variable implícita llamada value . Básicamente, lo que esto significa es que cada vez que ves “valor” dentro del set , se refiere a una variable; la variable “valor”. Cuando escribimos g1.Name = estamos usando el = para pasar la variable de value que en este caso es "Hip Hop" . Entonces, esencialmente puedes pensarlo de esta manera:

 public class g1 //We've created an instance of the Genre Class called "g1" { private string name; public string Name { get => name; set => name = "Hip Hop"; //instead of 'value', "Hip Hop" is written because //'value' in 'g1' was set to "Hip Hop" by previously //writing 'g1.Name = "Hip Hop"' } } 

Es importante tener en cuenta que el ejemplo anterior no está realmente escrito en el código. Es más un código hipotético que representa lo que sucede en segundo plano.

Ahora que hemos establecido el nombre de la instancia g1 de Genre , creo que podemos obtener el nombre escribiendo

 console.WriteLine (g1.Name); //This uses the 'get' function from our 'Name' Property //and returns the field 'name' which we just set to //"Hip Hop" 

y si ejecutamos esto tendremos "Hip Hop" en nuestra consola.

Entonces para el propósito de esta explicación, completaré el ejemplo con salidas también

 using System; public class Genre { public string Name { get; set; } } public class MainClass { public static void Main() { Genre g1 = new Genre(); Genre g2 = new Genre(); Genre g3 = new Genre(); g1.Name = "Hip Hop"; g2.Name = "Rock"; g3.Name = "Country"; Console.WriteLine ("Genres: {0}, {1}, {2}", g1.Name, g2.Name, g3.Name); } } 

Salida:

 "Genres: Hip Hop, Rock, Country" 

Esas son propiedades automáticas

Básicamente, otra forma de escribir una propiedad con un campo de respaldo.

 public class Genre { private string _name; public string Name { get => _name; set => _name = value; } } 

Esta es la forma corta de hacer esto:

 public class Genre { private string _name; public string Name { get => _name; set => _name = value; } } 

Es un atajo para exponer a los miembros de datos como públicos, de modo que no es necesario crear explícitamente un miembro de datos privados. C # will crea un miembro de datos privados para usted.

Simplemente podría hacer que sus miembros de datos sean públicos sin usar este acceso directo, pero si decidiera cambiar la implementación del miembro de datos para tener cierta lógica, entonces necesitaría romper la interfaz. En resumen, es un atajo para crear un código más flexible.

Básicamente es un atajo de:

 class Genre{ private string genre; public void getGenre() { return this.genre; } public void setGenre(string theGenre) { this.genre = theGenre; } } //In Main method genre g1 = new Genre(); g1.setGenre("Female"); g1.getGenre(); //Female 

Es una propiedad implementada automáticamente para C #.

Son los descriptores de acceso para el nombre de la propiedad pública.

Los usarías para obtener / establecer el valor de esa propiedad en una instancia de Género.

Esa es una Propiedad Auto Implementada. Básicamente es una forma abreviada de crear propiedades para una clase en C #, sin tener que definir variables privadas para ellos. Normalmente se usan cuando no se requiere una lógica adicional al obtener o establecer el valor de una variable.

Puede leer más en la Guía de progtwigción de propiedades implementadas automáticamente de MSDN.

Esto significa que si crea una variable de tipo Género, podrá acceder a la variable como una propiedad

 Genre oG = new Genre(); oG.Name = "Test"; 

Tal { get; set; } { get; set; } { get; set; } syntax se llama propiedades automáticas, syntax C # 3.0

Debe usar Visual C # 2008 / csc v3.5 o superior para comstackr. Pero puede comstackr un producto que tenga objectives tan bajos como .NET Framework 2.0 (no se necesita tiempo de ejecución ni clases para admitir esta característica).

  • El patrón get / set proporciona una estructura que permite que se agregue lógica durante la configuración (‘set’) o la recuperación (‘get’) de una instancia de propiedad de una clase instanciada, lo que puede ser útil cuando se requiere alguna lógica de instanciación para el propiedad.

  • Una propiedad puede tener un descriptor de acceso ‘get’ solamente, que se hace para que esa propiedad sea de solo lectura

  • Al implementar un patrón get / set, se usa una variable intermedia como contenedor en el que se puede colocar un valor y extraerse un valor. La variable intermedia usualmente está prefijada con un guión bajo. esta variable intermedia es privada para garantizar que solo se pueda acceder a través de sus llamadas de obtención / establecimiento. Vea la respuesta de Brandon, ya que su respuesta demuestra las convenciones de syntax más comúnmente utilizadas para implementar get / set.

En Visual Studio, si define una propiedad X en una clase y desea usar esta clase solo como un tipo, después de construir su proyecto obtendrá una advertencia que dice “El campo X nunca se asigna, y siempre tendrá su valor predeterminado “ .

Al agregar un { get; set; } { get; set; } { get; set; } a la propiedad X , no recibirá esta advertencia.

Además en Visual Studio 2013 y versiones superiores, al agregar { get; set; } { get; set; } { get; set; } usted puede ver todas las referencias a esa propiedad.

enter image description here

Get set son modificadores de acceso a la propiedad. Obtenga el campo de propiedad. Set establece el valor de la propiedad. Get es como acceso de solo lectura. Establecer es como acceso de solo escritura. Para usar la propiedad como lectura, se deben usar tanto get como set.

Get se invoca cuando la propiedad aparece en el lado derecho (RHS) El conjunto se invoca cuando la propiedad aparece en el lado izquierdo (LHS) del símbolo ‘=’

Para una propiedad implementada automáticamente, el campo de respaldo funciona detrás de la escena y no es visible.

Ejemplo:

 public string Log { get; set; } 

Mientras que para una propiedad no implementada automáticamente, el campo de respaldo es inicial, visible como una variable de ámbito privado.

Ejemplo:

 private string log; public string Log { get => log; set => log = value; } 

Además, vale la pena señalar aquí es que ‘getter’ y ‘setter’ pueden usar el diferente ‘campo de respaldo’