ValueType 包装器的垃圾收集

2023-12-25

引用自ValueType 类的 MSDN 链接 http://msdn.microsoft.com/en-us/library/system.valuetype.aspx

如果值类型需要像对象一样运行,则会在堆上分配一个使值类型看起来像引用对象的包装器,并将值类型的值复制到其中。包装器被标记,以便系统知道它包含值类型。

这意味着当我编写“integerVariable.ToString();”之类的代码时创建的包装对象允许使用此方法以及类似的 System.Object 的所有其他方法。

这种理解正确吗?

这些物体与“常规”物体有何不同?

对于此类对象,垃圾收集是否有所不同?如果是,怎么办?

提前致谢。


包装纸是一个“盒子”;重新收集垃圾箱 - 有no就垃圾收集器而言,差异。盒子的收集规则和处理方式与任何其他物体完全相同。

但是,如果值类型重写方法(例如ToString()),调用该方法时无需对其进行装箱。因此,值类型应该(作为惯例)覆盖尽可能多的object尽可能的方法;-p

您可以看到 IL 中的差异(通过反射器) - 因此对于 C#:

static int GetInteger() {return 123;}
static string TestToString() {
    int i = GetInteger(); // to prove no cheating
    return i.ToString();
}
static Type TestGetType() {
    int i = GetInteger(); // to prove no cheating
    return i.GetType();
}

我们有 IL:

.method private hidebysig static string TestToString() cil managed
{
    .maxstack 1
    .locals init (
        [0] int32 i)
    L_0000: call int32 Program::GetInteger()
    L_0005: stloc.0 
    L_0006: ldloca.s i
    L_0008: call instance string [mscorlib]System.Int32::ToString()
    L_000d: ret 
}

.method private hidebysig static class [mscorlib]System.Type TestGetType() cil managed
{
    .maxstack 1
    .locals init (
        [0] int32 i)
    L_0000: call int32 Program::GetInteger()
    L_0005: stloc.0 
    L_0006: ldloc.0 
    L_0007: box int32
    L_000c: call instance class [mscorlib]System.Type [mscorlib]System.Object::GetType()
    L_0011: ret 
}

注意ToString()不涉及盒子,但是GetType()做在L_0007(因为它没有(不能)被覆盖)

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

