В .NET 4 beta 2 существует новое пространство имен Numerics с struct BigInteger
. В documentation указано, что это неизменный тип, как я и ожидал.Является ли BigInteger неизменным или нет?
Но я немного смущен оператором пост-инкремента (++
). Очевидно, что это искажает ценность. Ниже в то время как петля работает:
static BigInteger Factorial(BigInteger n)
{
BigInteger result = BigInteger.One;
BigInteger b = BigInteger.One;
while (b <= n)
{
result = result * b;
b++; // immutable ?
}
return result;
}
Это то, что MSDN должен сказать об операторе Increment:
Поскольку объекты BigInteger являются неизменны, оператор инкремента создает новый объект BigInteger которого значение больше, чем объект BigInteger , представленный значением. Следовательно, повторные вызовы Increment могут быть дорогими.
Все хорошо и прекрасно, я бы понял, если бы я должен был использовать b = b++
, но, по-видимому ++
само по себе достаточно, чтобы изменить значение.
Любые мысли?
Редактировать:
Как указывает Лассе, есть step-by-step specification, как работает пост-инкремент. Но это все еще кажется шансом с неизменностью. Например, я не могу себе представить, что использование этого оператора является потокобезопасным.
Звучит разумно, но по-прежнему кажется, что он нарушает неизменность. Я немного отредактирую вопрос. –
Нет, это не сломает неизменность, позвольте мне уточнить мой ответ. –
В 's + = s2' есть видимое задание. Он подходит, если вы согласитесь, что 'b ++' также является присвоением, то есть 'b = b + 1'. Но '++' все еще чувствует/выглядит так, как будто он мутирует. –