新的C#结构与直接使用它之间的区别是什么

时间:2015-04-13 07:24:26

标签: c# struct

像这样:

    struct TheStruct
    {
        public int x;
    }
    public TheStruct CreateStruct()
    {
         //TheStruct xx = new TheStruct();
         TheStruct xx;

         xx.x = 100;

         return xx;
    }

当我使用c#struct时,我发现我可以直接使用它,或者使用new运算符,它总是运行良好。    我不知道这个的区别。    如果struct只能在堆栈上使用,那么背景是什么:

TheStruct xx = new TheStruct()

struct xx在哪里?在堆栈上还是在堆上?

1 个答案:

答案 0 :(得分:2)

忘掉你在C / C ++中所知道的一切。 C#看起来很相似,但它是如此不同,携带行李没有任何意义。你的问题没有意义。

堆栈和堆只是.NET上的一个实现细节 - 它可能很好地在一个寄存器中分配给你所知道的。

与C / C ++不同,您无法选择分配内容的位置。您有一些提示,但实际上,这些只是实施细节。例如,无论你做什么,都没有工作的.NET运行时允许你在堆栈上分配class。阻止某人制作运行时的唯一因素是决定如何安全地执行此操作 - 规范并未禁止它。

除非你真的需要,否则不要依赖这样的实现细节。相反,请考虑您希望使用类型的方式。你想要价值语义吗?使用值类型。参考语义?使用参考类型。

new只是调用给定类型的构造函数。对于struct,总是一个默认的构造函数,它只是简单地将所有东西都归零,并且编写自己没有参数的构造函数是不可能的(直到C#6,那就是。可悲的。)。

您拥有的代码当然不会编译。您正在使用未分配的变量。但是同样的事情也适用于字段。 编辑:正如评论中所述,只要您分配struct的所有字段,它就会编译。在某种程度上,您可以通过这样做来创建自己的struct构造函数。也许它是一种性能微优化。除非必要,否则我不会使用该语法 - 明确使用new MyStruct()default(MyStruct)更清晰。除非你能证明它有所作为,否则我只需使用default或构造函数。

现在,您可以互换使用new MyStruct()default(MyStruct) - 只需将相关内存清零(实际发生的事情是否是实施细节,但您具有全零的值。实际上,这就是.NET如何适用于所有类型 - 您分配的每一块内存都将默认为零。

C#与C / C ++非常相似的地方。但内存分配肯定不是其中一个地方:)