ValueType 包装器的垃圾收集 的相关文章

  • File.Move 的原子性

    我想将目录中的文件重命名为原子事务 该文件不会更改目录 该路径作为 NTFS 文件系统的 UNC 路径提供 可能位于服务器 03 或 08 上 File Move 对于这些目的来说是原子的吗 例如 它要么成功完成 要么失败 以使原始文件仍然
  • 立即检测客户端与服务器套接字的断开连接

    如何检测客户端已与服务器断开连接 我的代码中有以下代码AcceptCallBack method static Socket handler null public static void AcceptCallback IAsyncResu
  • Bug:VS2017 Live 单元测试 - 只有减号 - 不起作用

    TL 博士 编辑6 我缩小了范围并提供了重现问题 错误的 5 个步骤 创建 VS2017 c 控制台应用程序 Net 完整框架 将方法添加到 Program cs 并使该类公开 public class Program static voi
  • 为什么smtpclient发送的邮件没有出现在已发送项目中

    我已经实现了一个通过 Net SmtpClient 发送电子邮件的服务器 邮件发送代码如下 private static MailMessage SendMail string to string subject string body M
  • 使用 system.reflection 列出类字段

    我需要获取一个列表来存储类中的所有字段 值 这个班级只是一些公共的const string我在下面粘贴的变量 public class HTDB Cols public class TblCustomers public const str
  • .NET 中的 new Date().getTime()

    基本上我想在 NET 中执行以下操作 但我不知道如何操作 var d new Date getTime milliseconds since 1970 01 01 我不太确定您是否可以在 NET 中获取 UNIX 日期 但您有 DateTi
  • 从 BitmapImage 获取支持的图像格式

    如何获取 System Windows Media Imaging BitmapImage 支持的图像格式列表 我正在用 C WPF 编写一个简单的图像处理工具 BitmapImage 类是更有用的位图类之一 因为它能够从多种格式进行解码
  • 在 .NET 4 下运行的 .NET 2 和 .NET 4 程序集有什么区别

    我维护一个 NET 2 0 库 最近它的用户开始要求 NET 4 版本 我可以在 Visual Studio 中复制现有项目 设置Target Framework to NET Framework 4 0并完成它 但是在 NET 4 下运行
  • 接口的隐式和显式实现

    在进行升级时 我碰巧遇到了这样的代码 interface ICustomization IMMColumnsDefinition GetColumnsDefinition class Customization ICustomization
  • 使用AOP技术拦截ADO.Net

    我有相当大的代码库 使用各种不同的 ADO 技术 即一些 EF 在某些情况下直接使用 ADO Net 我想知道是否有任何方法可以全局拦截任何 ADO Net 调用 以便我可以开始审核信息 例如执行的确切 SQL 语句 花费的时间 返回的结果
  • 无法找到 .NET Core 项目

    我正在关注 c 的 brackeys 教程here https www youtube com watch v N775KsWQVkw 但在 7 55 时 我弹出一条消息 无法找到 NET Core 项目 未生成资产 我已经做了布雷基在那一
  • 如何将当前应用程序域的程序集动态加载到c#项目中?

    我正在尝试加载第三方assemblies 动态地到项目并使用reflection创建其类型的实例 I used Assembly LoadFrom Assembly1 dll Assembly LoadFrom Assembly2 dll
  • 线程独占数据:如何存储和访问?

    NET 中是否有可能将对象实例绑定到线程的当前执行上下文 这样在代码的任何部分我都可以做类似的事情CurrentThread MyObjectData DoOperation 并确保我访问特定于线程的数据 谢谢 你可以看一下线程静态属性 h
  • .NET 或 Windows 同步原语性能规范

    我目前正在写一篇科学文章 我需要非常准确地引用 有人可以向我指出 MSDN MSDN 文章 一些已发表的文章来源或一本书 我可以在其中找到 Windows 或 NET 同步原语的性能比较 我知道这些是按性能降序排列的 互锁 API 关键部分
  • 如果我使用带有表单身份验证的 WCF,php 或 java 客户端将如何进行身份验证?

    我有一个通用的概念验证 WCF 服务 它使用表单身份验证来保护访问 当我的客户端是 NET 时 一切都很好 vb 代码如下 Dim client As SupplierServiceClient New SupplierServiceCli
  • 使用 TFS API 在单个查询中检索工作项及其链接的工作项

    有谁知道是否可以检索工作项目及其列表链接的工作项使用 TFS API Web 服务从 TFS 进行一趟 目前 我们必须对第一次调用期间进行的每个工作项进行第二次调用 并且引入了性能问题 如果这不可能 是否有办法查看链接工作项的类型而不检索它
  • Activator.CreateInstance 缺少方法异常

    我在 C dll 中有一个类 其中包含以下类 public class RequiredTask Base BaseObject public string Name get set public string Description ge
  • 如何在我的应用程序中使用 Windows Key

    Like Windows Key E Opens a new Explorer Window And Windows Key R Displays the Run command 如何在应用程序的 KeyDown 事件中使用 Windows
  • .NET 选项将视频文件流式传输为网络摄像头图像

    我有兴趣开发一个应用程序 它允许我从 xml 构建视频列表 包含视频标题 持续时间等 并将该列表作为我的网络摄像头流播放 这意味着 如果我要访问 ustream tv 或在实时通讯软件上激活我的网络摄像头 我的视频播放列表将注册为我的活动网
  • 窗体最大化时自动缩放子控件

    有没有办法在最大化屏幕或更改分辨率时使 Windows 窗体上的所有内容自动缩放 我发现手动缩放它是正确的 但是当切换分辨率时我每次都必须更改它 this AutoScaleDimensions new System Drawing Siz

