En .NET 4 beta 2, existe el nuevo espacio de nombres de Numerics con struct BigInteger
. El documentation indica que es un tipo inmutable, como era de esperar.¿BigInnteger es inmutable o no?
Pero estoy un poco confundido por el operador de incremento posterior (++
). Esto definitivamente parece mutar el valor. El siguiente bucle while funciona:
static BigInteger Factorial(BigInteger n)
{
BigInteger result = BigInteger.One;
BigInteger b = BigInteger.One;
while (b <= n)
{
result = result * b;
b++; // immutable ?
}
return result;
}
Esto es lo MSDN tiene que decir sobre el operador de incremento:
Dado que los objetos BigInteger son inmutable, el operador de incremento crea un nuevo objeto BigInteger cuya el valor es uno más que el objeto BigInteger representado por valor. Por lo tanto, las llamadas repetidas al Incremento pueden ser costosas.
Todo esto está muy bien, lo habría entendido si tuviera que utilizar b = b++
pero al parecer ++
por sí sola es suficiente para cambiar un valor.
¿Alguna idea?
Editar:
Como Lasse señala, hay un step-by-step specification de cómo funciona el post-incremento. Pero esto todavía parece estar en desacuerdo con la inmutabilidad. Por ejemplo, no me puedo imaginar que el uso de este operador sea seguro para subprocesos.
Suena razonable, pero aún parece romper la inmutabilidad. Voy a editar la pregunta un poco. –
No, no interrumpe la inmutabilidad, déjame actualizar mi respuesta. –
En 's + = s2' hay una asignación visible. Se ajusta si acepta que 'b ++' también es una asignación, es decir, 'b = b + 1'. Pero '++' todavía se siente/parece que está mutando. –