Я хочу, чтобы мой инвариантный метод объекта генерировал определенное исключение. Имеет ли это смысл? Возможно ли это на C #?
Например, у меня есть следующий код, включая класс A с инвариантным методом и класс исключения E. На данный момент класс E не участвует в A ...
class A {
int x = 0, y = 1;
[ContractInvariantMethod]
private void YisGreaterThanX() {
Contract.Invariant(x < y);
}
}
class E : Exception {
}
А мне нужно следующее. Как и Contract.Requires, было бы полезно иметь Contract.Invariant (или может быть конструктор атрибута, который принимает класс, производный от исключения).
class A {
int x = 0, y = 1;
[ContractInvariantMethod]
private void YisGreaterThanX() {
Contract.Invariant<E>(x < y);
}
}
class E : Exception {
}
Это хорошее намерение? Может моя логика неверна?
Contract.Requires
может генерировать исключения, чтобы указать на ошибки в коде вызывающего абонента. ЕслиContract.Invariant
выдает ошибку, это почти всегда указывает на ошибку в вашем коде. Можете ли вы подробнее рассказать, почему вы хотите это сделать? - person   schedule 22.12.2013Contract.Requires<E>(x < y)
в каждый конструктор типаpublic A(int x, int y)
и все подобные методы? Или это значит, что логика класса А испорчена? .. - person Hoborg   schedule 23.12.2013ArgumentException
, а не экземпляр класса, который затем становится непригодным для использования. - person   schedule 23.12.2013x < y
является требованием этого конструктора. (По какой-то причине SO не позволил мне отредактировать мой предыдущий комментарий, чтобы включить его, хотя прошло менее пяти минут.) - person   schedule 23.12.2013Contract.Requires
во всех аналогичных методах), не так ли? Должен ли я написать что-то вродеContract.Requires<ArgumentException>(Requirement(x, y));
, гдеRequirement
определено в классе A какpublic Func<int, int, bool> Requirement { get { return (x, y) => x < y; } }
? - person Hoborg   schedule 24.12.2013x < y
в вашем случае, где иx
, иy
могут быть изменены), но также могут быть ограничения без каких-либо инвариантов или могут быть инварианты, которые не полагаются на какие-либо ограничения, помимо того, что сам C # обеспечивает. - person   schedule 25.12.2013