如果我主要是一名C#程序员,学习C++有哪些好处?

28

最近我提到C#时,开始注意到很多人冷嘲热讽或者发表不友好的评论。每个我交谈过的人都说学Python或者学C++。

Python是一门好语言,我理解。但是目前(根据我的用例)我没有找到太多它的用途,而我听说C++是一种更快的语言(不确定)。

因此,我的问题是这样的,除了获得知识和拓宽视野外,如果我主要使用C#编程,学习C++有什么优势呢?


2
说明您的用例会使得给出一个好的答案变得更加容易。 - Ramon Zarazua B.
请解释一下您的职位、长远目标以及您的背景情况。 - Firoso
9
顺便说一下,学术界的人经常是些傻瓜,几乎不了解真实世界,就像自学的专业人士对学术领域一无所知一样,他们往往将经验视为比追求知识更重要。两种观点都要持怀疑态度。我猜你可能会被那些认为每件事都应该符合他们对世界的看法的学者们嘲笑。他们不比 Linux 狂热者、M$ 狂热者或 Nemerle 狂热者更出色,他们都有自己的位置...但如果他们不愿意适应,那么他们在行业中就没有立足之地。 - Firoso
3
我认为学术界不会学习Python或C++...学者们讨厌C++ :) 目前函数式编程语言似乎有很大的发展势头。 - rpg
如果你只会C#,我不会尊重你。 <smirk> - Matt Joiner
显示剩余2条评论
18个回答

44

最大的问题如下:

  • C++是过去20年中系统和应用程序编程的事实标准。
  • C++具有可移植性,并且存在适用于大约95%所有处理器架构的编译器。
  • C++可以增强您的.NET代码,我的意思是可以通过PInvoke运行用C++编写的优化代码 -OR- 可以用于运行来自第三方的代码,允许您编写自定义包装等。
  • C++符合Linux/Mac/PSP/Cray II/泰国的其他操作系统,不会出现编译问题,因为它不是通过.NET CLI运行(我必须承认是一件美妙的艺术品),而C#目前绑定在Mono实现和Windows上通过.NET。

作为一名专业的.NET应用程序员,我喜欢C#,我崇拜架构师们走过的地方。但是,我认为C++是你可以/将会学习到的最重要的语言,因为它将比现代行业中的任何其他语言打开更多的职业门路。如果你知道C#,学习它只需要几个月的时间。如果你有软件工程背景,我建议读Timothy D'Orazi的C++书籍。

后记: C++是一种工具,就像C#或钻头或猎枪(有争议),适合任务的工具,我宁愿死也不会用C++编写函数式代码,同样,我不会在F#中进行应用程序开发,它们都是很好的语言。学习你感兴趣的东西!如果您想成为更好的程序员,请学习C++,如果您想成为更好的应用程序开发人员,了解您已经在其中工作的框架内的新技术可能更有优势!您是一位C#程序员,您学会了WPF吗? WCF? C# 4.0的功能呢? 您掌握了lambda函数和表达式树吗?您可以从这里开始探索更多方向,C++只是其中之一。问自己以下问题:

  • 我可以学到什么能够给我带来价值?
  • 我可以学到什么作为一名开发者会激起我的兴趣?
  • 我能学到哪些东西可以使我在当前位置受益?
  • 我能学到哪些东西可以帮助我进入我想要的职业道路?

你会发现这些问题有很多重叠的答案,花点时间找到一些你感兴趣且不会觉得学起来很枯燥的东西,三个月后你会感谢自己的。


5
关于后来的想法:任何语言都可以在几个月内学会,但要精通一门语言需要多年时间。看看那些努力理解C#或C++中的关键概念,如泛型、模板或声明式编程等概念的“资深”开发人员的数量,就会明白这一点。 - James Schek
3
同样地,动态性、方差、lambda表达式、表达式树、匿名类型,甚至语言无关的内容如ADT(抽象数据类型)、存储/搜索效率和算法分析。 - Firoso
1
我认为C++更多是de jure而不是de facto。 - alsor.net
3
你误把C++和C混淆了。你在项目点中描述的那些“好用”的语言特性属于C语言,而不是C++。 - Matt Joiner
1
实际上它们两个都是有效的,但我认为对于 C 而言比 C++ 稍微“更正确”一些。 - Firoso
显示剩余2条评论

