作者都是各自领域经过审查的专家,并撰写他们有经验的主题. 我们所有的内容都经过同行评审,并由同一领域的Toptal专家验证.
Jakiša托米奇的头像

Jakiš托米-ć

Jakiša是一位经验丰富的全栈开发人员,拥有超过15年在多个平台上创建c#和c++应用程序的经验. 他的工作包括Windows API, 嵌入式编程, 分布式系统, 混合现实, 和DevOps. Jakiša拥有萨格勒布大学数学和计算机科学硕士学位.

专业知识

工作经验

15

以前在

微软
Share

在快节奏和不断发展的软件工程世界中, 不同的编程语言正在竞争在这个行业中占有一席之地. However, 不同的语言使用不同的范式,往往有一长串的优点和缺点, 在它们之间进行直接比较具有挑战性和不确定性.

一些语言, though, 有相似的语法和重点, 所以把它们并排比较是有意义的. 在本文中, 我们将研究c++和c#之间的区别, 比较一下这些多产的编程语言.

c#和c++简史

20世纪70年代, 正如丹麦计算机科学家Bjarne Stroustrup在他的博士论文中所做的那样, 他想用Simula, 第一个面向对象的编程语言. 但是Simula太慢了,所以Stroustrup决定使用C语言, 哪一种曾经是——有些人会说现在仍然是——最快的编程语言.

该图描绘了两个柱状图,显示了1998年至2021年c#和c++的不同版本, 从1998年的c++和c# 1开始.0 in 2002. 最新的版本是2020年的c++ 20和c# 10.0 in 2021.
c#和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#是基于c++的,这使得它们非常相似. 那些对这两种语言都不熟练的人很容易通过扫一眼代码就把一种语言误认为另一种语言.

这两种语言都具有在面向对象语言中常见的特征,包括:

  • 封装. 代码被组织成逻辑组,称为类.
  • 数据隐藏. 部分数据和代码是私有的,这意味着它们只能从类内部访问.
  • 继承. 共享类功能可以组织在由派生类继承的公共类中, 从而避免代码重复.
  • 多态性. 代码能够影响基类的对象,但对不同的派生类表现不同.

c#和c++的区别

c++的一些强大特性很难理解,并且可能导致编程错误. 这些特性在Java和随后的c#中被有意省略:

  • 多重继承. 派生类继承多个基类. c#没有使用这个特性,而是引入了没有实现的基类. 这样的类在c#中被称为接口.
  • 指针. 虽然指针可以在c#中使用,但使用指针的代码必须被标记为“不安全”.“这种做法是非常不鼓励的,而是使用推荐信.
  • 精度损失. c#不允许隐式类型转换导致精度损失. 如果精确性即将丧失, 需要显式转换.

内存管理

也许c#和c++之间最关键的区别是内存管理.

