2016-10-28 5 views

ответ

2

Согласно

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 исключения брошен

-2

Я согласен с Дмитрием.

Согласно документации из MSDN:

Все методы, которые вызываются в рамках контракта должны быть чистыми; то есть они не должны обновлять существующее существо. Чистому методу разрешается изменять объекты, созданные после ввода в чистый метод.

Запрет на выброс исключений и не обязательно будет рассматриваться как изменение состояния объекта.

+4

вы должны перенести вместо добавления другого ответа. –

+0

Почему? мой ответ не относится к одной и той же статье? Другой вид информации можно найти из моего ответа. Вы не должны проголосовать за это. – Diemauerdk

1

Вы можете выбросить исключение, вы не делаете никаких видимых изменений состояния. Вот пример от Reference source.

[Pure] 
    private void VerifyWritable() { 
     if (isReadOnly) { 
      throw new InvalidOperationException(Environment.GetResourceString("InvalidOperation_ReadOnly")); 
     } 
     Contract.EndContractBlock(); 
    } 

 Смежные вопросы

  • Нет связанных вопросов^_^