36

简短回答: 学习至少一些C++(以及一些汇编语言)可以帮助您更好地利用和调试您代码下面的软件平台。无论您使用的编程语言或操作系统是什么,这都是正确的。

详细回答:

在我看来,优秀的开发者和卓越的开发者之间的区别之一是:卓越的开发者知道软件中底层的情况,并且能够快速地钻进技术堆栈的各个层次,因为最棘手的软件问题通常是由于您代码下面技术堆栈的原因引起的。

因此,我一直建议开发人员在职业生涯的某个时刻花费一些时间学习两种几乎存在于每个软件堆栈底部的语言:C / C ++和x86汇编语言。这并不意味着您需要成为其中任何一种语言的专家,但当您需要深入堆栈诊断问题、更好地理解奇怪的行为或仅仅在构建更高级别软件时做出更明智的决策时,具有指针、寄存器、内存管理、堆栈和堆、未经垃圾收集的字符串缓冲区、泄漏等方面的工作知识是非常有用的,无论使用什么编程语言。

一个类比:在我拆开摩托车发动机并看到离合器如何工作后,我成为了更好的手动挡汽车驾驶员。这并不意味着我需要成为摩托车技师,只是当我了解了我的摩托车内部发生了什么时,它对我的整体驾驶技能有所帮助。

此外,无论您使用哪种语言或框架,对于必须直接调用底层平台的项目,C / C ++知识都非常有用,有时是必需的。

请注意,我故意没有涉及关于是否应该完全使用C ++编写应用程序的更具争议性的问题。其他答案已经很好地讨论了这些论点。相反,我只是阐述了一个观点:学习C++技能将使您受益匪浅,无论您继续使用C#(或Java或Python或Ruby或...)编写大部分代码。


10
为什么会有踩?他提出了一个非常好的观点。记住那些不完全理解他们使用的抽象概念的人将永远受到其限制的影响是很重要的。一个抽象概念只有在满足你的需求时才是有用的。 - Falaina
1
到目前为止,我读过的最好的论点。 - Bob Somers
1
我认为,通过学习低级语言,您可以更好地理解低级技术,但这并不能使您成为每个任务的优秀开发人员。 - rjoshi
我完全同意这篇文章,我甚至没有学习x86汇编或其他任何东西,而是研究了计算机如何运行信息,虽然我无法告诉你具体发生了什么,但脑海中似乎有些东西在编程时对我有所帮助 :) - Dominic K
我认为学习低级别的东西更多地是关于学习你的语言的运行时(调用堆栈、垃圾回收器、对象模型或值表示等)和编译器(内联等),而不是学习C++。 - lukstafi
显示剩余3条评论

13

这要看情况。

我喜欢C++的一个方面是,在某些方面,它比C#更具表现力,更优雅。它可以实现一些非常好的抽象(例如泛型编程或RAII),这在C#中无法复制。

在这些方面,它是一个启发者。当然,函数式语言也是如此。Python也是如此。所有这些都值得学习,即使您现在和将来都只使用C#编写所有代码。

当然,C++也是一个过于复杂的混乱,比其他任何语言都容易出错。如果您不真正掌握它,它会在您最不希望的时候爆炸。

当然,有很多人会在你问为什么要学习C++时大声喊出性能!我不会。因为在许多普通情况下,C#将与您的C++代码一样快甚至更快。 Raymond Chen和Rico Mariani之间的这个旧交换清楚地说明了两个平台的性能特征。

C++有潜力变得非常快。但它还有许多微妙的性能陷阱,这意味着在大多数情况下,除非您是某种全知的代码之神,否则您的代码将比等效的C#代码不那么高效。

如果您对编程语言感兴趣,C++是进化理论的一个很好的例子。 ;)

