Я бы определенно утверждал, что в дизайне есть недостаток, если вы чувствуете необходимость генерировать исключения из установщика или получателя свойства.
Свойство - это абстракция, представляющая нечто, представляющее собой просто значение . И вы должны иметь возможность устанавливать значение, не опасаясь, что это может вызвать исключение. *
Если установка свойства приводит к побочному эффекту, то это должно быть реализовано как метод. И если это не приводит к каким-либо побочным эффектам, то не должно быть никаких исключений.
Одним из примеров, уже упомянутых в другом ответе, является Stream.Position
свойство. Это вызывает побочные эффекты и может создавать исключения. Но этот установщик свойств - просто оболочка, Stream.Seek
которую вы можете вызвать вместо этого.
Лично я считаю, что позиция не должна была быть записываемой собственностью.
Другой пример, когда вы можете испытать искушение вызвать исключение из установщика свойства, в проверке данных:
public class User {
public string Email {
get { return _email; }
set {
if (!IsValidEmail(value)) throw InvalidEmailException(value);
_email = value;
}
}
Но есть лучшее решение этой проблемы. Введите тип, представляющий действительный адрес электронной почты:
public class Email {
public Email(string value) {
if (!IsValidEmail(value)) throw new InvalidEmailException(value);
...
}
...
}
public class User {
public Email Email { get; set; }
}
В Email
гарантирует , что класс не может иметь значение, которое не является действительным адресом электронной почты, и классы , которые нужно хранить электронные письма освобождаются от обязанности проверки их.
Это также приводит к большей сплоченности (показатель хорошего дизайна программного обеспечения) - знание о том, что такое адрес электронной почты и как он проверяется, существует только в Email
классе, который имеет только эту проблему.
* ObjectDisposedException - единственное допустимое исключение (без каламбура), о котором я могу думать в данный момент.