从C ++迁移到C#的惊喜

时间:2009-04-23 08:41:21

标签: c# c++ language-comparisons

我是C ++程序员,正在进入C#。我现在用这种语言工作了一个月,理解了许多概念。

从C ++迁移到C#时,我可能会遇到什么惊喜?我被告知有关析构函数没有按照我的意图执行。最近我尝试用泛型来做一些使用T作为基类的东西。那没用。我还有另外一个问题,但我会说明C#的经验不足。我也惊讶于我的应用程序正在吃RAM,然后我发现我需要在一个函数中使用.dispose。 (我认为它会像智能指针一样清理)

还有什么可能让我感到惊讶?

请不要抨击语言。我怀疑有谁会,但以防万一...

7 个答案:

答案 0 :(得分:4)

幸运的是,微软在这里提供了一些信息:C# for C++ Developers

结构与类的差异是C ++起源的另一个重要因素。

答案 1 :(得分:3)

我认为你已经涵盖了主要的一个。你应该阅读垃圾收集,理解为什么没有这样的析构函数,找出IDisposable模式(哪种取代析构函数)。我会说这是最重要的一个。

我要说的唯一另一件事就是警告你C#和.Net基类库非常大,为了充分利用它,还有很多需要学习的东西......一旦你了解了它的基础知识垃圾收集和你想要看LINQ的类型系统,你应该花时间探索你所在地区的相关库/框架(例如WPF,WCF,ASP.Net等)。但这一切都很好。我从C ++转到C#并且永远不会回头,我觉得它更有效率(我不是在抨击C ++,我仍然坚持:-))

答案 2 :(得分:1)

几个月前我做了几乎相同的更改(之前我已经对Java进行了更改 - 但我并没有花太多时间编写Java)。

以下是我遇到的一些最大陷阱:

属性与变量与制定者

我进入的最大陷阱之一是知道你是否必须更改属性或设置变量或使用setter来设置类的某些方面。

IList vs. List vs.其他收藏

了解IList,List和所有其他集合之间的区别(对于IList,您无法真正做到这一点的IMO)。

泛型确实有自己的陷阱

如果您打算使用大量的泛型,也许阅读本文可以帮助您避免一些错误: Check if a class is derived from a generic class

但总的来说,我会说这种变化非常轻松。

答案 3 :(得分:1)

嗯,语言是完全不同的,因为我确信你已经意识到你是否曾经使用过C#。你没有像在C ++中那样在C#中使用强大的宏或模板(我意识到C#中有泛型)。至于记忆,记住你不再处于严格控制的环境中。期望在任务管理器和类似工具中看到大量内存使用,这是正常的。有更好,更细粒度的性能计数器来查看真正的内存使用情况。此外,您可能不需要像您想象的那样调用dispose(顺便说一下,如果您还没有,请查看“使用”块)。

另一个明确的构造函数是默认构造函数,在C#中它不会创建新的Foo对象:

Foo myFoo;

你不能拥有像“无效指针”这样的东西,除非你只是把它想象成具有类型对象的引用。同样,您需要将Properties视为方法的语法糖,而不是公共成员,因为它们使用C ++语法。

确保您了解“out”和“ref”参数。

显然这不是一个大的列表,只是一些“指针”(没有双关语)。

答案 4 :(得分:1)

这是一个相当大的话题。一些想法:

C#是垃圾收集。并不意味着你可以不再关注资源分配,但一般来说你不必担心最常见的资源:内存。 / p>

在C#中,一切都是对象。没有“原始”数据类型,即使int是对象。

C#有泛型,而不是模板。模板比C#类似的语法泛型更丰富,更复杂,但泛型仍提供模板的几乎所有实用功能,没有太多麻烦。 / p>

C#具有接口和单继承。您可能会在C ++中寻找多重继承,而是使用接口或不同的设计模式(例如策略)。

C#有代理而不是函数指针。委托基本上只是一个类型化的函数指针。委托和委托亲属(lambda表达式,事件,谓词等)的使用非常强大,值得为学习付出巨大的努力。

C#支持yield return。这对C#的做事方式非常重要。迭代某些集合的最常见形式是使用foreach。值得了解IEnumerable和迭代器是如何工作的。

答案 5 :(得分:0)

对象模型的差异。例如,值和引用类型按定义是分开的,而不是它们如何实例化。这有一些惊喜,例如

myWinForm.Size.Width = 100;

不会改变宽度,您需要创建一个新的Size实例并分配它。

答案 6 :(得分:0)

我还没有提到的一些在C ++中没有提到但可能有点令人惊讶的事情是attributesreflection

这样的属性并没有给你完整的AOP。但是,它们确实允许您以与在C ++中解决它们的方式非常不同的方式解决一堆问题。