【发布时间】:2017-06-21 02:05:12
【问题描述】:
我知道在 C++ 中,您可以在堆栈上创建一个类的实例,例如
MyClass mc = MyClass(8.2);
或在堆上
MyClass * mc = new MyClass(8.2);
你能在 C# 中做同样的事情吗?我在 C# 中创建类的唯一方法是 newing 它。
【问题讨论】:
-
这只是语义,对象仍然存在于 GC 堆上。发明以拯救 RAII 模式。很大程度上是一个失败,最终让程序员不知道什么时候使用帽子,让他们编写效率非常低的代码,而且经常被框住。
-
C# 是托管堆内存模型 - 重点是您不必花时间担心内存清理。您是否有理由将某些东西放在堆栈上而不是堆上? FWIW,C# 结构(值类型)通常位于堆栈上,类(引用类型)位于堆上 - 但内存管理器可能会根据大小和使用情况选择对其进行装箱。
-
@GeoffCox 当一个值类型被装箱时是很好定义的。当您将值存储在引用类型的存储位置时,它将始终将值装箱,否则永远不会。它不会随心所欲地选择何时或何时不对值进行装箱。现在一个变量本身很可能有许多可能的存储位置,并且变量本身的存储位置可以随语言/运行时的变化而变化,但这与装箱无关。
标签: c# heap-memory new-operator memory-model stack-memory