
将Java的设计与.NET以C#为例的设计作个比较是有趣的。Java将数据类型分为“原始数据类型”和“引用数据类型”两大类int是原始数据类型为了向开发者提供一些常用的功能比如将String转换为int所以JDK提供了一个引用类型Integer封装这些功能。.NET则不一样它的数据类型分为“值类型”和“引用数据类型”两大类int属于值类型本身就拥有丰富的方法请看以下C#代码int i 100;string str i.ToString(); //int变量本身就拥有“一堆”的方法使用.NET的反汇编器ildasm查看一下上述代码生成的IL指令不难发现C#编译器会将int类型映射为System.Int32结构注意System.Int32是一个值类型生存于线程堆栈中一般来说在多线程环境下使用值类型的变量往往比引用类型的变量更安全因为它减少了多线程访问同一对象所带来的问题。简要解释一下请对比以下两个方法void DoSomethingWithValueType(int value);void DoSomethingWithReferenceType(MyClass obj);当多个线程同时执行上述两个方法时线程函数使用值类型的参数value是比较安全的不用担心多个线程互相影响但引用类型的obj参数就要小心了如果多个线程接收到的obj参数有可能引用同一个MyClass对象为保证运行结果的正确有可能需要给此对象加锁。与JVM一样.NET的CLR也提供了add等专用指令完成加减乘除功能。从开发者使用角度而言C#的int既具有与Java的原始数据类型int一样的在虚拟机级别的专用指令又具有Java包装类Integer所拥有的一些功能还同时避免了Java中Integer的那种比较古怪的特性个人认为C#中的int比Java中的int/Integer更好用更易用。但从探索技术内幕而言则大不一样Java使用Integer一个类就“搞定”了所有常用的整数处理功能而对于.NET的System.In32结构好奇的朋友不妨用Reflector去查看一下相关的源码会发现System.Int32在内部许多地方使用了Number类所封装的功能还用到了NumberFormatInfo提供数字的格式化信息、CultureInfo提供当前文化信息等相关类型如果再算加上一堆的接口那真是“相当地”复杂。比对一下Java平台与.NET平台往往会发现在许多地方Java封装得较少。从应用程序开发角度来看不少地方Java在使用上不如.NET方便。就拿本文所涉及的非常常见的整数类型及其运算而言相信大家都看到了使用Java编程需要留心这个“Intege对象缓存”的陷阱而.NET则很贴心地把这些已发现的陷阱.NET设计者说当然肯定会有没发现的陷阱但那就不关我事了都盖上了“厚厚”的井盖让开发者很省心因而带来了较高的开发效率和较好的开发体验。但另一方面Java的JDK代码一览无余是开放的你要探索其技术内幕总是很方便这点还是比较让人放心。