我曾经也是这样想的.然而,我最近与Jon Skeet进行了很好的讨论(他可能会提供更多详细信息),他向我解释说,a value type也可以保留在堆上.关键是该变量的使用时间.如果它是一个短期值类型变量,它将只留在堆栈中.但是,如果它被多次使用,框架将把它保留在堆中以节省堆栈空间.
IMO,引用和值类型之间的关键区别在于将对象传递给另一个对象或方法.如果它是引用类型,则只需共享其引用.如果它是值类型,那么您正在复制它.
关于短x长寿变量的主题,这里是完整的图片:
在桌面CLR上的Microsoft C#实现中,当值是局部变量或临时不是lambda或匿名方法的封闭局部变量时,值类型存储在堆栈中,并且方法体不是迭代器块,抖动选择不注册该值.
资料来源:关于价值类型的真相(也在评论中)