拆箱不会创建该值的副本。这是正确的吗?

2023-11-25

我正在阅读微软的课堂培训材料。我读了以下内容

拆箱 拆箱与装箱相反。它是引用类型到引用类型的显式转换 值类型。拆箱检索对对象中包含的值类型的引用。 拆箱操作涉及检查对象实例以确保该对象 实例是给定值类型的装箱值。那么,实例的值是 复制到值类型变量中。

**

拆箱返回指向装箱对象内数据的指针,并且不创建数据的副本。

**

我不太明白我突出显示的那一行。它说,当拆箱装箱对象时,它不会创建副本,它只是返回一个指针。如果这是真的,那么值类型变量将被分配在堆中,对吗?

Ram


除了 Guffa 所说的之外,这里还有一些附加信息:

  • 您引用的文字描述的“拆箱”操作描述了unboxCIL指令。CIL 标准有这样的说法unbox:

    Unlike box,这需要使 值类型的副本,用于 目的,unbox is not需要复印 对象的值类型。 通常它只是简单地计算 值类型的地址是 已经存在于盒装内部 目的

  • 您在 C# 中使用的拆箱转换是not编译为unbox.它们被编译为另一条指令,称为unbox.any:

    [...] 这unbox.any指令提取其中包含的值obj(类型O)。 (相当于unbox其次是ldobj.)

    在英语中,这意味着unbox.any进行拆箱操作(unbox) — 这推动了pointer到计算堆栈上 - 接下来是复制操作(ldobj),它将指针转换为值类型中包含的实际值,并将其推送到计算堆栈上。

    为了完整起见,这里是以下描述ldobj:

    The ldobj指令复制一个值 到评估堆栈。 [...]src是一个非托管指针 (native int),或托管指针 (&)。 [...]

    [理由:ldobj指令可用于通过 值类型作为参数。结尾 理由]

据我所知,C# 编译器从不使用unbox or ldobj,它总是使用unbox.any拆箱,以及ldind.*取消引用引用(例如ref/out参数)。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

