C++毫无疑问是软件开发工具中的工业标准,但要说做Windows开发,现在恐怕看起来还是用.net比较划算,使用.net的C++叫“Managed C++”,我看了之后只想说这句话:这货不是C++。这里顺带提起一次面试经历,是我面试别人,我告诉来面试的人:“我们目前的软件项目使用C++开发,没用.net。”他一脸诧异地问道:“你现在用的是VC6?”我说:“不是,我用的是VS2008。”他说:“那你用的就是.net,从VS2003开始都是.net。”我解释道:“我在做本地开发,没使用.net。”而这位哥们继续坚持说我就是用.net开发,我很郁闷,也许我们说的是不同的话,互相之间无法理解得了。总而言之,Managed C++的用户是极少的,从某种意义上说,C#为.net而生,而.net也为C#而生,用C++做.net开发可是半点优势都没有。这是题外话,OK,进入正题。
1,最最最要注意的就是:垃圾回收机制
C#没有delete,其托管资源不需要delete,也不能显式delete,完全由.net的垃圾回收器来管理。
稍微有点麻烦的是非托管资源,比如打开的文件句柄,创建的位图句柄等,这些是非托管资源,如果一直不显式回收,那有可能会越来越多,那怎么办?这方面的问题在绝大多数的C#的书籍上都有讲述,有时候看得人晕头转向的,其实我们只要遵循这么一种规范,就可以应对不说100%,也有99%的情况了:
类中没有非托管资源的情况下,啥都不用管,也不用实现析构函数。
如果类中有非托管资源,则应该实现析构函数,并且在析构函数中释放资源。
如果类中有非托管资源,并且想让类使用者提前释放掉这些非托管资源的话,那就实现一个Dispose的方法来释放非托管资源,再加上这么一行代码GC.SuppressFinalize(this);以此来告诉.net的垃圾回收器,不需要再调用一次析构函数来释放非托管资源了。
2,值/引用,struct/class
C#的struct和class差别很大,不像C++那样几乎没什么差别,struct适用于创建小的结构,它使用的是值传递,而用class的对象使用的是引用传递。
值,存在于栈区,而引用,则存在于堆区。
struct:存在于栈区,可用new初始化(也可以不用),没有默认构造函数(但可以添加构造函数,也可以不添加),没析构函数,不能被继承。
class:存在于堆区,必须用new初始化,有默认构造函数,有析构函数,当然能被继承啦。
3,注意装箱和拆箱
值和引用有时候得互相转换,比如当一个函数需要引用参数,而你却把值传了过去,那么就存在这么一个隐式转换的过程了,这个过程会有额外的性能开销,所以要尽量避免。值转为引用叫“装箱”,反过来引用转为值叫“拆箱”。装箱可以是隐式的,但拆箱一定是显式的,如:
int i = 123;
object o = i; //装箱(隐式)
int j = (int) o; //拆箱(显式)
4,其它一些语法差别
4.1 虚方法必须带上override修饰,否则会有warning。
4.2 没有了C++构造函数中的“初始化列表”。
4.3 布尔和整型是两种不同类型。
4.4 switch语句的行为和C++的略有不同。