C + + MFC与.NET?

我的同事正在使用Visual Studio 2002并使用C ++ MFC。 我正在用C#开发。

以前没有任何问题,但现在质疑我们的客户,如果我们真的应该在不同的环境中发展。 我的同事们认为(当然)我应该转向C ++ MFC。 我认为他们可以使用.NET而不是MFC。

有什么要学习的MFC? 感觉有点过时了,还是我错了? 什么是反对和.NET与MFC比较?

编辑:

我们正在为核工业开发过程系统和辅助应用程序。 主要的应用程序是模拟旧计算机系统并使用C ++ / MFC的模拟器。 这是非常紧要的,也许核心应该仍然是原生的C ++。 但是仿真器和所有周边应用程序的GUI并不特别重要。

是否有真正的理由,你应该replace现有的MFC应用程序?

我已经使用MFC和Windows窗体很长一段时间了。 我来自电子游戏行业,所以不得不写很多年的桌面应用程序,在.net之前,MFC是非常有用的。 甚至在此之前,我正在用纯Win32编写工具。

MFC肯定有它的怪癖,但总体来说,它使生活变得更容易。 将OpenGL和Direct3D集成到自定义视图中非常容易,一旦你掌握了编写自定义控件的过程,那就太简单了。 最重要的是,我可以用纯粹的C ++编写代码,这恰好是我select的语言。 另外我发现MFC非常高效和活泼。

逐渐MFC开始获得外部控制库的支持,特别是对接/工具栏库,所以我的工具,如3D模型查看器和关卡编辑器,都显得非常甜美。

我编写的大多数应用程序都以编程的方式创build了UI,所以对话框/窗口布局工具已经足够满足我的需求。

MFC 9也非常酷,尤其是使用Microsoft作为Feature Pack一部分发布的Ribbon控件/停靠库。 所以老狗还有生命,当然! 🙂

当.net 1.0出来时,我发现这个过渡相当简单,因为它支持托pipeC ++。 这不是很好,但给了.net框架一个相对简单的入口。 但是,当我开始编写需要Windows窗体devise器的工具的时候,.NET 2.0的时代已经到来了。 我决定重新开始,学习C#,我喜欢 – 虽然我不会习惯有新()没有删除();)。 然后,我开始编写用户控件,发现整个体验非常好,简单明了。 .net框架是巨大的,得到了​​很好的支持,通常我发现在C#/ .net中做所有事情都比较容易。 另外,编译非常快,在Visual Studio中重构的能力非常棒。

c#/ .net的美妙之处在于它不会限制您只能使用托pipe代码编写代码。 如果性能是一个问题,或者您需要在平台之间共享代码,您仍然可以使用非托pipe代码。 例如,我的math库是用C / C ++编写的,我把它放到一个库中,使C#能够包装/使用相同的代码,尽pipe这只是暂时的。 我将把这些库移植到C#中,所以一切都是纯粹的.net。

我想提到的最后一个经验是,我已经花了几个月的时间从控制台游戏编程,花时间编程InterWeb。 我一直在使用微软的堆栈,在ASP.net / C#编程,我不得不说,这是非常好的,所有的C#的知识直接适用。 唯一的学习曲线是ASP.net,而不是语言和支持库。 随着.net 3.5(LINQ的甜蜜)的到来,.NET框架中的C#生活是可爱的。

无论如何,我不想把这个变成我生命中的故事,但我只是想简单地体验一下已经通过了所有你问过的技术的人。 我也想提一下,你可以尝试不同的语言/框架。 我已经为iPhone编了一年了,现在已经变得非常喜欢Objective-C了。 这都是编程,而且都很好。

关于MFC / .net,都有它的优缺点,我真的不介意MFC,但是就前进而言,我可能会坚持使用C#/ .net,但是请了解它是如何工作的。 我要说的唯一传奇的事情就是理解.net中的内存是如何工作的,尽pipe“这一切都照顾好了你”;)

你对C / C ++的了解应该完全独立于你是否使用MFC,它仍然是一个关键的语言(特别是在基于控制台的video游戏编程中),但是对于Windows上的桌面应用程序编程,争论越来越难。净。 它快速,简单,拥有强大的工具支持,优秀的第三方库,一个巨大的增长型社区,现在是跨平台(Mono),可以让你在当前/新兴的微软技术(ASP.net,WPF,Silverlight,WCF等等)。

