8

誰でも次のステートメントを詳しく説明できますか:

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

なぜ私は使うべきではないのですか

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

1 に答える 1

5

戻り値の型(ストリームであると想定)のため、(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)]; 
于 2013-04-04T09:52:20.760 に答える