1,C# 不支持多重继承.
使用多重继承可以使派生出来的类具有多重特性, 使用紧凑的代码完成十分复杂的功能, 但这样不可避免的是代码的调试和阅读变得困难和烦杂. 但是 C# 中支持接口 Interface 的多重继承, 在类中实现 Interface 中的接口函数就可以了.
2, 在标准的 C# 中, 不支持指针类型.
- C# 在默认情况下都是安全代码, 即进行了代码托管, 由编译器负责垃圾回收, 释放内存, 而指针不能出现在安全代码的条件下. 如果要使用指针, 可以将代码定义为非安全的 (unsafe), 或者可以考虑 Inptr 这个类型.
- 3,C# 中所有的对象都只能通过 new 来创建分配内存.
在 C# 中, 使用 new 来调用构造函数, new 的作用对象可以是引用类型, 也可以是值类型. 例如, 在 C# 中可用如下代码声明一个整型变量并分配存储空间:
- int a = new int();
- a = 10;
- MessageBox.Show(a.ToString());
而在 C++ 中, 下面的写法将提示: int * 类型的值不能初始化 int 类型的实体:
- int a = new int();
- 4,C# 中数组变成了类, 对于数组里的元素,.Net 提供了一系列的操作.
.Net 为 C# 中的数组提供了许多方法和属性. 如: 获取数组的长度, 数组的拷贝, 得到数组的平均值等. 如下代码将数组的长度赋值给一个变量:
- int[] array = new int[20];
- int a = new int();
- a = array.Length;
- 5,C# 中, 数组存储在托管堆里.
在 C# 中, 将数组存放在托管堆里, 这样, 程序员不必去关心何时释放数组所占用的内存, 由. Net 来负责对内存的释放与垃圾回收.
6,C++ 中, Switch 后的参数表达式必须是整数或者枚举类型, 也可以是 char 型的字符常量. 而在 C# 中, switch 后的参数表达式可以是 string 类型, 这样就扩大了 Switch 可使用的范围.
在 C++ 中, 下边的写法将提示: 表达式必须包含整数或者枚举类型,
- string a = "sh";
- //char a = 'b';
- switch (a)
- {
- case 'a':
- break;
- case 'b':
- cout <<"welcome" << endl;
- break;
- default:
- break;
- }
而在 C# 中, 这样的写法是可以正确编译执行的:
- <span style="white-space:pre">
- </span>
- string a = "w"; //char a = 'b'; switch (a) { case "s": break; case "w":
- MessageBox.Show("welcome"); break; default: break; }
7,C++ 中的宏定义在 C# 中被弃用.
- C# 中已经不再使用宏定义. 而关于 C# 中替换 C++ 中宏定义的相应方法在本人前边的文章 C++ 宏的作用与 C# 里宏的代替 中已经有所提及.
- 8,C# 中新增委托, 事件, 装箱与取消装箱.
委托, 事件是 C# 中新引入的概念, 与 MFC 中的消息响应机制类似.
9,C# 中不再存在全局变量.
如果, 在命名空间的作用域中, 类的作用域之前定义一个整型变量, 将提示: 命名空间不能直接包含字段或方法之类的成员. 如下图所示:
10,C# 提供自动垃圾回收机制.
托管代码: 被 CLR(Common Language Runtime) 管理的代码.
回收机制: 分配在栈空间的变量, 一旦执行完, 或者超出其作用域, 就会被 CLR 回收; 分配在堆里的对象, 当没有其他任何对象引用他时, 就被标记为垃圾对象, 等待垃圾回收器回收.
----------------
来源: http://www.bubuko.com/infodetail-3644419.html