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在哪里?在堆栈上还是在堆上?
答案 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 ++非常相似的地方。但内存分配肯定不是其中一个地方:)