Проверка значения в свойстве
Я слышал, что проверка значения в собственность такой:
//dummy example, let's assume that I want my value without dots
public string MyProp
{
set
{
if(value.Contains('.'))
throw new ArgumentException("Must not contain '.'", "value");
}
}
неправильно, и я должен избегать этого.
но раньше мне говорили, что это хороший способ. Мы смогли использовать заключение, как раз одно место, котор нужно проверить, высушить, etc.
что не так с моим маленьким примером?
4 ответов
нет ничего плохого в создании исключений в сеттере свойств. Но вы должны бросить ArgumentException
, а также фактически установить значение свойства!
private string _myprop;
public string MyProp{
set{
if(value.Contains('.')) throw new ArgumentException("Must not contain .");
this._myprop=value;
}
get { return this._myprop; }
}
С статья о лучших практиках в MSDN:
геттеры свойств должны быть простыми операциями без каких-либо предварительных условий. Если геттер может выдать исключение, рассмотрите возможность перепроектирования свойства как метода. Эта рекомендация не применяется к индексаторам. Индексаторы могут исключение из-за недопустимых аргументов.
допустимо и допустимо выбрасывать исключения из задатчика свойств.
есть несколько подобных вопросов и на SO.
вы должны быть легкими, насколько это возможно. И если сеттеры выдает ошибку, это нормально, но снова вы можете рассмотреть вопрос о ее перемещении в функцию. Все может легко запутаться.
избежать исключения из аксессоры. Аксессоры должны быть простые операции и не должны иметь предварительных условий. Если getter может выдать исключение, оно, вероятно, должно быть переработано ля метод.
смотрите: рекомендации: выбрасывание исключений из свойств для объяснения и обсуждения того, почему выбрасывание исключений из свойств плохо.
по общему признанию, этот пост говорит о геттерах собственности.
сеттеры обычно рассматриваются потребителями как просто установка частного поля, скрытого свойством, и, возможно, выполнение некоторых дополнительных действий по мере необходимости, исключения-это неожиданное поведение, и вы можете себе представить, что нужно заключать каждый набор оператор внутри блока try?
хотя это может быть принято руководством, это кошмар для угадывания для разработчиков, и логика проверки должна содержаться в отдельном методе, а затем вызываться из свойства, если это необходимо.
Если вам нужна проверка или специальное поведение при настройке свойств, вы должны использовать метод set, например SetMyProp(string value)
поскольку это приносит ему различие, что это может привести к исключению и т. д.
Если вы используете свойства для чего-то вроде модели WPF, то вы должны использовать встроенную проверку WPF для данных вместо этого.