Propriedades C #: como usar a propriedade do conjunto personalizado sem campo privado?

93

Eu quero fazer isso:

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

É possível usar o campo privado gerado automaticamente?
Ou é necessário que eu implemente desta forma:

private string name;
public string Name
{
    get
    {
        return name;
    }
    set
    {
        dosomething();
        name = value
    }
}
Peterdk
fonte
2
Há muitas boas discussões sobre isso nesta questão do SO: stackoverflow.com/questions/1277018/…
David Hall

Respostas:

102

Uma vez que você deseja fazer qualquer coisa personalizada no getter ou no setter, você não pode mais usar as propriedades automáticas.

Vidro quebrado
fonte
37

Você pode tentar algo assim:

public string Name { get; private set; }
public void SetName(string value)
{
    DoSomething();
    this.Name = value;
}
Artur Brutjan
fonte
6
1 Em minha opinião, esta resposta repreende a resposta aceita. Ele está usando propriedades automáticas. Ele define explicitamente setter como privado. Isso é bom porque permite ao usuário final ou desenvolvedor saber que provavelmente há mais coisas acontecendo por trás do método setter.
ooXei1sh
Qual é a diferença entre isso e não ter definido nada?
Sidhin S Thomas
3
@SidhinSThomas não fornecer um private setevitaria que a propriedade fosse definida pelos membros de sua classe; seria estritamente somente leitura. Você só poderá definir seus dados no construtor.
Bondolin
15

Isso não é possível. Propriedades implementadas automaticamente ou código personalizado.

Femaref
fonte
11

A partir do C # 7, você pode usar definições de corpo de expressão para a propriedade gete os setacessadores.

Veja mais aqui

private string _name;

public string Name
{
    get => _name;
    set
    {
        DoSomething();
        _name = value;
    }
}
Colin Banbury
fonte
4
Ainda usando um campo privado. Realmente não ajuda o OP.
TSmith
Enquanto isso funciona, é como diz @TSmith, não é o que o OP deseja.
M. Ruiz
7

É necessário que você o implemente de acordo com o seu cenário. Ambos gete setdevem ser implementados automaticamente ou totalmente implementados juntos, não uma combinação dos dois.

Jeff Yates
fonte