随机推荐

  • 告诉 Netbeans 这是一个 Ruby 文件

    我有一个名为 Vagrantfile 的文件 它是一个 ruby 文件 但文件名末尾不能有 rb 有没有办法告诉 Netbeans 这是 Ruby 文件 Right click the file in Files view Ctrl Shi
  • 仅查找样式“标题 1”的文本(范围.查找以匹配样式)

    我试图在文档中找到一些仅以 标题 1 样式出现的文本 到目前为止 没有任何效果 示例代码 With ThisDocument Range Find Text The Heading Style Heading 1 Does not work
  • OverflowError:long int太大,无法转换为float [重复]

    这个问题在这里已经有答案了 我试图获得一个非常大的数的平方根 但出现错误 deltaSqrt pow delta 0 5 溢出错误 long int 太大 无法转换为 float 就我而言 增量等于 50975241591243057112
  • webpack 文件加载器不加载背景图像

    我遇到这个问题已经有一段时间了 我看到其他人也有这个问题 但即使我有与他们相同的代码 它仍然无法工作 我不知道我做错了什么 我正在使用 React Webpack babel 和 scss 来完成一个项目 首先 我创建了一个主组件 其中加载
  • 如何将 Jar 中的资源目录以及所有包含的文件和子文件夹复制到另一个目录

    是否可以将资源文件夹及其中的所有文件 包括其中的所有目录和子目录 复制到另一个目录中 到目前为止 我所做的是仅复制一个文件资源 即 CSS 文件 public void addCSS Bundle bundle FrameworkUtil
  • 如何检查 Android 中的状态栏颜色?

    如何检查 Android 中的状态栏颜色 为什么我需要检查这个 我已经按照以下方式创建了状态栏图标设计指南 http developer android com guide practices ui guidelines icon desi
  • 有 border-radius 覆盖内部 div

    我在一个网页上有一个 Coda 滑块 手工制作 没有使用插件 但这无关紧要 并且外部 div 有一个边框半径 一堆内部 div 有背景颜色 但是当我希望它们位于圆角后面时 它们会突出在角的顶部 有什么办法可以实现这一点吗 如果您将posit
  • 在java中使用pdfbox将文本覆盖到以前创建的pdf文档上

    我已经创建了几个 PDF 文档 我正在尝试做的是使用 PDFBox 我需要将文本放入这些创建的文档的多个位置 但我不想修改这些区域内的文本 例如 可能有一个部分如下 姓名 我会将文本放入该区域 但我需要下划线保持相同的长度 我相信最好的解决
  • Java 中 .class 文件的用途

    我试图了解 class 文件在 java 中的工作原理以及它们的用途 我在网上找到了一些信息 但得到的解释并不令人满意 一旦我们运行编译器 我们就会得到 class 文件 它是字节码 这个机器可读吗 如果没有 这就是为什么我们需要解释器才能
  • 循环遍历“已发送邮件”文件夹中的 Outlook 邮件项目

    我们正在尝试访问发送的邮件文件夹中Outlook 2007 使用 Exchange 但测试TypeOf i Is Outlook MailItem在下面的代码片段中始终返回 False 我们知道我们有正确的文件夹 因为测试items Cou
  • 如何从 URL 查找 .m3u8 文件并下载

    我正在尝试从给定的网站 URL 查找并下载 m3u8 文件 我该怎么做呢 我查看了页面源代码 但找不到任何 m3u8 文件的链接 尽管我可以看到发送网络 GET 请求以在 Chrome 的开发工具网络选项卡中下载 m3u8 文件 那么有人知
  • Google Collections 中的惰性不可修改列表

    我一直在寻找一个通用的惰性不可修改列表实现的体面实现来包装我的搜索结果条目 任务的不可修改部分很容易 因为它可以通过以下方式实现Collections unmodifiableList 所以我只需要整理出懒惰的部分 出奇 谷歌收藏 http
  • 仅将特定文件移动到新分支

    我的branch1有10个文件 在创建新分支作为branch2时 我只想选择四个文件到新分支中 在 git 中是否可能 因为在创建新分支时 创建新分支 删除该分支中的所有文件 从另一个分支检索一些文件并提交更改 create a new b
  • 运行安装脚本后未找到 Bun

    我通过粘贴以下代码运行了安装脚本 curl https bun sh install bash 但是 当我尝试获取bun的版本时 它说找不到它 bun version Command bun not found did you mean c
  • 将 jQuery 转为普通 JS - 在 h1 之后插入 p 元素

    关于如何将此 jQuery 转换为 vanilla JS 的任何想法 section gt h1 after p This paragraph was inserted with jQuery p 我是 jQuery 的新手 甚至是 van
  • 使用Python和pillow(PIL)填充空心形状

    我正在尝试编写一种方法来填充给定的形状 使其变成纯黑色 例子 这个八边形最初只是一个轮廓 将变成一个实心的黑色八边形 但是只要所有边都闭合 这应该适用于任何形状 Octagon https i stack imgur com SZ5sl p
  • 如何知道Jquery动画进度?

    我有一个网页 它通过从顶部滑动来带来另一个页面 我已经使用 jquery animate 实现了这一点 现在我的查询是如何知道 animate 方法的进度百分比 就像来自页面开始滑动直至完成 Thanks 您可以使用step 打回来 htt
  • 如何在 jQuery 中使用 Ajax 请求不同的域

    我需要在 jQuery 中使用 Ajax 向不同的域发出请求 我应该使用iframe Edited 在 facebook com 上工作聊天 有几个不同的域名 获取 http www facebook com ajax presence r
  • 如何将 data.table 代码翻译为折叠

    我读到了关于collapse https sebkrantz github io collapse index html最近打包并尝试翻译以下内容data table代码到collapse看看它在现实世界的例子中是否更快 这是我的data
  • ValueType 包装器的垃圾收集

    引用自ValueType 类的 MSDN 链接 http msdn microsoft com en us library system valuetype aspx 如果值类型需要像对象一样运行 则会在堆上分配一个使值类型看起来像引用对象