Свойства с #: как использовать свойство настраиваемого набора без частного поля?

96

Я хочу сделать это:

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/…
Дэвид Холл

Ответы:

104

Как только вы захотите сделать что-нибудь особенное в геттере или сеттере, вы больше не сможете использовать свойства auto.

Разбитое стекло
источник
39

Вы можете попробовать что-то вроде этого:

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, предотвратит установку свойства членами его класса; это будет строго только для чтения. Вы сможете установить его данные только в конструкторе.
Bondolin 03
15

Это невозможно. Либо автоматически реализованные свойства, либо пользовательский код.

Femaref
источник
11

Начиная с C # 7, вы можете использовать определения тела выражения для свойств getи методов setдоступа.

Подробнее здесь

private string _name;

public string Name
{
    get => _name;
    set
    {
        DoSomething();
        _name = value;
    }
}
Колин Банбери
источник
4
Тем не менее, все еще использую частное поле. На самом деле не помогает OP.
TSmith
Хотя это работает, похоже, что @TSmith говорит, что это не то, что хочет OP.
М. Руис
7

Требуется, чтобы вы реализовали его полностью с учетом вашего сценария. Оба getи setдолжны быть либо реализованы автоматически, либо полностью реализованы вместе, а не их комбинация.

Джефф Йейтс
источник