c# - 清除对值和引用类型的疑虑

标签 c#

值类型变量直接包含实际数据,引用类型变量包含对实际数据的引用。

我认为这是:

l.h.s是值类型,r.h.s是引用类型

enter image description here

在左侧,如果我将 i 复制到 j 中,新的内存位置将填充相同的原始数据 (45)。

在右侧,如果我将k 复制到l,一个新的内存位置将填充对象的引用;并且此引用指向内存中的实际对象。

现在,我对这种引用类型复制感到困惑。这里有一点不同:

enter image description here

这里,r.h.s 上的副本使 l 指向与 k 相同的位置。

我的问题是1。 “哪个更真实?”还是比我想象的更真实?

此外,值类型可以分配在堆上,这取决于抖动认为它适合的方式,然后 2。我们可以强制在堆栈上分配引用类型吗?

抱歉图片编辑草率。

最佳答案

第一张图比较好,lk是不同的变量,在内存中占据不同的位置。

value types may be allocated on heap, depending upon the how jitter sees it fit

实际上它更多地取决于上下文和值的使用方式。值类型字段总是分配在堆上,装箱和闭包是其他原因。

但是,当 l 是一个 ref 参数时,第二张图片适用:

MyClass k = new ...;
M(ref k);

void M(ref MyClass l) { /* Here l is an alias for k */ }

then 2. Can we force a reference type to be allocated on stack?

有类似 stackalloc 的东西,但它是一种对 C# 程序员“不可见”的优化。
简单而最有用的答案是:不。

关于c# - 清除对值和引用类型的疑虑,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12341947/

相关文章:

c# - 如何在 MongoDB C# 驱动程序中为字段全局设置属性

c# - 没有 CopyToDatatable() 方法

c# - 在 Startup - Asp.Net Core 中调用 AddTransient 中的异步方法

c# - 在 WPF 中处理 Key 的正确且独立于文化的方法是什么?

c# - 反序列化没有默认构造函数 C#

c# - 我在使用包含换行符的正则表达式时遇到了困难

C#:将文本文件内容与字符串变量进行比较

c# - 如何使用按钮绘制形状并为其着色?

c# - 遇到 Nhibernate 和 ManyToOne 属性问题

c# - 有没有一种有效的方法可以找到集合 S 中元素的所有有序排列,这些元素加起来等于 N?