本以为可以有点时间来好好学习一下MFC,可是昨天和supervisor见了个面,发现必须要马上学习C#才行。之前听说C# = C++ + Java,花了两天时间看了c#的基本语法,发现果然如此,基本语法和c++没什么区别,代码结构上又是继承了Java(比如没有头文件,main()也放在了class里面等)。我看的是《Programming C# 3 0》 5th Edition,这书写得不错,不知道第五版有没有中文版(反正我搜索只有第四版的中文版),作者不愧是微软的人,开篇就把c#一顿吹,吹得让我这种刚学c#的人信心爆棚,觉得c#似乎无所不能,可以胜任各种平台,包办本地和web应用。哦,他推崇应该是.NET,不过既然c#是.NET的御用语言,当然也该推崇了。话说回来,Jesse的语言能力和写作水平还是毋庸置疑的,读起来还是十分轻松的(不像某Bruce),这可能也和本书定位有关(Beginning to Intermediate)。
写下几点个人觉得要记住的地方(或者说是比起c++有变化的地方):
1.用于if等语句的条件判断的表达式值只能为bool,不能像C++那样输入个int值进行判断了。这样也带来一个好处,就是像if(test = 20)这样的语句就无法通过编译了。相信把“==”写成“=”,每个人都基本干过吧,当然,你可以写成if(20 == test)来避免错误。不过,看来微软是不喜欢这样的,毕竟总是倒着写不符合直觉啊。
2.switch语句中的每个非空case必须有显式的跳转,否则程序不会自动进入到下一个case判断,而是编译错误。
3.当为class创建对象时,所有数据成员首先会被初始化为‘0’(或者null等),然后才是调用构造函数进行初始化。也就是说,在创建一个对象时,实际上数据成员被赋了两次值。我不知道为什么要设计成这样,也不知道作者提出这一点目的何在,因为调用构造函数之前的事情似乎完全是不受我们控制的。
4.构造函数要声明为public
5.this是一个引用而不是指针,不过就我目前的水平来看,实际上使用仍然是一回事。
6.静态成员只能通过类名来访问,若试图通过实例访问就会编译错误。
7.传递参数为引用时使用ref。比如function(int& inNumber),应该写成function(ref int inNumber)。并且在调用该函数是必须显式地指明:function(ref aNumber)。另一个修饰符out也能实现同样的功能,目前知道的区别就是:在用out传入的参数不要求有初始化值,不过必须在函数中给它赋值,否则就报错,而ref则不是必需要求被赋值。(网上搜了下,有这么一句:“Out更适合用在需要Return多个返回值的地方,而Ref则用在需要被调用的方法修改调用者的引用的时候”,先放在这)
8.不需要析构函数,因为有GC。不过,当你想自己处理非托管资源(unmanaged resources)时,还是需要的。不过你可以使用某些已经包装好的类(wrapper classes)来避免这种情况(大概是这么个意思吧,作者提到了FileStream,让我不禁想到Java里的FileStream)。
9.修饰符:readonly和const有些类似,通过博客园和csdn上的一些文章,大概记住的区别有:readonly不要求是static的;只能用于类的数据成员;只能用构造函数来初始化(在声明时的赋值没有意义)。放两篇文章以便以后学习:Kenney的《比较C#中的readonly与const》和Allen Lee的《readonly vs. const [C#]》。readonly可以用来声明那些在运行时才能确定的常量。
以上,基本就是看《Programming C# 3 0》一部前4章的一些记录。