В порядке ли функция, которая может генерировать исключение, чтобы иметь атрибут [чистый]?Может ли функция [pure] вызывать исключение?
ответ
Согласно
https://msdn.microsoft.com/en-us/library/system.diagnostics.contracts.pureattribute(v=vs.110).aspx
PureAttribute
атрибута
Указывает, что тип или метод является чистым, то есть, он не делает никаких видимых изменения состояния.
Таким образом, вполне возможно исключить исключение из такого метода, например.
// factorial is a pure function: no state will be changed,
// just a computation
[Pure]
public static BigInteger Factorial(BigInteger value) {
// We can't return infinity with BigInteger and that's why have to throw the exception
if (value < 0)
throw new ArgumentOutOfRangeException("value", "value must be non-negative");
...
}
А что, если я называю этот чистый метод как
BigInteger result = Factorial(1000000000);
один из возможных исходов OutOfMemory
исключения брошен
Я согласен с Дмитрием.
Согласно документации из MSDN:
Все методы, которые вызываются в рамках контракта должны быть чистыми; то есть они не должны обновлять существующее существо. Чистому методу разрешается изменять объекты, созданные после ввода в чистый метод.
Запрет на выброс исключений и не обязательно будет рассматриваться как изменение состояния объекта.
Вы можете выбросить исключение, вы не делаете никаких видимых изменений состояния. Вот пример от Reference source.
[Pure]
private void VerifyWritable() {
if (isReadOnly) {
throw new InvalidOperationException(Environment.GetResourceString("InvalidOperation_ReadOnly"));
}
Contract.EndContractBlock();
}
вы должны перенести вместо добавления другого ответа. –
Почему? мой ответ не относится к одной и той же статье? Другой вид информации можно найти из моего ответа. Вы не должны проголосовать за это. – Diemauerdk