2013-04-04 9 views

risposta

5

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)];