Właściwości C #: jak używać właściwości zestawu niestandardowego bez pola prywatnego?

97

Chce to zrobić:

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

Czy można użyć automatycznie generowanego pola prywatnego?
Czy jest wymagane, żebym to zaimplementował w ten sposób:

private string name;
public string Name
{
    get
    {
        return name;
    }
    set
    {
        dosomething();
        name = value
    }
}
Peterdk
źródło
2
Jest wiele dobrych dyskusji na ten temat pod tym pytaniem SO: stackoverflow.com/questions/1277018/…
David Hall

Odpowiedzi:

106

Gdy zechcesz zrobić cokolwiek niestandardowego w programie pobierającym lub ustawiającym, nie możesz już używać właściwości automatycznych.

Rozbite szkło
źródło
39

Możesz spróbować czegoś takiego:

public string Name { get; private set; }
public void SetName(string value)
{
    DoSomething();
    this.Name = value;
}
Artur Brutjan
źródło
6
+1 Moim zdaniem ta odpowiedź karci zaakceptowaną odpowiedź. Używa właściwości automatycznych. Jawnie ustawia ustawiającego na prywatny. Jest to dobra rzecz, ponieważ pozwala użytkownikowi końcowemu lub deweloperowi wiedzieć, że prawdopodobnie za metodą ustawiającą dzieje się więcej.
ooXei1sh
Jaka jest różnica między tym a brakiem ustawienia w ogóle?
Sidhin S Thomas
3
@SidhinSThomas nie podając a private setuniemożliwiłoby ustawienie właściwości przez elementy członkowskie jego klasy; byłby tylko do odczytu. Byłbyś w stanie ustawić jego dane tylko w konstruktorze.
Bondolin
16

To jest niemożliwe. Właściwości zaimplementowane automatycznie lub kod niestandardowy.

Femaref
źródło
11

Począwszy od C # 7, można użyć definicji treści wyrażeń dla właściwości geti metod setdostępu.

Zobacz więcej tutaj

private string _name;

public string Name
{
    get => _name;
    set
    {
        DoSomething();
        _name = value;
    }
}
Colin Banbury
źródło
4
Jednak nadal korzystam z prywatnego pola. Naprawdę nie pomaga OP.
TSmith
Chociaż to działa, to tak, jak mówi @TSmith, nie tego chce OP.
M. Ruiz
8

Wymagane jest, abyś wdrożył go w pełni, biorąc pod uwagę swój scenariusz. Obie geti setmuszą być zaimplementowane automatycznie lub w pełni zaimplementowane razem, a nie ich kombinacja.

Jeff Yates
źródło