拆箱不会创建该值的副本。这是正确的吗? 的相关文章

  • C# 并行与并行线程代码性能

    我一直在测试 System Threading Parallel 与线程的性能 我很惊讶地发现并行比线程花费更长的时间来完成任务 我确信这是由于我对并行的了解有限 我刚刚开始阅读 我想我会分享一些片段 如果有人可以向我指出并行代码比线程代码
  • WPF Dispatchertimer 延迟反应/冻结

    在我的 WPF 应用程序中 我使用 3 个不同的 DispatcherTimers 一种是用于显示当前时间 一种是每 5 秒运行一次数据库查询 第三个每 1 秒刷新一次自定义按钮的值 当我的程序运行时 有很多延迟 冻结 例如 时间开始正确计
  • 将 void *user_data 转换为对象

    我该如何投射void something到标准 C 中的对象 具体来说我想投void userdata to std map
  • 增量决策树 C++ 实现

    有谁知道决策树分类器的增量实现吗 这样 当您将新实例添加到训练集中时 它可以根据现有决策树分类器以低计算量并尽可能快地生成最佳决策树分类器 换句话说 我有一个最优决策树分类器集A 其中命名为T 1 现在我想添加实例X to set A并找到
  • 为什么将 char 传递给函数会改变它在 c 中的值?

    我目前正在关注本作业簿 http www cs bham ac uk exr lectures opsys 10 11 lectures os dev pdf关于构建操作系统 我的目的是写一个64位内核 我已经在文本模式下加载 内核 代码并
  • 试图使用加密来混淆我的项目打破了它

    我试图尝试不同的混淆选项 为了做到这一点 我首先尝试了加密货币 以下是我遵循的步骤 打开加密向导并选择一些选项 选择我的解决方案文件 完成向导后 我看到有些 Dll 被很好地混淆了 但我的项目现在无法构建 我注意到的两件事是 我的文件夹中有
  • EF Core 一对多关系列表返回 null

    我正在尝试学习如何在 EF Core 中正确利用 DbContext 我有一个团队课程 public class Team public int ID get set public string Name get set public bo
  • 当前的 .NET SDK 不支持面向 .NET 6.0。目标为 .NET 5.0 或更低版本,或者使用支持 .NET 6.0 的 .NET SDK 版本

    我知道这是一个重复的问题 但我已经尝试了所有提到的解决方案 但没有得到解决 我有一个 dotnet c 应用程序 当我运行该应用程序时 出现以下错误 当前的 NET SDK 不支持面向 NET 6 0 任何一个 目标为 NET 5 0 或更
  • ASP.NET中如何访问除wwwroot以外的位置

    我可以使用访问服务器的物理位置Server MapPath 这给了我内部的物理路径wwwroot文件夹 我想将一些数据保存到同一服务器的另一个驱动器中D 驾驶 我想我无法获取以下位置的物理位置D 驾驶使用Server MapPath因为它位
  • 三种 System.Drawing 方法表现出缓慢的绘制或闪烁:解决方案?或其他选择?

    我正在通过 System Drawing 进行一些绘图 但遇到了一些问题 我将数据保存在队列中 并将该数据绘制 绘制 到三个图片框中 此方法填充图片框 然后滚动图形 所以不要在以前的绘图上绘制 并且逐渐看起来更混乱 我找到了两种绘制图表的解
  • 除空字符串外的任何内容的正则表达式

    是否可以使用正则表达式来检测任何不是 空字符串 的内容 如下所示 string s1 string s2 string s3 string s4 etc 我知道我可以使用修剪等 但我想使用正则表达式 s 将匹配任何包含至少一个非空格字符的字
  • 为什么 httpRuntime targetFramework="4.5" 禁止抓取 .ASPXAUTH cookie?

    当我的 web config 具有以下 httpRuntime 时 我的控制器无法获取 cookie ASPXAUTH 它似乎能够获取任何其他 cookie 无论带或不带句点前缀 如果我删除下面的行 它就可以正常工作
  • Nuget - 对象引用未设置为对象的实例

    我在 vs 2015 中遇到了 nuget 包管理器的问题 像Unity这样的一些包已经安装没有问题了 某些软件包 例如 EF 在安装时出现问题 像 Automapper 这样的一些软件包也有同样的问题 但是当我安装这个软件包的另一个版本时
  • Request.Form 和 Request.QueryString 之间的区别?

    有人可以告诉我两者之间的确切区别吗Request Form and Request QueryString 我知道一个区别 比如 如果HTTP请求方式为POST 则用户提交的数据在申请表 收藏 如果HTTP请求方法是GET 则用户提交的数据
  • 将 System.Array 从 .Net 编组到 vb6

    我有一个 Net 组件 它有一个 COM 可见类 该类具有返回 System Array 的方法 它实际上返回一个字符串数组 但返回类型声明为 System Array 不要问我 为什么 我知道我可以将返回类型声明为 string 这样就可
  • 返回 ICollection 而不是 List 的真正优势是什么? [复制]

    这个问题在这里已经有答案了 我读过几篇博客文章 提到对于公共 API 我们应该始终返回 ICollection 或 IEnumerable 而不是 List 返回 ICollection 而不是 List 的真正优势是什么 Thanks 复
  • C# 3.0 中自动属性和公共字段的区别

    我无法理解为什么 C 3 0 中存在自动实现的属性语言功能 当你说的时候有什么区别 public string FirstName than public string FirstName get set 因为它们在生成的 IL 代码 和机
  • 在Framework 4.6项目中使用.net core DLL

    我已经在 net core 2 0 中构建了一个 DLL 现在我想在使用 net 4 6 1 框架的 WinForms 项目中使用它 我可以引用该 dll 但收到 System IO FileLoadException 表示找不到 Syst
  • char[length]初始化并处理

    我定义了一个字符数组 char d 6 如果我在以下方面有误 请纠正我 此时没有为变量分配内存d 现在我要初始化它 d aaaaa 这种初始化之后 就不需要释放内存了 它将自动完成 我怎么知道是否char 被初始化了吗 我正在寻找类似的模式
  • 替换全局热键

    我有一个位于托盘中的应用程序 我想定义多个热键来触发我的程序中的事件 我从 AaronLS 在这个问题中的出色回答中找到了灵感 使用C 设置全局热键 https stackoverflow com a 27309185 3064934 如果

