W .NET 4 beta 2 istnieje nowa przestrzeń nazw Numerics z struct BigInteger
. documentation stwierdza, że jest to typ niezmienny, jak bym się spodziewał.Czy BigInteger jest niezmienny czy nie?
Ale jestem trochę zdezorientowany przez operatora po inkrementacji (++
). To zdaje się mutować wartość. Poniższy natomiast pętla działa:
static BigInteger Factorial(BigInteger n)
{
BigInteger result = BigInteger.One;
BigInteger b = BigInteger.One;
while (b <= n)
{
result = result * b;
b++; // immutable ?
}
return result;
}
To co MSDN ma do powiedzenia na temat operatora wzrostu ceny:
Ponieważ obiekty BigInteger są niezmienne, operator Przyrost tworzy nowy obiekt BigInteger którego wartość jest o jeden większy niż obiekt BigInteger reprezentowany przez wartość. Dlatego wielokrotne połączenia z inkrementacją mogą być drogie.
wszystko dobrze i dobrze, bym zrozumiał, gdybym musiał użyć b = b++
ale widocznie ++
sama w sobie jest na tyle, aby zmienić wartość.
Jakieś myśli?
Edytuj:
Jak wskazuje Lasse, istnieje step-by-step specification, jak działa post-increment. Ale nadal wydaje się, że jest to sprzeczne z niezmiennością. Na przykład nie mogę sobie wyobrazić, że używanie tego operatora jest bezpieczne dla wątków.
Brzmi rozsądnie, ale nadal wydaje się przełamać niezmienność. Będę trochę edytować pytanie. –
Nie, to nie łamie niezmienności, pozwól mi zaktualizować odpowiedź. –
W 's + = s2' widoczne jest zadanie. Pasuje, jeśli zaakceptujesz, że 'b ++' jest również zadaniem, tj. 'B = b + 1'. Ale '++' wciąż wydaje się/wygląda na mutację. –