tentativo è stato quello di lanciare un'eccezione se objFileStream.Length
tornerà numero maggiore di int.MaxValue
(2147483647), perché Length
su Stream
restituisce il tipo long
(presumo che lo objFileStream
sia lo stream). In .net l'overflow aritmetico non è selezionato per impostazione predefinita.
codice seguente dimostra questo caso:
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
Dopo l'analisi di breve, è possibile ridurre prossima dichiarazione
new Byte[checked((uint)Math.Min(32 * 1024, (int)objFileStream.Length))];
a
new Byte[Math.Min(32 * 1024, checked((int)objFileStream.Length))];
Raccomandazione personale: non vedo come OverflowException
ti aiuterà qui. Math.Min
si verificherà, quella matrice verrà creata non più di 32768
elementi. Se provi a catch
da qualche parte nel metodo di chiamata, non sarai in grado di dedurre quale sia la ragione dell'errore, potrebbe provenire da qualsiasi punto dello stack chiamato.
quindi probabilmente bisogno di non allocare sempre array di dimensione 32768 come avete proposto
byte[] buffer = new Byte[32 * 1024];
ma ancora utilizzare Math.Min
in modo che si risparmia lo stoccaggio, se objFileStream.Length
tornerà piccolo numero
byte[] buffer = new Byte[Math.Min(32 * 1024, objFileStream.Length)];
fonte
2013-04-04 09:52:20