在这里使用check有什么意义

时间:2013-04-04 09:49:14

标签: c# .net

任何人都可以详细说明以下声明:

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

为什么我不应该使用

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

1 个答案:

答案 0 :(得分:5)

如果objFileStream.Length返回的数字大于int.MaxValue(2147483647),则尝试抛出异常,因为Length上的Stream返回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 

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

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