【问题标题】:Surprises Moving from C++ to C#从 C++ 到 C# 的惊喜
【发布时间】:2010-10-21 07:36:04
【问题描述】:

我是一名进入 C# 的 C++ 程序员。我已经使用该语言一个月了,并且了解了许多概念。

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

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

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

【问题讨论】:

    标签: c# c++ language-comparisons


    【解决方案1】:

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

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

    【讨论】:

      【解决方案2】:

      我认为您已经介绍了主要内容。您应该阅读垃圾收集,了解为什么没有析构函数,找出IDisposable 模式(哪种替换析构函数)。我会说那是个大问题。

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

      【讨论】:

        【解决方案3】:

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

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

        Foo myFoo;
        

        你不能有像“空指针”这样的东西,除非你把它想象成有一个对象类型的引用。同样,您需要将属性视为方法的语法糖,而不是像 C++ 语法中的公共成员。

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

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

        【讨论】:

          【解决方案4】:

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

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

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

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

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

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

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

          【讨论】:

            【解决方案5】:

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

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

            属性 vs. 变量 vs. Setter

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

            IList 与 List 与其他集合

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

            泛型确实有自己的缺陷

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

            但总的来说,我会说更改过程非常轻松。

            【讨论】:

              【解决方案6】:

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

              myWinForm.Size.Width = 100;
              

              不会改变宽度,需要新建一个Size实例并赋值。

              【讨论】:

              • 好吧,那也不会编译...编译器会发现这种类型的错误。此外,您只需设置 myWinForm.Width ;-p
              【解决方案7】:

              attributesreflection 是我没有看到的一些在 C++ 中不可用且可能有点令人惊讶的东西

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

              【讨论】:

                猜你喜欢
                • 2017-07-22
                • 2011-10-18
                • 2011-09-12
                • 2018-08-28
                • 1970-01-01
                • 1970-01-01
                • 2023-04-01
                • 1970-01-01
                • 2020-02-12
                相关资源
                最近更新 更多