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
    }
}

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.


39

Możesz spróbować czegoś takiego:

public string Name { get; private set; }
public void SetName(string value)
{
    DoSomething();
    this.Name = value;
}

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.


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;
    }
}

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.

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.