Добытчик без тела, сеттер с


У меня есть свойство, которое в данный момент является автоматическим.

public string MyProperty { get; set; }
Однако теперь мне нужно, чтобы он выполнял какое-то действие каждый раз, когда он меняется, поэтому я хочу добавить логику в сеттер. Поэтому я хочу сделать что-то вроде:
public string MyProperty {
    get;
    set { PerformSomeAction(); }
}

Однако это не создает... MyProperty.get' must declare a body because it is not marked abstract, extern, or partial

Я не могу просто вернуть геттер MyProperty, так как это вызовет бесконечный цикл.

Есть ли способ сделать это, или мне нужно объявить частную переменную для ссылки? Я бы предпочел не так, как MyProperty используется до конца код как в этом классе, так и вне его

5 9

5 ответов:

Необходимо использовать свойство с резервным полем:

private string mMyProperty;
public string MyProperty
{
    get { return mMyProperty; }
    set
    {
        mMyProperty = value;
        PerformSomeAction();
    }
}

Вы не можете реализовать одно без другого, так как при использовании одного это относится к (скрытому) резервному полю, которое автоматически генерируется в случае автогенерированного свойства. Однако, когда вы реализуете один, вы должны установить это резервное поле в обоих направлениях.

Авто-путь - это просто ярлык для этого:

private string _property;
public string MyProperty
{
    get { return _property; }
    set { _property = value; }
}

Итак, если вы опустите скрытое поле в одном из методов (это то, что геттеры и сеттеры на самом деле), как этот метод должен знать, как хранить/получать значение?

Вам нужно либо предоставить тело как для добытчика, так и для сеттера, либо ни для того, ни для другого.

Таким образом, если вы определяете любой из них, он больше не является свойством auto.

Итак, вы должны сделать:

Либо

public string MyProperty {
    get;
    set;
}// Automatic property, no implementation

Или

public string MyProperty
{
    get { return mMyProperty; }
    set
    {
        mMyProperty = value;
        PerformSomeAction();
    }
}

Если вы делаете что-то в сеттере, то вам придется явно объявить переменную. Например,

private string _myProperty;
public string MyProperty {
    get { return _myProperty; };
    set 
    {
        _myProperty = value; 
        PerformSomeAction(); 
    }
}

Или - в сеттере вы можете передать значение функции и делать там то, что вы хотите... предположим, вы хотите изменить / проверить значение в функции PerformSomeAction()

Это похоже на вопрос C# getter и setter shorthand.

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