随机推荐

  • MonoDroid 和 MonoTouch 的可移植类库

    我想为 MonoDroid 和 MonoTouch 创建 PCL 以共享代码 AES 加密 RijndaelManaged 但 Visual Studio 不允许我这样做 而是强制我添加所有其他框架 消息如下 将自动选择以下框架 因为它们支
  • Python - 不使用内置旋转方法旋转图像

    如何借助 OpenCV 库并通过更改图像的高度和宽度值 不使用 OpenCV 中的内置旋转方法 来旋转 Python 中的图像 它必须用两个嵌套循环来实现 img cv2 imread Images Screenshot png cv2 I
  • 当存在例如时,crossdomain.xml和clientaccesspolicy.xml的含义是什么? PHP/cURL?

    假设我有一个网站 但上面没有 crossdomain xml 或 clientaccesspolicy xml 这意味着人们无法通过 Silverlight 或 Flash 应用程序访问我的网站 但他们可以使用 PHP 中的 cURL 或其
  • 流星 SSL 连接

    我正在尝试通过 SSL TLS 连接到我的 Meteor 项目 因此我做了以下事情 流星添加力量 ssl 在流星文件夹中 然后我用 meteor 启动程序 一切都在本地主机上运行良好 但如果我想通过 http 提供 IP 和端口来连接到服务
  • PDO PHP 获取类

    我正在学习 php 中的 pdo 以便使数据库访问更容易 更高效 我读到的 fetch class 的一个解释是 对象的属性是在调用构造函数之前设置的 这是什么意思 任何方向都将受到高度赞赏 这意味着当使用PDO将结果返回到自定义对象时 需
  • 程序是否以兼容模式运行

    是否有一个我可以调用的 C NET 函数来检测我的程序是否在兼容模式下运行 如果没有 有人可以告诉我一个代码吗 谢谢 例如 程序加载完毕 兼容模式检查 如果为真则退出 否则运行 来自另一个论坛 经过几次谷歌搜索后 徒劳无功 我决定自己尝试一
  • ValueError:期望 x 为非空数组或数据集(Collab 上的 Tensor Flow lite 模型制作者)

    我正在关注this有关在 Collab 上使用 TensorFlow lite Model Maker 创建自定义模型的教程 import pathlib path pathlib Path content employee pics co
  • NetBeans (Java Swing):设置窗口大小

    这真让我抓狂 当我在设计模式下为窗口设置适当的大小时 它只会忽略该大小并在编译和运行时使用其他大小 即使很难 我设置了minimumSize和preferredSize 它只是忽略了这一点 为什么 如何设置自己的尺寸 即使你已经设置了尺寸m
  • 如何将事件绑定到按住的鼠标左键?

    我需要只要按住鼠标左键就执行命令 如果您希望在没有任何干预事件的情况下 发生某些事情 即 无需用户移动鼠标或按任何其他按钮 您唯一的选择就是轮询 按下按钮时设置标志 释放按钮时取消设置 轮询时 检查标志并运行您的代码 如果已设置 这里有一些
  • 适用于大量表的实体框架 4.1 (715)

    我正在为包含 700 多个表的数据库开发数据访问层 我创建了包含所有表格的模型 这生成了一个巨大的模型 然后我将模型更改为使用 4 1 中的 DBContext 这似乎改进了它的编译和工作方式 看来设计师根本就没有工作 然后我创建了一个测试
  • 错误:java:Intellij 中的源版本无效:8。这是什么意思?

    我尝试在使用 Intellij Ultimate 13 1 4 中编译一些代码 但出现以下错误 我不知道这意味着什么 Information Using javac 1 7 0 55 to compile java sources Info
  • ImageView 不会填充父级

    我的一个屏幕上有一个 ScrollView 我希望右边缘有阴影 我决定最简单的方法是使 ScrollView 的子视图成为relativelayout 并有两个relativelayout 的子视图 一个是 LinearLayout 用于容
  • Bash if 语句中的正则表达式匹配

    我在这里做错了什么 尝试匹配任何包含空格 小写字母 大写字母或数字的字符串 特殊字符也很好 但我认为这需要转义某些字符 TEST THIS is a TEST title with some numbers 12345 and specia
  • Tomcat 控制台日志到文件

    我在用着阿帕奇汤姆猫7 当我使用安全管理器运行 Tomcat Djava security debug范围我在控制台中收到了很多文本 我无法阅读控制台中的文本 所以我需要控制台登录到某个文件 我怎样才能实现这个目标 Remove Conso
  • 替换 R 数据框中因子列的内容

    我需要替换数据框中因子列的级别 使用iris以数据集为例 我将如何替换包含的任何单元格virginica with setosa in the Species column 我预计以下内容可以工作 但它会生成一条警告消息并简单地插入 NA
  • Python 函数中的默认值[重复]

    这个问题在这里已经有答案了 我注意到以下几点 class c def init self data self data data a c b c a data append 1 print b data 1 这是正确的行为吗 是的 这是正确
  • 如何循环播放媒体播放器文件?

    基本上我有 3 首歌曲 我希望用户能够在 3 首歌曲的循环完成后循环回到第一首歌曲 为什么这不起作用 它将播放所有 3 首歌曲 然后在第四次单击时 不会播放任何歌曲 MediaPlayer song0 song1 song2 Button
  • 访问公共 Facebook 页面时,Graph API 返回“false”或“不支持的获取请求”

    我在使用一些粉丝页面并使用 Facebook Graph API 获取其详细信息时遇到了一些问题 当我尝试获取粉丝页面的详细信息时 Graph API 仅返回false 但现在正在返回 error message Unsupported g
  • 平滑滚动在 ViewPager 中不起作用(支持库)

    我正在编写使用的应用程序ViewPager举办Fragments 当我以编程方式更改片段时 平滑滚动功能不起作用 我使用 ViewPager setCurrentItem int item boolean smoothScroll 方法 也
  • 拆箱不会创建该值的副本。这是正确的吗?

    我正在阅读微软的课堂培训材料 我读了以下内容 拆箱 拆箱与装箱相反 它是引用类型到引用类型的显式转换 值类型 拆箱检索对对象中包含的值类型的引用 拆箱操作涉及检查对象实例以确保该对象 实例是给定值类型的装箱值 那么 实例的值是 复制到值类型