c #: captador / setter

109

Vi algo como lo siguiente en alguna parte y me preguntaba qué significaba. Sé que son captadores y definidores, pero quiero saber por qué el tipo de cadena se define así. Gracias por ayudarme.

public string Type { get; set; }
maya
fuente
4
Esto se llama una propiedad automática, eche un vistazo a esto: msdn.microsoft.com/en-us/library/bb384054.aspx
Allov
Ésta es la definición de una propiedad denominada "Type", cuyo tipo .NET es System.string. No hay nada más que eso.
Jon
2
Creo que podría estar confundiendo el nombre de la propiedad automática con la clase de reflexión System.Type. msdn.microsoft.com/en-us/library/system.type.aspx
eandersson

Respuestas:

178

Esas son propiedades implementadas automáticamente (propiedades automáticas para abreviar).

El compilador generará automáticamente el equivalente de la siguiente implementación simple:

private string _type;

public string Type
{
    get { return _type; }
    set { _type = value; }
}
Justin Niessner
fuente
2
@barlop como alguien que viene de Google, sin idea, ¿qué hay que actualizar? ¿M. Hassans responde lo que quieres decir? Gracias.
Etenosidad
1
@Aethenosity en retrospectiva Creo que está bien ... Estaba pensando en términos de ejemplos de getter setter. El interrogador tiene un caso válido de getter setter que es mucho más sucinto (como una línea / no es necesario un segundo campo). También puede escribir public int b { get { return b * 2; } } ningún segundo campo necesario. Pero creo que cuando tienes al armador con cuerpo, necesitas el segundo campo. Y este muestra a un setter con cuerpo. Aunque hace lo mismo que la línea del interrogador.
barlop
2
@Aethenosity también hay c # 7 por el cual seguro que todavía necesita el segundo campo cuando el establecedor tiene un cuerpo, pero tiene una =>sintaxis y no tiene una palabra clave de retorno. Aunque eso no era lo que tenía en mente. Tenía en mente que el segundo campo era innecesario, aunque desde entonces he descubierto que el segundo campo es necesario a veces. En el ejemplo aquí, el segundo campo no es necesario (porque un establecedor predeterminado sin cuerpo haría esto), pero el respondedor lo estaba poniendo en (cuerpo del establecedor y segundo campo), para explicarle al interrogador cuál es su línea sin el segundo campo estaba haciendo.
barlop
33

Esa es una propiedad automática y es la notación abreviada para esto:

private string type;
public string Type
{
  get { return this.type; }
  set { this.type = value; }
}
Teoman Soygul
fuente
4
... excepto que no se puede acceder al campo de respaldo.
Vlad
7
... por eso se llama campo de respaldo .
Teoman Soygul
5
Sin embargo, debería poder verlo como <Type>k__BackingFieldcon una reflexión.
Vlad
25

En C # 6:

Ahora es posible declarar las propiedades automáticas como un campo:

public string FirstName { get; set; } = "Ropert";

Propiedades automáticas de solo lectura

public string FirstName { get;} = "Ropert";
M. Hassan
fuente
13
public string Type { get; set; } 

No es diferente a hacer

private string _Type;

public string Type
{    
get { return _Type; }
set { _Type = value; }
}
Sabueso de seguridad
fuente
5

Es una propiedad respaldada automáticamente, básicamente equivalente a

private string type;
public string Type
{
   get{ return type; }
   set{ type = value; }
}
Jamiec
fuente
4

Se denominan propiedades automáticas.

http://msdn.microsoft.com/en-us/library/bb384054.aspx

Funcionalmente (y en términos del IL compilado), son las mismas que las propiedades con campos de respaldo.

Jeff
fuente
1
¿Todavía puede hacer referencia al tipo o tipo privado dentro de la clase, o simplemente usa Tipo?
mikey
2
No, PERO puede especificar el modificador para la propiedad auto: public string Type {get; conjunto privado; }
Jeff
En este caso, no podrá acceder a _type.
Sabueso de seguridad
1
Entonces, en ese caso this.Type = "foo"; debería estar bien, pero desde el exterior instance.Type = "foo"; no lo hará .. Estos accesorios automáticos son definitivamente una adición útil al lenguaje. Gracias.
mikey
1

Sé que esta es una pregunta antigua, pero con el lanzamiento de C # 6, ahora puede hacer algo como esto para las propiedades privadas.

public constructor()
{
   myProp = "some value";
}

public string myProp { get; }
Anónimo
fuente
2
puede establecer el valor inicial directamente en C # 6: public string myProp {get; } = "algún valor") sin constructor;
M.Hassan
1

También puede usar una expresión lambda

public string Type
{
    get => _type;
    set => _type = value;
}
Ahmad Aghazadeh
fuente