Властивості C #: як використовувати властивість користувацького набору без приватного поля?


93

Я хочу зробити це:

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

Чи можна використовувати автоматично сформоване приватне поле?
Або потрібно, щоб я реалізував це таким чином:

private string name;
public string Name
{
    get
    {
        return name;
    }
    set
    {
        dosomething();
        name = value
    }
}

2
Є багато хороших дискусій з цього приводу щодо цього SO-питання: stackoverflow.com/questions/1277018/…
Девід Холл,

Відповіді:


102

Як тільки ви захочете зробити що-небудь на замовлення як у геттері, так і в сеттері, ви більше не зможете використовувати автоматичні властивості.


37

Ви можете спробувати щось подібне:

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

6
+1 На мою думку, ця відповідь докоряє прийнятій відповіді. Він використовує автоматичні властивості. Він явно встановлює сеттер як приватний. Це добре, оскільки це дає змогу кінцевому користувачеві або розробнику знати, що за методом сеттера, швидше за все, відбувається більше.
ooXei1sh

Яка різниця між цим і відсутністю набору?
Sidhin S Thomas

3
@SidhinSThomas, не надавши a private set, перешкоджатиме встановленню властивості членами його класу; це буде строго лише для читання. Ви зможете встановити його дані лише в конструкторі.
Бондолін

15

Це неможливо. Або автоматично реалізовані властивості, або власний код.


11

Починаючи з C # 7, ви можете використовувати визначення тіла виразу для властивості getта setаксесуарів.

Дивіться більше тут

private string _name;

public string Name
{
    get => _name;
    set
    {
        DoSomething();
        _name = value;
    }
}

4
Проте все ще використовую приватне поле. Не дуже допомагає ОП.
TSmith

Хоча це працює, це схоже на те, що каже @TSmith, це не те, що хоче OP.
М. Руїс

7

Потрібно, щоб ви його повністю реалізували, враховуючи ваш сценарій. І те, getі setінше має бути виконано автоматично або повністю реалізовано разом, а не поєднанням обох.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.