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


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

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


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должны быть либо реализованы автоматически, либо полностью реализованы вместе, а не их комбинация.

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.