尽pipe如此,我仍将Visual Studio设置为C ++环境。 有些习惯永远不会死

MFC和.NET几乎是相反的极端,每个都以自己的方式彻底蹩脚。

使用MFC大致上是在第二次世界大战剩余build筑物的衰落残骸中生活的顺序。 没有任何迹象可以警告危险区域,如果你知道如何find它们,那么在哪里可以find自来水,电或者厕所,哪怕它们都在那里,也不会立即发现。 就像任何腐烂的build筑物一样,墙壁上有很多洞,所以你可以随时随地离开,只要你想。 同样,从外部世界拖拉东西也是非常容易的,不过要做到“拖拽”才行。

使用.NET就像生活在杜鲁门表演中 。 它适合一个人的现实生活应该是什么样的想法。 在它的界限之内,生活可能看起来是乌托邦式的。 然而,最后,它只不过是一个令人愉快的被监禁的监狱牢房,而它所描绘的任何生活都不是真实的。 你与外界的所有互动都受制于一位导演,他们的目的主要是为了提高自己的评级; 你的福利只被视为影响他的程度。

与大多数监狱不同,.NET确实有一个很好的逃生路线(标有“P / Invoke”)。 然而,就像任何好监狱的逃生路线一样,这条长达一英里长的污水pipe道。 大多数居民都知道它的存在,但几乎所有的居民都是十几岁的青less年。 less数谁把它实际使用,只有在必要的情况下。 我们这些曾经觉得有必要的人经常意识到,留在外面不要再回去了。

编辑:因为有些人想要在每个人的背面使用圆圈和箭头以及段落作为证据:MFC的优点和缺点是它主要是API的一个相当薄的包装。 这是一个弱点,因为它的覆盖面有相当多的漏洞,并且因为它“平滑”API本身不适合的地方相对较less。 例如,如果使用COM实现某些function,那么通常会直接在使用它的代码中显示出来。 这是一个优势,因为扩展MFC来处理默认情况下的区域相当容易,并且在需要时可以简单地绕过它并直接使用API​​。 它也经常更新,所以虽然目前可以产生合理的“现代”外观应用程序,但情况并非总是如此。 鉴于它的历史,很难预测它将继续如此。

.NET的优势和劣势在于它是API的一个“更厚”的包装。 它在API的差异方面做了更多的工作,所以(比如)在COM中实现的部分看起来/行为与直接C函数调用的部分看起来不同。 从.NET内部,差异消失。 .NET(当前)是微软最受青睐的技术,所以它的更新频率更高,并且确保你的UI遵循最新的指导方针做得更好。 我的猜测是,它比MFC持续一段时间的可能性要大得多。

.NET的弱点是绕过或延伸要困难得多。 基本上,你到外面世界的唯一途径是通过P / Invoke。 即使是小游览,也是丑陋而痛苦的。 试图经常使用它,或者任何接近重大扩展的事情都是一个受虐狂行为。

如果(几乎)所有你写的东西都可以适应.NET的支持,那么这是一个明智的select。 只要你留在它的界限内,它就会更干净,更顺畅。

如果您编写的代码经常需要超出框架支持的范围,那么MFC可能会为您工作得更好。 使用.NET,.NET模型适用于您的整个程序。 使用MFC,编写使用MFC用于其UI的程序相对容易,而对于MFC不支持的其他任何内容,则可以做任何事情。

我认为知道C ++是有价值的,因为这个语言将会是很长一段时间。 你永远不知道什么时候可能需要用C ++编程,而在今天的就业市场上,只有更多的语言才能提高你的简历。

至于MFC ,我正在尽力摆脱它。 计算标准已经老化了(接近20年了,我认为),但是微软仍然看到用新版本和function包来支持它的价值。 从这个angular度来看,我怀疑MFC会很快消失。 但这并不意味着我想用它来编程。 在C#中编程的stream畅性和易用性在一周中的每一天都会跳过MFC / C ++。 线程,套接字,string操作等等 – 所有这些事情在C#中比在C ++中简单得多。 另外,C#/ .NET是微软的主要技术焦点,在职业发展方面,我宁愿比MFC的开发者更加优秀。

