类是引用类型还是结构类型?

Hat*_*oft 0 c# heap stack struct class

我理解这个话题得到了很多回答.我的问题是针对它的说法或问题.

所以我说得对,用class关键字编写的代码将在托管堆上并且是一个引用类型,用struct编写的代码将在堆栈上并且是一个值类型?

And*_*lil 6

我曾经也是这样想的.然而,我最近与Jon Skeet进行了很好的讨论(他可能会提供更多详细信息),他向我解释说,a value type也可以保留在堆上.关键是该变量的使用时间.如果它是一个短期值类型变量,它将只留在堆栈中.但是,如果它被多次使用,框架将把它保留在堆中以节省堆栈空间.

IMO,引用和值类型之间的关键区别在于将对象传递给另一个对象或方法.如果它是引用类型,则只需共享其引用.如果它是值类型,那么您正在复制它.

关于短x长寿变量的主题,这里是完整的图片:

在桌面CLR上的Microsoft C#实现中,当值是局部变量或临时不是lambda或匿名方法的封闭局部变量时,值类型存储在堆栈中,并且方法体不是迭代器块,抖动选择不注册该值.

资料来源:关于价值类型的真相(也在评论中)

  • 然而,在术语上足够公平,缺点仍然是短期或长期存在.阅读那篇文章,除了一些特殊情况,它归结为方法范围=短期,非方法范围=长期存在.它也不是为了节省堆栈空间而移动它,因为在内存中的项目结束之前将弹出并回收堆栈. (2认同)