比较C++和C#

来源:互联网 发布:matlab数据采集卡价格 编辑:程序博客网 时间:2024/04/30 00:28
by Bill Wagner

.NET的主要卖点之一就是,与以前相比,程序员可以在更少的时间内完成更多的工作了。为了证实这一点,我用C#重写了一个旧的C++代码例子。猜猜结果如何?我发现实现相同的功能所花的时间少了很多,需要写的代码量也更少了,而且运行得更快了。旧的C++代码样例用了很多C++ Standard Library,所以我可以看到与C++类库相比,.NET Framework Class Library(FCL)有哪些优势。

我通常需要运行控制台应用程序来得到一个文件的输出结果。例如,当我在修改.NET Global Assembly Cache(GAC)时,就需要运行Gacutil.exe(.NET SDK命令行工具之一)来得到输出结果,然后将它粘贴到Microsoft Word文档中。

现在,新的C#代码样例就可以为我完成这个步骤了。它从标准输入(FCL中的System.Console.In)或从一个文件得到输入内容,然后将该输入内容反馈给标准输出(System.Console.Out),提供给剪贴板(Clipboard)。

该程序执行了两个简单的任务。首先,它解析输入参数,确定要拷贝的文本来自哪里。然后它保留所有文本的一个副本,将它反馈给标准输出,并将一个副本发送到剪贴板。我决定将所有的文本反馈给输出(即使是在拷贝到剪贴板时),这样更方便用户的使用。在运行一个命令后看不到任何结果总是会让我感到很不安,所以将输出结果反应到屏幕上会让我感觉好一些。

我的C#程序很短,完整的代码请见列表1。你可以将它与列表2中最初的C++代码进行比较。Main()方法解析输入参数,创建了一个text reader输入流来读取文本。私有方法copyStreamToClipboard()读取输入流并将它发送到输出和剪贴板中。创建输入流是很简单的,只需解析输入参数并打开一个文件(如果需要的话)。

拷贝到剪贴板也只需两个简单的步骤。见列表1中的copyStreamToClipboard()方法。首先,它从输入流中读取单独的一行文本,将它反馈给标准输出,并将它添加到一个StringBuilder对象。最后,在从输入流读取完所有的文本后,就用Clipboard类的静态的SetDataObject()方法将结果拷贝到剪贴板中。

这个C#版本的代码例子同最初的C++代码量几乎是一样的。然而,这个版本有几个优势。同最初的版本相比,我不用操心剪贴板的内存管理了。这就节省了我用来测试和调试的时间,尽管这个程序本身就很小。.NET Framework为我全面地处理了内存管理问题。而且,.NET collection类也使我们可以更简单地读取和保存字符串。

我花了些时间在很大的输出文件上测试这个版本,看看.NET版本同最初的版本有什么不同。不管文件或输入命令有多大,.NET版本都不会中断。而且,在执行时间上,两者的区别也不大。

自从我编写了这个.NET版本的应用程序以来,我就一直在用它,还没发现有什么不同。一切都很正常。今后我还要做些修改,添加打印功能,这样你就可以将任何命令的输出发送到一台打印机了。


关于作者:
Bill Wagner是
SRT Solutions的Windows技术专家。他是Visual Studio Magazine的撰稿编辑,也是The C# Core Language Little Black Book一书的作者,这是一本C#开发人员的高级参考书。在16年的软件开发实践中,Bill在许多项目中都是重要的开发人员。他曾为工程和商务应用程序、桌面和Web环境开发过软件。他在2D和3D图象和多媒体软件方面也很有经验,包括为The Lion King Animated Storybook开发的视频回放引擎。他的联系方式是wwagner@SRTSolutions.com
原创粉丝点击