誰でも次のステートメントを詳しく説明できますか:
byte[] buffer = new Byte[checked((uint)Math.Min(32 * 1024, (int)objFileStream.Length))];
なぜ私は使うべきではないのですか
byte[] buffer = new Byte[32 * 1024];
戻り値の型(ストリームであると想定)のため、(2147483647)objFileStream.Lengthより大きい数値を返す場合は、例外をスローしようとしました。.net算術オーバーフローでは、デフォルトではチェックされません。int.MaxValueLengthStreamlongobjFileStream
次のコードは、このケースを示しています。
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
簡単な分析の後、次のステートメントを減らすことができます
new Byte[checked((uint)Math.Min(32 * 1024, (int)objFileStream.Length))];
に
new Byte[Math.Min(32 * 1024, checked((int)objFileStream.Length))];
OverflowException個人的な推奨事項:ここでどのように役立つかわかりません。Math.Minその配列はアイテムよりも長く作成されません32768。呼び出し元のメソッドのどこかに行こうとcatchすると、そのエラーの理由を推測することはできません。呼び出されたスタックのどこからでも発生する可能性があります。
したがって、提案したように、サイズ 32768 の配列を常に割り当てる必要はないでしょう。
byte[] buffer = new Byte[32 * 1024];
ただし、小さい数値を返す場合は、ストレージを節約するために引き続き使用Math.MinしますobjFileStream.Length
byte[] buffer = new Byte[Math.Min(32 * 1024, objFileStream.Length)];