一、C#与Java相似,编译后获得的还不是机器代码,而是运行在虚拟机中的元指令。它对安全性作了更多的考虑,没有指针,不能直接操做内存,自动实现内存管理。C++中的指针在带来强大的灵活性和高效的同时,也带了很多使用上的难题,C++程序中的绝大多数问题都来源于指针的不正确使用,C#出于软件安全性的考虑和语言易用性的考虑没有指针。 (c#无指针,)程序员
C#中实现自动垃圾回收,经过new在堆中建立对象,当对该对象的引用计数为0时回收内存。类有构造函数而没有析够函数。 (c#无析构函数,会自动回收垃圾)c#
C#没有指针这个概念,只有引用和数值之分。int等内部数据类型和struct定义的类型是数据类型,拷贝时作深度拷贝;而string和用class定义的类型是引用类型,拷贝时作浅拷贝——与深度拷贝对应,它经过引用计数来实现对象和内存管理。数组
C++中用指针可以轻易实现的功能,C#须要引进许多额外的机制。好比C++的函数指针,在C#中称之为delegate。C#中的参数传递,分为传值和传址两种,传址时须要加ref或者out(传回改变)关键字。安全
C#中的const与C++中的有所不一样,它指编译期常量,而运行期间的常量要用readonly来指定。 (delegate相似于函数指针,传址时要加ref或out,const含义不一样 c#中指编译常量)函数
二、C#的OO特性更为完全,一切皆对象,不存在独立的函数,程序的入口Mai()函数是某个对象的public static成员函数。ui
全部对象都是由Object派生而来,包括内部数据类型int,float,string等,它们只是System.int32等的别名而已。C#中没有模板,经过将参数设置为Object类型来实现相似的功能,它的downcast相似于C++中的dynamic_cast操做符。设计
C#没有头文件,变量、函数和类没有定义和申明的区别,都在一块儿。只能经过设计抽象类的方式实现代码分离。C++在这方面虽然作得还不够完美,但比C#强很多。指针
C#中有属性(Properties)和索引(Index)。属性相似于C++中的那些GetValue()和SetValue()成员函数,只是使用上有些差异。索引相似于C++中的重载操做符[]。对象
C#中在类中的成员变量声明处便可初始化,而C++中不行,二者均可以在构造函数中初始化成员变量。C#中的静态成员变量能够在静态构造函数中初始化,而静态构造函数是在该类的第一次使用时调用,而C++中是在编译单元载入时初始化静态成员变量。排序
三、C#的语法中多了foreach(typevinlist)statement;而C++中须要用C++标准库的函数实现相似功能。
C++相对C而言,引入了许多便于实现OOP的特性,也有出于软件工程方面考虑的特性。许多C++程序员(包括我)深感它的博大精神。同时,它又继承了C语言的简介和优美,尽可能用统一的风格实现尽量多的特性,好比操做符重载、模板等。C#与C++相比较,更加复杂,还显得臃肿和凌乱。
附:
1. C#不支持多重继承,这是与C++明显区别的地方,说真的多重继承有时候用起来挺麻烦的,可能微软怕你用很差吧,不给你提供了,但我我的以为没有了多重继承感受有点惋惜。2. 在标准的C#安全代码中不支持指针类型的操做,然而,你却能在微软所谓的“非安全代码”中操做指针类型对象。3. C#中全部对象都只能经过关键词“new”来建立,C++的“类名_对象名”方式在C#中变为声明一个引用。呵呵,万物皆对象,连常见的数据类型都变为对象了,JAVA味道很浓。4. 数组变为了类,所以对于数组里的元素,.NETFramework直接提供了一系列的操做:查找、排序、倒置……5. 在C#里面,数组的元素都是存放在托管堆里面,比起C++的在内存里不肯定位置申请一块连续空间要安全得多。6. C++的switch后跟参数必须是int型,而C#却容许string型,这点改进以为真的是比之前方便多了!7. C#会禁止全部switch..case语句的失败情形,除非case语句后是空格,不然执行了前一个case语句就算没有break也会中止执行后面的case语句。8. 在异常处理上,C++容许抛出任何类型,而C#中规定抛出类型为一个派生于System.Exception的对象。9. C++的宏在C#中被抛弃了不少,并且也不建议使用,所以不多见。10. C++的模板在C#里没有了,但在C#中咱们找到了能完成模板任务的更锋利的武器:委托。11. C++的全局变量这一律念没有了,C#和JAVA相似,要把全部东西都放在类里面,还建议使用命名空间包含起来。12. C#能够在定义类的时候直接给属性赋值,而C++这么作却会编译出错。13. C#里有静态构造函数一个概念,这个构造函数只执行一次,所以可以保证一些静态成员只被初始化一遍。14. C#有自动垃圾收集机制,防止内存泄露,把C++程序员从繁重的内存管理上解放出来。15. 更强的类型转换保护机制,好比说把float转成uint,直接转换0.35会变成0.34,是由于二进制没法表示这样的数字,使用System.Conver里的方法,能够安全地把类型安全转换过来。16. 委托与事件、装箱与取消装箱、Web Services……一大堆C++没有的新东西,我感受是作大型项目方便了管理,也容易扩充,但作起小型项目,因为是编译成IL代码的,运行须要.NET Framework SDK支持,效率是个问题,不利于作那些对运算速度和内存消耗要求高的项目。