作者都是各自领域经过审查的专家,并撰写他们有经验的主题. 我们所有的内容都经过同行评审,并由同一领域的Toptal专家验证.
在快节奏和不断发展的软件工程世界中, 不同的编程语言正在竞争在这个行业中占有一席之地. 然而, 不同的语言使用不同的范式,往往有一长串的优点和缺点, 在它们之间进行直接比较具有挑战性和不确定性.
一些语言, 虽然, 有相似的语法和重点, 所以把它们并排比较是有意义的. 在本文中, 我们将研究c++和c#之间的区别, 比较一下这些多产的编程语言.
20世纪70年代, 正如丹麦计算机科学家Bjarne Stroustrup在他的博士论文中所做的那样, 他想用Simula, 第一个面向对象的编程语言. 但是Simula太慢了,所以Stroustrup决定使用C语言, 哪一种曾经是——有些人会说现在仍然是——最快的编程语言.
在他 使用Simula的经验, Stroustrup开始开发一种基于C语言的面向对象语言, 到1985年, c++向公众开放.
他决定让c++“尽可能地接近C”, 但不是更近,这意味着收养不会成为一个障碍. 因为所有的C库都可以自动使用, 许多顶级的C开发人员能够在现有知识的基础上转向c++.
不幸的是, 与C语言天生的相似性也是c++的弱点之一, 因为这两种语言都需要陡峭的学习曲线,很难掌握, 这使得编码对没有经验的开发人员来说是一个挑战.
这是Sun Microsystems在90年代中期决定创建Java的关键原因之一. Java的语法类似于c++,但它简化了语言结构,减少了出现意外错误的机会. Java团队, 由詹姆斯·高斯林领衔, 这主要是通过放弃与C的向后兼容性来实现的.
2002年,微软发布了c#,作为Java的直接竞争对手. 作为一种替代语言,c#与Java共享一些语法,但有更多的特性. c#和c++自发布以来都有了显著的改进.
当c++出现时,大多数编程语言都是面向过程的.
在过程编程语言中,程序被组织成更小的单元,称为过程. 每个过程对应于稍后在更大的单元中使用(从)的一些公共操作.
在面向对象语言中,过程是围绕执行它们的对象进行分组的. 对象是保存某种状态的逻辑单元.
c#是一种完全面向对象的语言, 而c++是一种可以混合过程代码和面向对象代码的语言.
这两种语言都是基于C语言的面向对象语言. 此外,c#是基于c++的,这使得它们非常相似. 那些对这两种语言都不熟练的人很容易通过扫一眼代码就把一种语言误认为另一种语言.
这两种语言都具有在面向对象语言中常见的特征,包括:
c++的一些强大特性很难理解,并且可能导致编程错误. 这些特性在Java和随后的c#中被有意省略:
也许c#和c++之间最关键的区别是内存管理.
在C语言中,动态内存(i.e.(内存分配是事先不知道的)使用 malloc
函数和释放使用 免费的
. 程序员需要手动管理内存. 因此,内存泄漏是C代码中的常见错误.
c++中的内存管理得到了改进,因为内存管理是半自动的. 可以使用称为“智能指针”的对象,这样程序员就不必手动释放内存. 然而, 在某些极端情况下(循环引用),智能指针不足以防止内存泄漏.
c#使用垃圾收集器(GC),它自动释放不再使用的内存. 虽然这看起来很理想, 有时,GC使释放包含系统资源而不是内存的对象变得困难.g.(文件句柄或TCP连接). 在这种情况下, 可能会出现称为“资源泄漏”的现象, 程序员必须手动释放保存资源的对象. 在这些罕见的情况下, c#中的回收比c++中更加复杂, 就像c#中对象的销毁一样 不确定性.
编译c++ 立即转换成机器二进制代码. c#被编译成字节码,然后被编译成机器二进制代码 .网. (之前”.网络核心,” .. 网是微软的现代、跨平台的原始替代品 .微软网络框架.)
尽管c++在这些不同的编译方法中具有性能优势, c#有一个强大的特性叫做“反射”,,它支持使用在运行时收集的信息进行对象实例化和方法调用. 例如, 可以直接调用方法的名称, 尽管该方法在编译期间不可用. 根据定义,c++不能有反射,因为它是立即编译的. c++有 运行时类型信息 而不是. 这是一个功能弱得多的特性,因为它仅用于具有虚函数的类型.
c++也有在编译时根据变量类型生成的代码形式的模板. 而不是模板, c#有泛型. 泛型不是在编译时解析,而是在运行时解析. 因此,模板比泛型更快. 另一方面,泛型不需要为每个新的变量类型增加额外的内存.
功能 | C++ | C# |
---|---|---|
编译 | 直接转换成二进制 | 以字节码 |
编译时间 | 长 | 短 |
内存管理 | 手动或半自动智能指针 | 由垃圾回收器自动执行 |
运行时的速度 | 尽可能快 | 比c++慢 |
运行时内存要求 | 最优 | 比c++还多 |
容易出错的 | 对于没有经验的程序员来说容易出错 | 更多的系统 |
类继承 | 单、多、虚拟 | 只有一个,多个带接口 |
泛型代码 | 模板-编译时 | 泛型-运行时 |
可移植性 | 编译器可用于几乎所有的操作系统, 但是需要为每个目标编译代码 | 编译后的字节码可以在许多操作系统上运行 |
学习 | Steep learning curve; time-consuming; can be complex for novice developers; smaller 社区 with fewer learning resources being produced | High-level language; easier to read; superior class hierarchy; easier to master for beginners, especially those with C++ or Java experience; larger and more active 社区 |
反射 | 不可用的运行时类型信息是一个糟糕的替代 | 可用且非常方便 |
隐式转换 | 允许内置类型 | 只有在安全的情况下才允许 |
C语言兼容性 | 完全兼容外部C代码 | 不兼容的 |
模块化 | 通过库和头文件完成 | 内置在语言中 |
在速度和内存效率方面,c++无疑是赢家. 然而, 如果现成有一个好的c#库,但c++没有这样的库, c#最终会产生一个更快的解决方案, 而c++实现可能会变得更慢.
c#的开发通常更快. 如果应用程序不执行时间紧迫的任务, 选择更简单、更不容易出错的语言是有意义的.
传统上,对于非windows环境,c++是正确的选择,但这改变了一次 微软开始鼓励开源实现 of .网. 相同的c#字节码几乎可以在任何平台上运行, 这使得它成为简化可移植性的首选语言.
由于反射, 当编写必须支持远程函数调用的库或需要使用运行时可用信息生成代码的类似特性时,c#是更合理的选择.
尽管这两种语言都支持模块化设计, 在c++中更难维护, 它使用c语言设计的头实现了该功能,这种方法现在已被更现代的方法所超越. 这通常会导致c++的编译时间明显长于c#到字节码的编译时间.
c++是一种更复杂的语言,所以 c++程序员 c#比c#更容易转换. 但是如果你的团队同时包含c++和 c#开发人员在美国,这两种语言可以混合使用.
如果您需要高性能,那么几乎所有情况下的答案都是c++. “高性能”指的是代码. 如果您正在使用现成的库来完成时间紧迫的工作, 代码的性能可能不是决定性因素.
如果性能不重要,则需要考虑开发时间. 如果您可以从头开始,那么使用c#开发项目可能是更好的选择.
如果您有一些开发时间,但性能并不重要, 选择取决于技能 可用的开发人员. 请记住,开发人员的流畅性可能会严重影响未来的代码维护. 只要有可能,考虑一下你的团队更喜欢的语言.
c++是一种高度优化的面向对象编程语言,用于需要时间和内存关键操作的环境中.
c#用于需要快速且不易出错的开发场景.
c++更快,内存占用更小, 但是c#比c++更容易学习,也更不容易出错.
世界级的文章,每周发一次.
世界级的文章,每周发一次.