我想用C#在堆栈上分配一个对象

Pon*_*oni 2 c# memory-management

说我有这个C#类:

public class HttpContextEx
{
    public HttpContext context = null;
    public HttpRequest req = null;
    public HttpResponse res = null;
}
Run Code Online (Sandbox Code Playgroud)

如何在函数内声明它的对象,它将在堆栈上而不是在堆上分配?
换句话说,我想避免对此使用'new'关键字.这段代码很糟糕:

HttpContextEx ctx = new HttpContextEx(); // << allocates on the heap!
Run Code Online (Sandbox Code Playgroud)

我知道什么堆栈/堆是完美的,我听说过很棒的C#GC,但我坚持在堆栈上分配这个微小的对象,这只是为了方便起见.

这种态度来自C++(我的主要工具)所以我不能忽视这一点,我的意思是它真的毁了我这里的乐趣(:

Fem*_*ref 11

你不能(也不应该)这样做.即使你使用a struct(将被放在堆栈中),你也必须使用new运算符来包含类.严肃地说,如果你换成另一种语言,也要改变你的态度.

  • 使用ValueType派生来获得堆栈分配只是CLR当前实现的工件.没有要求在规范中如此. (6认同)
  • @Poni:虽然结构可能很有用,但它们应该是不可变的,并且很小(例如16个字节或更少),因为每次传递给子程序时,代表对象的整个内存块都会被复制,除非你想要在所有函数参数中使用`ref`.在5年多或C#开发中,我还没有找到一个需要担心.Net堆栈/堆速度的情况.简而言之,我只是声明类,让.Net担心它,而我专注于应用程序. (6认同)
  • 你要做的是**不是**好的做法是C#. (5认同)
  • 如果它漂浮在你的船上,好吧 - 我只是希望(对你而言)它漂浮在你雇主的船上. (2认同)

aqw*_*ert 9

如果您使用struct并在方法体内创建新实例将其更改为值类型,它将在堆栈上创建它.但是,成员,因为它们是引用类型仍将在堆上.无论是值还是引用类型的语言仍然需要new运算符,但您可以使用它var来消除类型名称的双重使用

var ctx = new HttpContextEx(); 
Run Code Online (Sandbox Code Playgroud)

否则,按照原样使用C#,因为GC做得很好.