Propiedades de C #: ¿cómo usar la propiedad de conjunto personalizado sin un campo privado?

93

Quiero hacer esto:

public Name
{
    get;
    set
    {
        dosomething();
        ??? = value
    }
}

¿Es posible utilizar el campo privado generado automáticamente?
O es necesario que lo implemente de esta manera:

private string name;
public string Name
{
    get
    {
        return name;
    }
    set
    {
        dosomething();
        name = value
    }
}
Peterdk
fuente
2
Hay mucha discusión sobre esto en esta pregunta SO: stackoverflow.com/questions/1277018/…
David Hall

Respuestas:

102

Una vez que desee hacer algo personalizado en el getter o el setter, ya no puede usar propiedades automáticas.

Vidrio roto
fuente
37

Puedes probar algo como esto:

public string Name { get; private set; }
public void SetName(string value)
{
    DoSomething();
    this.Name = value;
}
Artur Brutjan
fuente
6
+1 En mi opinión, esta respuesta reprende la respuesta aceptada. Está usando propiedades automáticas. Establece explícitamente setter en privado. Esto es bueno porque le permite al usuario final o al desarrollador saber que es probable que haya más cosas detrás del método de establecimiento.
ooXei1sh
¿Cuál es la diferencia entre esto y no haber establecido nada?
Sidhin S Thomas
3
@SidhinSThomas no proporcionar un private setevitaría que los miembros de su clase establezcan la propiedad; sería estrictamente de solo lectura. Solo podrá establecer sus datos en el constructor.
Bondolin
15

Esto no es posible. Propiedades implementadas automáticamente o código personalizado.

Femaref
fuente
11

A partir de C # 7, puede usar definiciones de cuerpo de expresión para la propiedad gety los setdescriptores de acceso.

Ver más aquí

private string _name;

public string Name
{
    get => _name;
    set
    {
        DoSomething();
        _name = value;
    }
}
Colin Banbury
fuente
4
Sin embargo, sigo usando un campo privado. Realmente no ayuda al OP.
TSmith
Si bien esto funciona, es como dice @TSmith, no es lo que quiere el OP.
M. Ruiz
7

Es necesario que lo implementes por completo dado tu escenario. Ambos gety setdeben implementarse automáticamente o implementarse completamente juntos, no una combinación de los dos.

Jeff Yates
fuente