在C语言中,动态内存(i.e.(内存分配是事先不知道的)使用 malloc 函数和释放使用 free. 程序员需要手动管理内存. 因此,内存泄漏是C代码中的常见错误.

c++中的内存管理得到了改进,因为内存管理是半自动的. 可以使用称为“智能指针”的对象,这样程序员就不必手动释放内存. However, 在某些极端情况下(循环引用),智能指针不足以防止内存泄漏.

c#使用垃圾收集器(GC),它自动释放不再使用的内存. 虽然这看起来很理想, 有时,GC使释放包含系统资源而不是内存的对象变得困难.g.(文件句柄或TCP连接). 在这种情况下, 可能会出现称为“资源泄漏”的现象, 程序员必须手动释放保存资源的对象. 在这些罕见的情况下, c#中的回收比c++中更加复杂, 就像c#中对象的销毁一样 不确定性.

编译:二进制文件vs. 字节码

编译c++ 立即转换成机器二进制代码. c#被编译成字节码,然后被编译成机器二进制代码 .NET. (之前”.网络核心,” .. NET是微软的现代、跨平台的原始替代品 .微软网络框架.)

尽管c++在这些不同的编译方法中具有性能优势, c#有一个强大的特性叫做“反射”,,它支持使用在运行时收集的信息进行对象实例化和方法调用. 例如, 可以直接调用方法的名称, 尽管该方法在编译期间不可用. 根据定义,c++不能有反射,因为它是立即编译的. C++ has 运行时类型信息 instead. 这是一个功能弱得多的特性,因为它仅用于具有虚函数的类型.

c++也有在编译时根据变量类型生成的代码形式的模板. 而不是模板, c#有泛型. 泛型不是在编译时解析,而是在运行时解析. 因此,模板比泛型更快. 另一方面,泛型不需要为每个新的变量类型增加额外的内存.

特征比较

FeatureC++C#
编译直接转换成二进制以字节码
编译时间LongShort
内存管理手动或半自动智能指针由垃圾回收器自动执行
运行时的速度尽可能快比c++慢
运行时内存要求Optimal比c++还多
容易出错的对于没有经验的程序员来说容易出错更多的系统
类继承单、多、虚拟只有一个,多个带接口
泛型代码模板-编译时泛型-运行时
可移植性编译器可用于几乎所有的操作系统, 但是需要为每个目标编译代码编译后的字节码可以在许多操作系统上运行
学习Steep learning curve; time-consuming; can be complex for novice developers; smaller 社区 with fewer learning resources being producedHigh-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# vs. c++:哪种语言更好?

在速度和内存效率方面,c++无疑是赢家. However, 如果现成有一个好的c#库,但c++没有这样的库, c#最终会产生一个更快的解决方案, 而c++实现可能会变得更慢.

c#的开发通常更快. 如果应用程序不执行时间紧迫的任务, 选择更简单、更不容易出错的语言是有意义的.

传统上,对于非windows环境,c++是正确的选择,但这改变了一次 微软开始鼓励开源实现 of .NET. 相同的c#字节码几乎可以在任何平台上运行, 这使得它成为简化可移植性的首选语言.

由于反射, 当编写必须支持远程函数调用的库或需要使用运行时可用信息生成代码的类似特性时,c#是更合理的选择.

尽管这两种语言都支持模块化设计, 在c++中更难维护, 它使用c语言设计的头实现了该功能,这种方法现在已被更现代的方法所超越. 这通常会导致c++的编译时间明显长于c#到字节码的编译时间.

c++是一种更复杂的语言,所以 c++程序员 c#比c#更容易转换. 但是如果你的团队同时包含c++和 c#开发人员在美国,这两种语言可以混合使用.

选择合适的语言

如果您需要高性能,那么几乎所有情况下的答案都是c++. “高性能”指的是代码. 如果您正在使用现成的库来完成时间紧迫的工作, 代码的性能可能不是决定性因素.

如果性能不重要,则需要考虑开发时间. 如果您可以从头开始,那么使用c#开发项目可能是更好的选择.

如果您有一些开发时间,但性能并不重要, 选择取决于技能 可用的开发人员. 请记住,开发人员的流畅性可能会严重影响未来的代码维护. 只要有可能,考虑一下你的团队更喜欢的语言.

了解基本知识

  • 为什么c++很有用?

    c++是一种高度优化的面向对象编程语言,用于需要时间和内存关键操作的环境中.

  • 为什么要使用c#?

    c#用于需要快速且不易出错的开发场景.

  • c++和c#的区别是什么?

    c++更快,内存占用更小, 但是c#比c++更容易学习,也更不容易出错.

就这一主题咨询作者或专家.
预约电话
Jakiša托米奇的头像
Jakiš托米-ć

位于 柏林,德国

成员自 2019年11月13日

作者简介

Jakiša是一位经验丰富的全栈开发人员,拥有超过15年在多个平台上创建c#和c++应用程序的经验. 他的工作包括Windows API, 嵌入式编程, 分布式系统, 混合现实, 和DevOps. Jakiša拥有萨格勒布大学数学和计算机科学硕士学位.

Toptal作者都是各自领域经过审查的专家,并撰写他们有经验的主题. 我们所有的内容都经过同行评审,并由同一领域的Toptal专家验证.

专业知识

工作经验

15

以前在

微软

世界级的文章,每周发一次.

订阅意味着同意我们的 隐私政策

世界级的文章,每周发一次.

订阅意味着同意我们的 隐私政策

Toptal开发者

加入总冠军® 社区.