Dela via


Maximal längd för BigInteger

.NET 9 tillämpar en maximal längd på BigInteger, vilket är att den inte får innehålla mer än (2^31) - 1 (cirka 2,14 miljarder) bitar. Ett sådant tal representerar en allokering på nästan 256 MB och innehåller cirka 646,5 miljoner siffror. Den här nya gränsen säkerställer att alla API:er som exponeras är väluppfostrade och konsekventa samtidigt som tal som ligger långt bortom de flesta användningsscenarier tillåts.

Tidigare beteende

Tidigare kunde du tilldela ett värde med en längd upp till Array.MaxLength * 32 bitar till en BigInteger variabel.

Kommentar

Typiska datorer skulle nå långt OutOfMemoryException innan den här gränsen någonsin kunde nås.

Nytt beteende

Från och med .NET 9 BigInteger har en maximal längd på (2^31) - 1 (cirka 2,14 miljarder) bitar. Om du försöker tilldela ett större värde genereras ett OverflowException vid körning. Följande kod genererar till exempel ett undantag:

BigInteger bigInt = new BigInteger(-1) << int.MaxValue;

Version introducerad

Förhandsversion 6 av .NET 9

Typ av icke-bakåtkompatibel ändring

Den här ändringen är en beteendeförändring.

Orsak till ändringen

BigInteger stöder att representera heltalsvärden med i stort sett godtycklig längd. I praktiken begränsas dock längden av den underliggande datorns gränser, till exempel tillgängligt minne eller hur lång tid det tar att beräkna ett givet uttryck. Dessutom finns det vissa API:er som misslyckas med indata som resulterar i ett värde som är för stort. Av dessa skäl tillämpas nu en maximal längd.

Om koden påverkas minskar du längden på det värde som du tilldelar till eller lägger till BigInteger en längdkontroll.

Berörda API:er