繁体   English   中英

类是引用类型,结构是值类型吗?

[英]Is Class a Reference Type and Struct a Value Type?

我知道这个话题已经回答了很多。 我的问题是特定于说或问的方式。

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

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

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

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

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

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

引用类型的任何存储位置(局部变量,参数,类字段,结构字段或数组插槽)将始终保持null ,否则将保持对堆上对象的引用。 值类型的存储位置将容纳该类型的所有公共字段和私有字段(原始值类型在内部存储为具有一个字段的结构,该字段声明为同一原始类型;一点点的编译器魔术是用于识别何时必须使用特殊情况代码才能使用该类型)。 对于每种值类型,都有一个对应的具有相同成员的堆对象类型。 尝试在引用类型的存储位置中存储值类型的操作将创建一个具有适当堆类型的新堆对象,将value-type字段的内容复制到新对象的内容,并存储对该新对象的引用在请求的存储位置。 此过程称为“装箱”。 可以将装箱的堆对象的字段的内容复制到值类型存储位置的内容,此过程称为“拆箱”。 请注意,由于盒装值类型是使用引用类型的存储位置访问的,因此它们的行为类似于引用类型,而不是类类型。 C#试图假装值类型存储位置的类型和装箱的值类型实例的类型是相同的类型,但是这两种类型的行为有所不同。 假装它们相同,只会增加混乱。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM