如果我主要是C#程序员,我可以从学习C ++中获得什么好处?

时间:2009-10-01 00:30:33

标签: c# c++

最近,每当我提到C#时,我都会注意到很多假笑和粗鲁的评论。我与之交谈的每个人都说学习Python或学习C ++。

Python是一门很好的语言,我明白了。但是我现在没有找到太多用处(对于我的用例),我听说C ++是一种更快的语言(不确定)。

所以我的问题是,当我主要用C#编程时,我可以从学习C ++(除了我的视野的知识和扩展)中获得什么好处?

18 个答案:

答案 0 :(得分:43)

最大的问题如下:

  • C ++是过去20年来系统和应用程序编程的事实标准
  • C ++是可移植的,编译器占所有处理器架构的约95%。
  • C ++可以增强你的.NET代码,我的意思是PInvoke可以用来运行用C ++编写的优化代码-OR-可以用来运行来自第三方的代码,允许你编写自定义包装器等。
  • C ++是来自泰国的linux / mac / PSP / Cray II / Random OS,它没有编译问题,因为它不能通过.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 ++只是其中之一。问自己以下问题:

  • 我能从中学到什么才能为我增添价值?
  • 作为开发人员,我能学到什么才能让我感兴趣?
  • 我能从中学到什么才能使我受益?
  • 我能从中学到什么才能帮助我进入我想要的职业道路?

你会发现这些问题会有很多重叠的答案,花点时间,找一些你感兴趣的东西,不会是一件苦差事,你会在3个月后感谢自己。

答案 1 :(得分:34)

简短回答:至少学习一些C ++(以及一些汇编语言)可以让您更好地利用,或许更重要的是,调试代码下方的软件平台。无论您使用何种编程语言或操作系统,都是如此。

答案很长:

擅长开发人员和优秀开发人员之间的差异化因素之一是,伟大的开发人员知道在一个软件中发生了什么,并且能够在技术堆栈的抽象层下快速钻取,因为最棘手的软件问题通常是由堆栈中代码下方的事情引起的。

因此,我一直建议开发人员在其职业生涯的某个阶段至少花一些时间学习几乎所有软件堆栈底部的两种语言:C / C ++和x86汇编语言。这并不意味着您需要成为其中任何一方的专家,但是掌握指针,寄存器,内存管理,堆栈和堆,非GC编辑的字符串缓冲区,泄漏等工作知识对您来说非常有用。需要深入到堆栈中来诊断问题,更好地理解奇怪的行为,或者只是在构建更高级别的软件时做出更明智的决策,而不管语言是什么。

一个类比:一旦我拆开摩托车的发动机并看到离合器如何工作,我成为了一个更好的手动变速器驱动器。这并不意味着我需要成为一名摩托车技师,只是在我的自行车内发生的事情不再是一个谜时,它帮助了我的整体驾驶技术。

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

请注意,我故意不接触有关您是否应该使用C ++编写整个应用程序的更有争议的问题。其他答案在这些论点上做得很好。相反,我只是假设C ++技能将使您受益,无论您是否继续用C#(或Java或Python或Ruby或......)编写大部分代码

答案 2 :(得分:13)

取决于。

关于C ++的事情在某些方面,它是一种比C#更具表现力,更优雅,更优雅的语言。它可以实现一些非常好的抽象(例如通用编程或RAII),这些抽象在C#中无法复制。

在这些方面,它令人大开眼界。当然,功能语言也是如此。 Python也是如此。所有这些都值得学习,即使你现在和永远用C#编写所有代码。

当然,C ++ 是一个过于复杂的混乱,而且比其他任何东西都更容易出错。如果你不知道真的那么好,那么当你最不期望的时候它就会爆炸。

当然,很多人都会大喊大叫!当你问为什么要学习C ++时。我不会。因为在许多常见情况下,C#将与C ++代码一样快或更快。 Raymond Chen和Rico Mariani之间的This旧交流很好地说明了两个平台的性能特征。

C ++有可能非常快。但它也有许多微妙的性能缺陷,这意味着大部分时间,除非你是某种无所不知的代码 - 上帝,你的代码将比同等的C#效率低。

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

根据一些很好的预定义计划,它还没有增长。它总是一步一步改进和调整,根据什么使语言更好现在。因此,它是巨大的,臃肿的,过于复杂,但它也比根据一个人的愿景严格设计的东西更具表现力,例如C#。 C#的设计是对OOP的不健康的痴迷,因为它在设计时很酷。

在C ++中,OOP向外围漂移,而不是有意识的设计决策,但是因为更好的替代方案出现了。

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

这使得“成为一个更好的程序员”的论点,虽然这是一个有效的论点,但对其他语言也是如此。你当然也应该懂一种函数式语言。而Python,或类似的实用,高级“让程序员更容易”的语言。

答案 3 :(得分:11)

我过去10年来一直是C ++开发人员,过去两年,我一直在使用java进行新产品开发。我还在C#做了一些编程,只是为了学习它。根据我的经验,我会说C ++是一种具有挑战性和高性能的语言,它有利于计算机科学学生理解编程概念和算法。 C ++的其他用法是协议实现,它不会经常改变,例如实现SIP代理或HTTP服务器......

对于需求经常变化的实践产品开发,我建议任何高级语言,开发人员可以专注于应用程序逻辑而不是重新发明轮子。例如,最近我开始了一个开源项目xcapserver,我可以使用Java技术(Glassfish,REST,log4j,eXist db)在两天内快速完成原型,但我想精益推进库,再次它是一个协议预计不会经常更改,所以我决定用C ++实现。我只花了4天时间让记录器使用BOOST::log工作,另外4天用Berkeley DB XML修复了线程死锁问题。

另一个方面是产品维护。我花了几天时间来修复内存泄漏和损坏,新开发人员的学习曲线与J2EE或.NET相比太高了,因为很容易找到开发人员和维护更容易。

在排序方面,C ++是一种很好的编程语言,我建议所有开发人员学习这些语言,但由于处理器变得越来越快,越来越便宜,所以性能不是原因,因此我认为它没有太多用处。

答案 4 :(得分:6)

有理由使用几乎任何语言。

C和C ++的用途在于它们被编译为本机代码而不是在虚拟机上运行。有一个速度优势,它还意味着这些程序可以在没有安装50MB +框架的情况下运行。

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

这适用于您吗?不知道,因为我不知道你想要达到的目标。

您将从C或C ++中学到什么?指针,内存管理等。与C#,Java或Python等更现代的垃圾收集语言完全不同。

答案 5 :(得分:6)

学习C ++,以便更好地欣赏C#。

答案 6 :(得分:5)

除了别人说的话:

人们喜欢在简历上看到它。

学习任何语言都可以帮助您将该语言翻译成C#,这使您作为程序员更有价值。

学习另一种语言有助于您使用该语言理解样本,可以说您可以使用更广泛的样本,书籍,示例和专家。

包装器!学习C ++可以帮助你包装那些讨厌的C ++ dll以供C#使用!

也就是说,如果你是一名从未学过C ++的C#程序员,你很可能在C ++之前学习其他东西。

答案 7 :(得分:4)

2015年更新

学习斯威夫特。它将教你使用与现代C ++相同的功能和生成模式,但没有行李或许多陷阱。它在语义上也与F#重叠,因此您有机会学习函数式编程。有一个充满活力的功能社区推动了Swift的界限。

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

<强>原始

作为一名C ++程序员,我作为C ++程序员发言了15年,他在过去一年中学习和使用C#(和C ++ / CLI),除了对语言的持续着迷和广泛研究其他语言以改善我的思考

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

我会采取相反的观点:

  1. 除非你想雇佣写电脑游戏或相对低级别的组件,否则忘记将C ++作为一种语言,因为那里有足够的熟练C ++程序员,游戏行业会产生更多(可能质量不一样)。这不会改善你的职业前景。
  2. 花一些时间研究C#的有趣深度,运算符重载的含义,如何使用不安全的代码等。在Nutshell中选择一本优秀的C#书,并能够通过并注释所有内容更深入地解释如何使用这个成语。
  3. 学习像Ruby或Python这样的动态语言,将它用于一些实际任务,例如生成或修改测试文件,这样你就会欣赏操作文件,结构和字符串的简单语言。
  4. 学习F#或其他函数语言并开发一些关于函数式语言对并行处理和云的含义的假笑:-)在几年(或更早)的时候,当人们争抢时,这将产生巨大的职业收益对于精通云的程序员。请记住,在您将旧语言与旧语言进行比较之前,您尚未学习新语言,因此您需要能够在何时何地使用F#(或Haskell)而不是C#进行教诲。

答案 8 :(得分:4)