你想要解决什么问题? 假设你同样知道C ++ / MFC和C#/ .NET。 哪个工具集可以让你构build和维护更好? (更好是主观的,但又取决于你的目标)

除非我使用.NET中没有的本地API来完成大量的工作,否则我将会使用.NET。 C ++是一门伟大的语言,没有什么能够阻止你在Managed C ++中进行编码,从而保持.NET框架和内存pipe理。

相比之下,我的观察是,与.NET Windows窗体相比,MFC框架非常笨拙和笨拙。

这不是一个与另一个。 从版本1.1开始,Windows窗体支持由本地客户端(如IE或MFC对话框)托pipe。 MFC 8.0在Windows窗体支持类中包装了必要的托pipe代码,所以您不需要编写自己的代码。 根据您当前项目的要求select合适的图书馆。

然而,MFC不仅仅是它的GDI包装类。 有一次,它被devise成底层Win32 API的OOP替代品,就像今天的.Net一样。 但是,MFC并没有阻止Win32 API的增长,现在我可以说win32 API的增长超出了MFC可以支持的范围。 近十年来,API的数量增加了几十倍。

另一方面,Windows Forms只是为了替代Windows的GDI系统。 这是.NET Framework库的其余部分,用于replaceWin32的其余部分,如用于DirectX的WPF和XNA以及用于SAPI的System.Speech。 但是,我可以看到win32 APIs能够在几年内没有明显增加下载量的情况下长大。

因此Windows窗体不能完成MFC所能做的所有事情,它被devise成使得基于GDI +的RAD更容易,并且可能包括MFC不能做的事情。 然而,基于GDI +的Windows Forms正在走下坡路,因为微软重新关注WPF,而MFC则根据消费者的要求而复兴。 如果您正在devise未来的应用程序,则可能需要考虑这一点。

MFC提供的一个很好的function是Document / View框架(单个文档或多个文档),它在.NET中还没有等价的function。 当您需要创build像Microsoft的Word一样的应用程序时,此function可能非常有用和方便。 它有助于将数据模型从要呈现给用户的视图中分离出来。 我想大多数人一旦实现这个function,就会跳到.NET方面。 (微软是在这方面工作还是至less有计划在这方面工作?)

这个select有很多优点/缺点。 MFC是老式的支架,它已经存在了很长时间,并且确实显示了它的年代。 另一方面,它仍然得到很好的支持,MS不断更新以保持最新状态。

.Net框架有更好的支持,因为它有一个支持它的更大的团队,被视为在Windows上构build新部件的东西。

另一方面,MFC是Windows生态系统的重要组成部分。 如果你在这个平台上编程的话,至less应该有一个MFC的工作知识,当你最终支持一个MFC应用程序的时候(不用担心,有一天你会)从哪里开始有很好的基础。

就在一年前,我从C ++ / MFC转换到了C#/ WinForms(我知道;)。

除了语言差异之外,从MFC转换到WinForms要比反过来更容易。 我认为,如果你打算有效地维护遗留应用程序,那么知道MFC是有价值的。 然而:

我会从头开始学习MFC(给定现有技术)吗? 不,可能不是。
我会在MFC中写入新的应用程序吗? 不,可能不是。

.NET的优点远远超过了.NET的支持,灵活性和易用性。 为了什么,MFC是一stream的,我很感激有机会与它合作 – 这教会了我很多 。 但是,最终,它正在走出去。

非托pipe代码不一定执行得更快,它取决于编写的代码,以及编写代码的代码。 我已经阅读了一些复杂的基准testing报告(来源,代码项目),C#在某些方面击败了C ++,C ++在其他方面赢得了胜利。 这取决于你的领域:我写飞行模拟器的软件,因此需要一个非托pipe环境。 如果你正在制作一个GUI应用程序,C#可能是更好的select。 对于低级套接字编程,C ++可能会返回更好的结果。 我注意到在正常的操作中,C ++和C#之间没有严重的速度差异,但是我很喜欢C ++的原生可移植性,C#是它的简化。

.NET使用托pipe代码。 MFC使用非托pipe代码。 我读过非托pipe代码执行比托pipe代码更快。 所以如果你正在开发软实时代码,你可能想要使用非托pipe代码。