2013-04-04 15 views
8

geprüft Verwendung Kann mir jemand folgende Erklärung erarbeiten:Was ist die Bedeutung von hier

byte[] buffer = new Byte[checked((uint)Math.Min(32 * 1024, (int)objFileStream.Length))]; 

Warum sollte ich nicht

byte[] buffer = new Byte[32 * 1024]; 

Antwort

5

Versuch Ausnahme ausgelöst wurde, wenn objFileStream.Length kehrt Nummer größer als int.MaxValue (2147483647), weil Length auf Streamlong zurückgibt (ich nehme an, objFileStream ist Strom). In .net arithmetischen Überlauf ist nicht standardmäßig aktiviert.

Next Code demonstriert diesen Fall:

long streamLength = long.MaxValue; //suppose buffer length is big 

var res = checked((int)(streamLength + 1)); //exception will be thrown 

Console.WriteLine(res); //will print 0 in you comment checked keyword 

Nach kurzer Analyse können Sie nächste Anweisung

new Byte[checked((uint)Math.Min(32 * 1024, (int)objFileStream.Length))]; 

zu

new Byte[Math.Min(32 * 1024, checked((int)objFileStream.Length))]; 

Persönliche Empfehlung reduzieren: Ich sehe nicht, wie OverflowException wird Ihnen hier helfen. Math.Min wird sichergestellt, dass das Array nicht länger als 32768 Elemente erstellt wird. Wenn Sie versuchen, irgendwo in der aufrufenden Methode catch, können Sie nicht ableiten, was der Grund für diesen Fehler ist, kann es von überall im aufgerufenen Stapel kommen.

So müssen Sie wahrscheinlich nicht immer Array der Größe 32768 zuweisen, wie Sie

byte[] buffer = new Byte[32 * 1024]; 

vorgeschlagen, aber Math.Min noch so verwenden, dass Sie Speicher sparen werden, wenn objFileStream.Length werden kleine Zahl zurückgeben

byte[] buffer = new Byte[Math.Min(32 * 1024, objFileStream.Length)]; 
Verwandte Themen