你可以通过学习像Clojure,Haskel这样的函数式语言来获得更多的实用性(或者可能是F#,因为你明显对CLR感到满意)。他们有一个不同的底层编程模型,它将以学习新语法的方式扩展你的视野。

另一方面,学习C实际上比学习C ++更有用。这将把你的学习重点放在指针,记忆和“接近金属”主题上。

答案 9 :(得分:3)

关于C / C ++,以下是根据我自己的经验想到的一些事情。

  1. 学习C / C ++可以提供与详细操作系统功能和原始内存更紧密协作的经验。例如,许多音频,视频和游戏应用程序需要此级别的访问才能发挥最佳性能。

  2. 了解如何与使用C / C ++编写的组件和库互操作是一项非常方便的技巧。有许多有用的库在C#中仍然没有足够的等价物。如果您了解C / C ++和其他语言的结构,TSAPI(电话),各种文件格式库和遗留组件在C#中更容易使用。

  3. 如果您正在使用Windows应用程序,通过C / C ++体验Win32可以让您了解在非托管代码中编写的许多其他应用程序是如何工作的;即使您没有可用的源代码。然后,您可以更有效地使用P / Invoke来处理通常不可用或太不透明的库来处理其他情况。

  4. 许多技术虽然可能具有黑帽性,但使用C#更难实现。使用C / C ++更容易实现DLL替换,重写函数入口点,将代码注入其他进程以及生成内联汇编代码等问题。虽然不是不可能用C#。

  5. 最后,对未管理对象的微调控制更适合用C / C ++编写的代码。例如,Windows上的重叠I / O,某些套接字库功能(例如UDP多播)和设备控制之类的东西比C#有更多可用的C / C ++示例。但是,这些都是非常深奥的,通常不会在C#应用程序中处理。其中一些可能在未来的API或框架中具有等价物。

  6. 总之,我建议学习C / C ++的主要动机是扩展您对C#中无法访问的其他系统的了解。学习Python将是向另一个方向迈出的一步,学习代码构造的其他样式和语义更有可能获益。其他人编写的C / C ++代码往往没有更多有益的也无法识别的模式,比如用Python,Ruby或Lisp编写的软件。

答案 10 :(得分:3)

为C#开发人员学习C ++的最佳理由是学习新的编程范例。 C ++不仅仅是一种“面向对象”的语言,因此有机会学习解决问题的新方法。使用C#3.0和.NET 3.5,C ++不会提供尽可能多的独特范例,但如果您不使用它们,那么有效的C ++编程将迫使您学习它们。

特别是,C ++仍然提供了一种非常强大的通用编程范例,这是C#无法比拟的。 STL强制您使用许多C#开发人员避免或不使用的函数式编程概念(例如LINQ扩展和lambda)。

我还发现它增强了人们对词汇范围的理解和欣赏。诸如RAII或C ++命名空间之类的概念确实迫切需要非常谨慎地管理范围......在C#中,存在许多这些问题,但不那么“在你面前”。模板元编程是C ++提供的另一个独特的概念,C#没有。

答案 11 :(得分:3)

学习C ++,这样你就可以把你的大脑弄得一团糟。

答案 12 :(得分:3)

在性能方面,速度要快得多。如果您有任何想要进行游戏编程或高性能计算的愿望,那么C ++就是一种很好的语言。

但是,我也会说C ++很难学。没有垃圾收集器,编译需要解密的错误,以及对外部库的需求都是难以克服的。

答案 13 :(得分:2)

使用每种编程语言,您都可以增强对景观的看法并应用经验教训。虽然我从未编写过生产C ++应用程序,但是对我来说理解该级别的系统非常有教育意义。如果你有空闲时间,请潜入!您可能还想探索不安全的C#代码。它可以帮助您了解C ++的许多高级功能。

答案 14 :(得分:2)

为了尊重OP的愿望,我不会说我认为C ++如何帮助C#程序员对代码有不同的看法。 ;-p

严重的是,作为一种工具,C ++的主要优点是它是多平台的。用C ++编写的代码可以在各种各样的平台上运行。

另一方面,与C#相比,C ++的一大缺点是编写正确的代码需要更长的时间。

虽然理论上可以用C ++编写更快的代码,但这假定开发时间无限。实际上因为我可以在C#中更快地编写更复杂的代码,所以我可以花费额外的时间来优化代码。

答案 15 :(得分:1)

这取决于您正在制作的节目。我之前从未使用过Python,所以我不能对此发表评论。

至于C ++;由于速度快,大多数性能关键软件都写在其中。你对硬件有更多的权力,但是这种力量带来了责任感和更陡峭的学习曲线。它也无法访问.NET;所以你可能不得不深入研究Win32编程来完成一些任务!

使用C ++的例子:游戏开发,航空航天,空中交通管制系统。

就个人而言,我认为学习C / C ++会让你成为一个更好的程序员,它可以教你很多东西;特别是关于性能和记忆。而且..几乎所有重要的东西都是用C ++构建的。

答案 16 :(得分:1)

首先,听起来您有兴趣了解更多信息。这确实是成为优秀程序员最重要的部分。

那说;几乎所有大型开源项目都是用C或C ++编写的,如果你想利用或建立在你需要知道语言的人之上。在简历中使用大型开源项目不仅看起来很棒,而且还可以让你检查一些非常好(而且非常糟糕)的代码。对我来说,这是一次非常宝贵的学习经历。

答案 17 :(得分:1)

学习任何新语言或不同语言的主要原因是学习一种新的和不同的方法来解决编程中的问题。 C#和C ++肯定有一些相似之处。他们也有一些相当大的差异。起初,这些差异似乎(正如少数人所提到的)主要是语法。然而,进一步的研究将揭示出远远超出简单语法的更大差异。

这意味着如果你决定学习C ++,你需要计划在获得更多收益之前花费相当多的时间和精力。如果你想要的东西与其他东西完全不同,你可能会对其他东西感觉更好。我对一种完全不同的语言的建议是Scheme - 基本上是Lisp,有一个很好的清理。

还有很多其他功能语言,其中一些非常酷 - 但是Lisp已经比很多可能的继任者长了许多,而且我认为它还会比其他功能更长。如果我是一个博彩人,我会打赌Lisp比F#活了几十年......