C#与C++对比总结之一
by Minghui Li
1. 常量总是静态的,不必也不允许使用static
2. C#中的引用。C#中非内置类型或者自定的Class,都是引用类型,要创建这样的对象必须使用new,和C++有区别。
3. C#中的输出语句:console.WriteLine(…);
4. string类型:它虽然也是引用类型,但是和普通的引用类型有区别。如果两个string对象指向相同的内存,当修改其中一个string,那么回创建一个全新的string,而另一个string不会发生变化。
5. @的作用:C#中采用和C/C++中相同的转义字符,比较麻烦,可以在字符串前面加上@,表示字符串中的所有字符都看作是其原来的含义,如:@”C:\ProCShap\First.cs”
6. C#中的if语句中的条件必须是bool值,不能像C++中可以是整形
7. C#中有一种特殊的循环:foreach
8. C#中的枚举类型和C/C++中的也有区别:访问枚举值的时候需要采用成员访问的方式。另外可以获得枚举值的字符串表示(ToString),也可以从字符串获得枚举值(Enum.Parse())。
9. C#中数组的声明和C++中的有区别:
§ Int[] intergers; // C#
§ Int intergers[]; // C++
10. C#中数组的初始化和C++中的区别:
§ Int[] intergers = new int[32]; // C#
§ Int intergers[32]; // C++
11. C#中的所有数组类型都是引用类型,和C++中的类似,因为C++中的数组类似一个指针。
12. C#的主程序入口:Main函数,其必须使类或者结构的静态成员函数。
13. 控制台IO:
§ Console.Read()
§ Console.ReadLine()
§ Console.Write()
§ Console.WriteLine()
§ C#可以像C一样格式化输出
14. C#中的预处理器指令比C++的强大
15. 函数参数的问题:
§ 当函数的参数是一个引用类型
§ 当函数的参数是一个值类型,但想让其像引用类型一样工作,需要使用ref关键字声明该函数(类似于C++中的&语法):
Void SomeFunc(ref int i);
调用函数时,该参数也要使用ref关键字(不同于C++):
SomeFunc( ref i );
§ out关键字:作为输出参数,被引用的变量不需要被初始化。使用方法同ref。
16. C#不支持默认参数,不同于C++。
17. 类中数据成员的默认初始化值为0或者false。不同于C++的随机初始化。
18. 如果提供了带参数的构造函数,编译器不会自动生成默认构造函数。
19. 静态构造函数:C#中特有的,只执行一次,不能有参数,主要目的是为静态字段或者属性初始化。.net没有确保类的静态构造函数何时执行,但一般是在第一次调用类的成员之前执行。可以与无参数的实例构造函数共存。
20. 构造函数初始化器,类似于C++中的初始化列表,但有很大区别。C#的构造函数初始化器只能调用其它的构造函数(如this,或者base),而C++的可以初始化数据成员。
21. C#的只读字段
§ 是用readonly关键字修饰的字段。C++中没有。
§ 只读字段不同于const字段,只读字段可以是实例字段,可以在实例初始化函数中初始化赋值,而在其它任何函数中不能改变。
§ 当然只读字段也可以是静态字段。
22. C#中的结构不同于C++。
§ C++中的结构和类时等同的。
§ C#中的结构是值类型的,一般是比较小的数据结构,存储在栈中。但是可以使用new运算符。
§ C#中的结构不支持继承。
§ 不允许定义无参数的构造函数,其是编译器默认提供的,不允许被覆盖。
23. System.Object中的方法:(感觉比较有用,但还不知道具体怎么使用?)
§ string ToString( )
§ Int GetHashTable()
§ Bool Equal(object obj) // 比较两个对象是否相等
§ Bool Equal(object objA, object objB) // 同上
§ Bool ReferenceEquals(object objA, object objB)//比较两个引用是否指向同一个对象
§ Type GetType() // 得到对象类型的详细信息
§ Object MemberwiseClone() // 进行对象的浅表复制???
§ Void Finalize() // .net版本的析构函数