4

我是一名进入 C# 的 C++ 程序员。我使用这门语言工作了一个月,理解了很多概念。

从 C++ 迁移到 C# 时,我可能会遇到哪些惊喜?我被警告说析构函数没有按我的意图执行。最近我尝试用泛型做一些事情,将 T 作为基类。那没有用。我还有另一个问题,但我会将其归结为缺乏 C# 经验。我也很惊讶我的应用程序正在占用 RAM,然后我发现我需要.dispose在一个功能中使用。(我认为它会像智能指针一样清理)

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

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

4

7 回答 7

4

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

结构与类的差异是 C++ 起源的另一个大问题。

于 2009-04-23T08:47:16.400 回答
3

我想你已经涵盖了主要的。您应该阅读垃圾收集,了解为什么没有析构函数,找出IDisposable模式(哪种替换析构函数)。我会说那是一个大的。

我要说的唯一另一件事是警告您 C# 和 .Net 基类库非常大,要充分利用它,还有很多东西要学习...一旦您了解了垃圾收集的基础知识和您将要查看 LINQ 的类型系统,并且您应该花时间探索您所在领域的相关库/框架(例如 WPF、WCF、ASP.Net 等)。但这一切都很好。我从 C++ 迁移到 C# 并且再也不会回去了,我发现它的效率更高(我不是在抨击 C++,我仍然会尝试:-))

于 2009-04-23T08:45:53.203 回答
1

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

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

属性 vs. 变量 vs. Setter

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

IList vs. List vs. 其他集合

了解 IList、List 和所有其他集合之间的区别(IMO 你真的不能用 IList 做很多事情)。

泛型确实有自己的陷阱

如果你打算使用很多泛型,也许阅读这篇文章可以帮助你避免我的一些错误: 检查一个类是否派生自一个泛型类

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

于 2009-04-23T08:52:57.913 回答
1

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

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

Foo myFoo;

除非您将其视为具有对象类型的引用,否则您不能拥有像“空指针”这样的东西。同样,您需要将 Properties 视为方法的语法糖,而不是公共成员,因为它们在 C++ 语法中看起来。

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

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

于 2009-04-23T08:53:12.547 回答
1

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

C# 是垃圾收集。并不意味着您可以停止关注资源分配,但通常您不必担心最常见的资源:内存。

在 C# 中,一切都是对象。没有“原始”数据类型,甚至 int 也是一个对象。

C# 有泛型,而不是模板。模板比 C# 的类似语法的泛型更丰富、更复杂,但泛型仍然提供了模板的几乎所有实用功能,而且没有很多令人头疼的问题。

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

C# 有委托而不是函数指针。委托基本上只是一个类型化的函数指针。委托和委托关系(lambda 表达式、事件、谓词等)的使用非常强大,值得投入大量精力研究。

C# 支持收益返回。这是 C# 做事方式的基础。迭代某个集合的最常见形式是使用 foreach。了解 IEnumerable 和迭代器的工作原理是值得的。

于 2009-04-23T09:09:24.800 回答
0

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

myWinForm.Size.Width = 100;

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

于 2009-04-23T08:46:07.120 回答
0

一些我没见过的东西在 C++ 中不可用并且可能有点令人惊讶的是属性反射

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

于 2009-04-23T11:41:59.757 回答