它没有按照某个伟大的预定义计划成长。它始终根据当前使语言更好的因素一步步改进和适应。因此,它很庞大、臃肿、过于复杂,但它比某个人的单一愿景所设计的东西(如C#)更具表现力。C#的设计过于迷恋面向对象编程,因为当时它很酷。

在C++中,面向对象编程逐渐漂移到了边缘,这不是出于有意识的设计决策,而是因为出现了更好的替代方案。

C++是一门有趣的语言。我建议学习它只是为了成为一个更好的程序员。但是我并不认为你需要实际地使用它。当然,它会使某些任务变得更容易(本机互操作或编写某些小型程序,这些程序由于某种原因无法假设安装了.NET框架),但对于大多数情况,你可能不需要它。

这就留下了“成为更好的程序员”的论点,虽然这是一个有效的论点,但其他语言也同样适用。你还应该了解一种函数式语言。以及Python或类似的实用高级“让程序员更容易”的语言。


10
愿上帝保佑STL。 - Gab Royer
5
这本来是一条不错的评论,但是:"过于复杂混乱","比其他大多数语言更容易出错"。证据呢? 在我看过的大多数基准测试中,C++的运行速度比C#快。当C#/Java和C++一样快或更快时,它们几乎肯定使用更多的内存。"除非你是某种全知的编码之神,否则你的代码将比等效的C#代码效率低下。" “庞大、臃肿、过于复杂”。讽刺的是,C#核心具有更多功能,ISO标准文档也更大。"面向对象编程有点漂移到了边缘",但在C++中,OOP仍然是必不可少的。 - rpg
3
你是说C++并不复杂吗?“当C# / Java的速度与C++相同或更快时,它们几乎肯定使用了更多的内存”,是的,你会注意到我从未声称它们使用比C++更少的内存。如果你认为C++不是一种庞大而复杂的语言,那么很明显:你不了解C++。至于面向对象编程,在STL中呢?在Boost中它被广泛使用吗?至于标准,我从ECMA获取的C#标准书是507页,不包括索引。C++98则有703页。 - jalf
1
你知道吗?你可以自由地成为一个狂热的语言粉丝。我们中有些人更喜欢更加细致入微,如果这让你不喜欢我的评论,那就这样吧。C++有很多值得喜欢的地方,这也是我写这篇答案的原因,但是如果你假装它是某种神圣完美的语言,或者它很容易使用,那么你会对自己和OP造成损失。 - jalf
1
Ricom/Chen事件:R. Chen对STL/boost不熟悉(他自己也承认了),他一开始就使用getline和std::string,然后几乎立即转向WinAPI。到他完成时,他已经使用C而不是C++。R. Chen是一位出色的C编码人员,但我不会说他在C++方面同样出色。语言 shootout 是一个不错的基准,但我的大部分“证据”来自第三方的推荐、我的编程经验以及使用C#软件的经验。顺便说一句,每次我质疑C#的性能时,都被称为粉丝,很奇怪... - rpg
显示剩余6条评论

12
我是C++开发人员,已经有10年的经验,最近两年,我一直在使用Java进行新产品开发。我也做了一些C#编程只是为了学习它。根据我的经验,我认为C++是一种具有挑战性和高性能的语言,适合计算机科学学生理解编程概念和算法。 C++的其他用途是协议实现,这些协议不经常改变,例如实现SIP代理或HTTP服务器。
对于实践产品开发,其中需求经常变化,我建议使用任何高级语言,使开发人员可以专注于应用程序逻辑而不是重新发明轮子。例如,最近我开始一个开源项目xcapserver,我能够在两天内使用Java技术(Glassfish,REST,log4j,eXist db)快速进行原型设计,但我想要学习boost库,而且这是一个协议,预计不会经常更改,因此我决定使用C++进行实现。我花了4天时间使BOOST::log日志记录器工作,并花了另外4天时间解决Berkeley DB XML线程死锁问题。
另一个方面是产品维护。我曾经花费了数日和夜晚来修复内存泄漏和损坏,并且新开发人员的学习曲线太高,相比之下,J2EE或.NET更容易找到开发人员,并且维护要容易得多。
总之,C++ 是一门很好的编程语言,我建议所有开发者都去学习,但是随着处理器变得越来越快,价格也越来越便宜,所以性能已经不再是一个问题了。

13
如果你不得不花很多时间修复内存泄漏,那可能是你需要提高C++编程技能的提示。有很多技巧和习惯可以将内存泄漏降至最低。如果你使用智能指针类,通过构造函数/析构函数分配和释放内存,并在每次使用new时仔细考虑一下,你几乎不会出现内存泄漏。 - piotr
4
谢谢您的建议!我之所以在修复内存泄漏/损坏,是因为我在C++编程方面技能很好,并掌握了我们产品中修复内存泄漏/损坏的方法,所以每当问题出现时,我都会挑战自己去解决它。这并不意味着我编写了代码,但也不意味着我不需要提高自己的技能 :)。 - rjoshi
1
没有官方的Boost日志库。这两个库都没有被接受进入Boost。 - rpg
1
我知道 boost::log 不是官方库之一,它是两个提交的库之一,但我认为您没有理解我的重点。我的观点是仅仅为了重用一些现有的库而花费了如此长的时间,而有多少开发人员会在 C++ 中编写自己的自定义日志记录库呢?在 Java 中有两个标准日志记录器,例如选择 log4j 或使用 sun 默认日志记录器。你不必浪费时间重新发明轮子。 - rjoshi
C++ 最大的缺点是他们完全拒绝添加更多的标准库功能。例如日志记录、网络等。天啊,他们花了15年(至今仍在持续)才支持线程。我理解需要支持许多平台,但也许现在是时候有一些不同的兼容级别,就像 POSIX 一样。我知道反射要求太高了。 :-) - Chris K
显示剩余2条评论

