誰でも次のステートメントを詳しく説明できますか:
byte[] buffer = new Byte[checked((uint)Math.Min(32 * 1024, (int)objFileStream.Length))];
なぜ私は使うべきではないのですか
byte[] buffer = new Byte[32 * 1024];
戻り値の型(ストリームであると想定)のため、(2147483647)objFileStream.Length
より大きい数値を返す場合は、例外をスローしようとしました。.net算術オーバーフローでは、デフォルトではチェックされません。int.MaxValue
Length
Stream
long
objFileStream
次のコードは、このケースを示しています。
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)];