在这里使用check有什么意义

don*_*ack 8 .net c#

谁能详细说明以下陈述:

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

为什么我不应该使用

byte[] buffer = new Byte[32 * 1024];  
Run Code Online (Sandbox Code Playgroud)

Ily*_*nov 5

试图抛出异常,如果objFileStream.Length将返回数大于int.MaxValue(2147483647),因为LengthStream返回long类型(我假设objFileStream是流).在.net中,默认情况下不会检查算术溢出.

下一代码演示了这种情况:

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 
Run Code Online (Sandbox Code Playgroud)

经过简短分析,您可以减少下一个陈述

new Byte[checked((uint)Math.Min(32 * 1024, (int)objFileStream.Length))]; 
Run Code Online (Sandbox Code Playgroud)

new Byte[Math.Min(32 * 1024, checked((int)objFileStream.Length))];
Run Code Online (Sandbox Code Playgroud)

个人推荐:我看不出OverflowException这对你有什么帮助.Math.Min将继续,该数组将不再创建32768项目.如果你尝试catch在调用方法的某个地方,你将无法推断出该错误的原因是什么,它可能来自被调用堆栈中的任何地方.

所以你可能不需要像你提议的那样总是分配大小为32768的数组

byte[] buffer = new Byte[32 * 1024]; 
Run Code Online (Sandbox Code Playgroud)

但仍然使用,Math.Min以便您将节省存储,如果objFileStream.Length将返回小数字

byte[] buffer = new Byte[Math.Min(32 * 1024, objFileStream.Length)]; 
Run Code Online (Sandbox Code Playgroud)