6

使用任何编程语言都有其原因。

C和C++之所以被使用,是因为它们可以编译成本地代码而不是在虚拟机上运行。这样做的优势在于速度更快,同时也意味着这些程序可以在没有安装50MB以上框架的情况下运行。

几乎所有游戏(尤其是第一人称射击游戏)都是用C或C++编写的。

这是否适用于您?我不知道,因为我不知道您想要实现什么目标。

从C或C++中你会学到什么?指针、内存管理等等。这与更现代的垃圾收集语言(如C#、Java或Python)完全不同。


非常感谢您的回答,Cletus。我主要会制作Windows应用程序(意思是运行在窗口工具中的程序,不一定是在Windows操作系统中)。 我可能不会很快涉足游戏开发。 - Sergio Tapia
8
但需要注意一点非常重要的事情。Windows的C(以及C ++)API非常糟糕。如果您要使用用户界面,则最好使用C#。在处理GUI和普通Windows编程时,最好将后端库用C / C ++编写,将GUI /用户界面用C#编写。 - Ramon Zarazua B.
1
@killerfox:Windows C API有什么非常糟糕的地方吗?作为一个古老而不断发展的API,它显然包含了许多遗留功能、函数和样式,但这是否使它变得糟糕? - CB Bailey
1
没有Windows C++ API,但有几个C++ GUI库。我使用Qt,并认为它比WinForms更好,可以成功地与WPF竞争。 - rpg

6

学习C++可以更好地理解C#。


+1 你听起来像是有过C++工作经验的人。 - Steve
我以专业的身份使用C++编程5年,后来转向了C#。很高兴我了解它,但并不是很想念它。垃圾回收是你的朋友。 - Pedro Estrada
为什么有人因为这个家伙有C++工作而点赞+1? - Jamshaid K.

5
除了别人说的之外:
人们喜欢在简历上看到C++。
学习任何语言都能帮助你将该语言转换为C#,使你成为一名更有价值的程序员。
学习另一种语言可以帮助你理解使用该语言的示例,从而使你能够借鉴更多的样例、书籍、实例和专家。
封装器!学习C++可以帮助你封装那些难以处理的C++ dll,以供C#使用。
话虽如此,如果你是一个C#程序员,从未学过C++,可能应该先学习其他一些东西,而不是C++。

4

学习函数式编程语言如Clojure、Haskell(或许F#更适合,因为你显然对CLR感到舒适)可以让你获得更多的实用性。它们有一种不同的底层编程模型会扩展你的视野,而学习新语法则不会。

相反地,学习C比学习C++更有用。这将使你的学习重点放在指针、内存和“接近底层”的主题上。


1
是的,如果你想让附近的C++程序员在看到你的代码时抓住你,那么就翻译吧。或者你可以接受C和C++是不同的语言,很少有人比C程序员更不适合编写C++代码了。但函数式语言是真的。 - jalf
问题是关于学习另一种语言能带来什么收益。当然C和C++是不同的语言。注意那个眨眼?那是用讽刺的方式表达。 - Timothy Pratley
1
我应该提一下,我不是那个给你点踩的人。无论是否带有讽刺意味,我必须反对任何人的观点,即使是开玩笑地认为学习C语言就可以让你成为C++程序员。 - jalf
好的,已编辑以移除讽刺的评论,讽刺很不好。 - Timothy Pratley
1
同意的是,真正的好处在于学习如何编写底层代码。 - Ben Fulton

4

2015更新

学习Swift。它将教你现代C ++中使用的函数和生成模式,但没有包袱或太多陷阱。它在语义上也与F#有显着重叠,因此您有机会学习函数式编程。有一个充满活力的函数社区推动Swift的发展。

具有讽刺意味的是,在我目前的工作中,我为Realm提供C#绑定,我仍然在使用我的C ++技能,但在过去的6年中,我的态度并没有改变。

原文

我是一名C ++程序员,已经有15年以上的工作经验,去年在广泛研究其他语言以改善思考能力的基础上,开始学习并使用C#(和C ++ / CLI)。

我对C#作为一种语言非常非常印象深刻,特别是C#3.0的改进。

我持相反的观点:

  1. 除非你希望从事编写电子游戏或相对低级组件的工作,否则应忘记C ++作为一种语言,因为有足够熟练的C ++程序员,而游戏行业产生了更多(假定质量不一)的就业机会。它不会提高您的职业前景。
  2. 花些时间研究C#的有趣深度,例如运算符重载的含义,如何使用不安全代码等。阅读优秀的C# in a Nutshell等书籍,并可以详细解释如何使用该惯用语。
  3. 学习Ruby或Python之类的动态语言,将其用于一些实际任务,例如生成或篡改测试文件,以便您更好地理解操作文件,结构和字符串的简单语言。
  4. 学习F#或另一种函数语言,并开发自己的一些笑话,关于函数语言对并行处理和云的影响:-)几年后(或更早),这将为那些争夺云相关编程人员的人们带来巨大的职业利益。请记住,除非您能够比较新旧语言,否则您还没有学会新语言,因此您需要能够借此评论何时何地使用F#(或Haskell)而不是C#。

3
就性能而言,C++更加快速。如果你有编写游戏程序或高性能计算的需求,C++是一个很好的语言选择。
但是,我也要说C++学习难度很大。没有垃圾回收器,需要解密的编译错误以及需要使用外部库都是需要克服的困难。

那么C++在速度方面很好,对吧?它没有内置函数吗?(诚实的问题,我主要使用C#编程:P) - Sergio Tapia
直接内置?不是的。你有标准C库(与.NET框架相比非常有限),以及STL(C ++)。这些语言遵循自己构建的哲学;)。但是有很多好的第三方库,例如QT和wxWidgets。 - Ramon Zarazua B.
1
它并没有快那么多,根据计算机语言基准测试,只有大约3倍的速度提升。 - ryeguy
3
C++有STL,因此有一些东西。C++没有内置的:GUI、序列化、套接字等。 - rlbond
5
往往情况下,并不会比其他语言快。如果在C#和C++中实现相同的简单算法,而没有花费数小时对其进行优化,那么我愿意打赌,C#版本会更快。让C++运行快速需要付出许多心血、汗水和泪水。虽然可以做到,但并非易事。 - jalf
显示剩余3条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接