In .NET 4 beta 2, c'è il nuovo spazio dei nomi Numerics con struct BigInteger
. Lo documentation afferma che è un tipo immutabile, come mi sarei aspettato.BigInteger è immutabile o no?
Ma sono un po 'confuso dall'operatore post-incremento (++
). Questo sembra decisamente mutare il valore. Il seguente ciclo while funziona:
static BigInteger Factorial(BigInteger n)
{
BigInteger result = BigInteger.One;
BigInteger b = BigInteger.One;
while (b <= n)
{
result = result * b;
b++; // immutable ?
}
return result;
}
Questo è ciò che MSDN ha da dire circa l'operatore di incremento:
Poiché gli oggetti BigInteger sono immutabili, l'operatore di incremento crea un nuovo oggetto BigInteger cui valore è uno in più rispetto all'oggetto BigInteger rappresentato dal valore. Pertanto, le chiamate ripetute a Incremento possono essere costose.
Tutto molto bene, avrei capito se ho dovuto usare b = b++
ma a quanto pare ++
di per sé è sufficiente per cambiare un valore.
Qualche idea?
Modifica:
Come sottolinea Lasse, c'è un step-by-step specification per come funziona il post-incremento. Ma questo sembra ancora in disaccordo con l'immutabilità. Ad esempio, non posso immaginare che l'utilizzo di questo operatore sia sicuro per i thread.
Suoni ragionevoli, ma sembra ancora rompere l'immutabilità. Modificherò la domanda un po '. –
No, non infrange l'immutabilità, lascia che aggiorni la mia risposta. –
In 's + = s2' c'è un incarico visibile. Si adatta se si accetta che 'b ++' sia anche un compito, ovvero 'b = b + 1'. Ma '++' sembra ancora/sembra che stia mutando. –