【问题标题】:is there a difference between a struct in c++ and a struct in c#?c++中的结构和c#中的结构有区别吗?
【发布时间】:2009-05-18 20:33:24
【问题描述】:

c++中的struct和c#中的struct有区别吗?

【问题讨论】:

    标签: c# c++


    【解决方案1】:

    在 C# 中,您使用结构来定义值类型(与 classes 声明的引用类型相反)。

    在 C++ 中,结构与具有默认可访问性级别 public 的类相同。

    所以问题应该是:C# 中的结构与 C++ 中的类不同吗?是的,它们是:不能从 C# 结构派生,不能有虚函数,不能定义默认构造函数,不能有析构函数等等

    【讨论】:

    • Martin 关于 C# 结构是值类型的观点对于性能非常重要,因为对于某些操作,它们必须被装箱和拆箱。如果您必须担心性能,请阅读“拳击”。
    【解决方案2】:

    C# 中的结构与类非常不同,请参阅Structs vs Classes 了解更多信息

    C++ 中的结构与类相同,除了成员默认是公共的。 除此之外,C++ 结构可以做 C++ 类可以做的所有事情。

    【讨论】:

    • C# 结构可以有构造函数——它们只是不能有 default 构造函数。
    • Marc:你发现了我故意犯的错误,干得好。 . . p.s.我修好了:)
    • @Marc: 他们总是有一个默认的构造函数,你不能定义你自己的:-)
    • 伙计们,如果我不给你们指出的东西,你们都会非常失望,现在说实话。 . .
    • @MartinStettner - 实际上,根据 CLI 规范,他们从不有默认构造函数。 C# 编译器只是在说谎;-p
    【解决方案3】:

    是的。

    c# 中的结构是普通的旧数据类型(按值)(与通过引用并具有所有 OO 内容的类相反)

    c++ 中的结构只是默认公开的类。

    【讨论】:

      【解决方案4】:

      您是否尝试在托管 C++ 和 C# 之间进行互操作?如果是这样,有 C++ 的扩展允许这样做:请参阅 link

      【讨论】:

        【解决方案5】:

        C# 结构是托管代码,当没有人再引用它时,它将被 C# 垃圾释放。每当垃圾收集器决定清理它时,就会调用它的析构函数。

        C++ 结构是一个非托管对象,您必须自己清理它。它的析构函数会在您删除它或超出范围时被调用。

        【讨论】:

        • C# 结构不是对象;它们自己不会受到垃圾收集(除非它们是垃圾收集的类型上的字段,即类)。 C# 结构不能定义终结器:“错误 1 ​​只有类类型可以包含析构函数”
        • 关于终结器的好点。但我认为结构是对象:“MyStruct 是对象”返回 true。并且必须有人释放结构使用的内存;如果结构在堆上,垃圾收集器会这样做。
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2021-12-07
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多