Геттер без тела, Сеттер с
У меня есть свойство, которое в настоящее время является автоматическим.
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 ответов
Вам нужно использовать свойство с полем поддержки:
private string mMyProperty;
public string MyProperty
{
get { return mMyProperty; }
set
{
mMyProperty = value;
PerformSomeAction();
}
}
Вы не можете реализовать одно без другого, так как при использовании того, что оно ссылается на (скрытое) фоновое поле, которое генерируется автоматически в случае автоматически сгенерированного свойства. Однако, когда вы реализуете один, вы должны установить это поле поддержки в обоих направлениях.
Auto-way - просто ярлык для этого:
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();
}
}
Это похоже на сокращение C# getter and setter.
Когда вы вручную указываете установщик, он не будет использовать механизм автоматического свойства для получателя, поэтому сообщение об ошибке выглядит так, как будто оно отсутствует. Вам нужно будет написать свой собственный геттер, когда вы укажете его.
Если вы что-то делаете в установщике, вам придется явно объявить переменную. Например
private string _myProperty;
public string MyProperty {
get { return _myProperty; };
set
{
_myProperty = value;
PerformSomeAction();
}
}
или - в установщике вы можете передать значение в функцию и сделать там, что вы хотите... если вы хотите изменить / проверить значение в функции PerformSomeAction()