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回收;分配在堆里的对象,当没有其他任何对象引用他时,就被标记为垃圾对象,等待垃圾回收器回收。
————————————————
版权声明:本文为CSDN博主「银霜覆秋枫」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/u011974126/java/article/details/48194241