C# 对象引用如何在内存中/运行时(在 CLR 中)表示?

2024-01-23

我很想知道 C# 对象引用在运行时(在 .NET CLR 中)如何在内存中表示。我想到的一些问题是:

  1. 对象引用占用多少内存?在类的范围和方法的范围中定义时有什么不同吗?它所在的位置是否根据此范围(堆栈与堆)而有所不同?

  2. 对象引用中维护的实际数据是什么?它只是一个指向它所引用的对象的内存地址还是还有更多内容?这是否因它是在类还是方法的范围内定义而有所不同?

  3. 与上面的问题相同,但这次是在讨论对引用的引用时,就像将对象引用通过引用传递给方法时一样。 1 和 2 的答案有何变化?


.NET 堆和堆栈 http://www.c-sharpcorner.com/UploadFile/rmcochran/csharp_memory01122006130034PM/csharp_memory.aspx这是对堆栈和堆如何工作的彻底处理。

C# 和许多其他使用堆的 OOP 语言的一般参考用途句柄而不是指针在此上下文中进行参考(C# 也能够使用指针!)指针类比适用于一些一般概念,但此概念模型对于此类问题不适用。请参阅 Eric Lippert 关于此主题的精彩帖子句柄不是地址 http://blogs.msdn.com/b/ericlippert/archive/2009/02/17/references-are-not-addresses.aspx

说句柄是指针的大小是不合适的。(尽管可能巧合是相同的)句柄是对象的别名,并不要求它们是对象的正式地址。

在这种情况下,CLR 恰好使用句柄的真实地址:来自上面的链接:

...CLR 实际上确实将托管对象引用实现为 垃圾收集器拥有的对象的地址,但这是一个 实施细节。

所以,是的,句柄在 32 位架构上可能是 4 个字节,在 64 字节架构上可能是 8 个字节,但这不是“肯定的”,而是不是直接因为指针。值得注意的是,具体取决于编译器的实现和某些类型的指针所使用的地址范围的大小可能不同.

有了所有这些上下文,您可能可以通过指针类比来对此进行建模,但重要的是要认识到句柄不一定是地址。如果 CLR 将来愿意的话,它可以选择更改此设置,并且 CLR 的消费者不应该知道更多。

这个微妙点的最终驱动力:

这是一个 C# 指针:

int* myVariable;

这是一个 C# 句柄:

object myVariable;

他们不一样。

您可以对指针执行诸如数学运算之类的操作,而这些操作不应使用句柄执行。如果您的句柄碰巧像指针一样实现,并且您像指针一样使用它,那么您在某些方面滥用了句柄,这可能会给您带来以后的麻烦。

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

C# 对象引用如何在内存中/运行时(在 CLR 中)表示? 的相关文章

  • 在 Web 浏览器中禁用 F5 [重复]

    这个问题在这里已经有答案了 可能的重复 禁用浏览器的后退按钮 https stackoverflow com questions 961188 disable browsers back button 如何禁用浏览器上的 F5 刷新 htt
  • 通过 SOAP 的 Gmt php 或 UTC C# 等效项

    is C DateTime UtcNow和 PHPdate c 是等价的 我怀疑 因为当我肥皂时 我得到了 C
  • OpenGL缓冲区更新[重复]

    这个问题在这里已经有答案了 目前我正在编写一个模拟水的程序 以下是我所做的步骤 创建水面 平面 创建VAO 创建顶点缓冲区对象 在其中存储法线和顶点 将指针绑定到此 VBO 创建索引缓冲区对象 然后我使用 glDrawElements 渲染
  • C# Outlook 从收件人获取 CompanyName 属性

    我目前正在使用 C 编写 Outlook 2010 AddIn 我想要的是从我从 AppointmentItem 中提取的 Recipient 对象中获取 CompanyName 属性 因此 有了 AppointmentItem 的收件人
  • 具有多个谓词的 C++11 算法

    功能如std find if来自algorithmheader 确实很有用 但对我来说 一个严重的限制是我只能为每次调用使用 1 个谓词count if 例如给定一个像这样的容器std vector我想同时应用相同的迭代find if 多个
  • DataGridView 列中的数字文本框

    我有一个DataGridView 我想要它的第一列或任何所需的列 其中有textboxes在其中 成为NUMERIC ONLY 我目前正在使用这段代码 private void dataGridViewItems EditingContro
  • make_shared<>() 中的 WKWYL 优化是否会给某些多线程应用程序带来惩罚?

    前几天我偶然看到这个非常有趣的演示 http channel9 msdn com Events GoingNative GoingNative 2012 STL11 Magic Secrets作者 Stephan T Lavavej 其中提
  • 名称查找、实例化点 (POI) 和基本类型

    以下代码针对 X 进行编译 但不适用于 double struct X void foo double void foo X namespace NN struct A void foo A foo double error foo not
  • 检测 TextBox 中的 Tab 键按下

    I am trying to detect the Tab key press in a TextBox I know that the Tab key does not trigger the KeyDown KeyUp or the K
  • 为什么 std::function 不是有效的模板参数,而函数指针却是?

    我已经定义了名为的类模板CallBackAtInit其唯一目的是在初始化时调用函数 构造函数 该函数在模板参数中指定 问题是模板不接受std function作为参数 但它们接受函数指针 为什么 这是我的代码 include
  • “没有合适的默认构造函数可用”——为什么会调用默认构造函数?

    我已经查看了与此相关的其他一些问题 但我不明白为什么在我的情况下甚至应该调用默认构造函数 我可以只提供一个默认构造函数 但我想了解它为什么这样做以及它会产生什么影响 error C2512 CubeGeometry no appropria
  • 如何设置消息队列的所有者?

    System Messaging MessageQueue 类不提供设置队列所有权的方法 如何以编程方式设置 MSMQ 消息队列的所有者 简短的答案是 p invoke 对 windows api 函数的调用MQSetQueueSecuri
  • 从点云检测平面集

    我有一组点云 我想测试3D房间中是否有角落 所以我想讨论一下我的方法 以及在速度方面是否有更好的方法 因为我想在手机上测试它 我将尝试使用霍夫变换来检测线 然后我将尝试查看是否有三条线相交 并且它们也形成了两个相交的平面 如果点云数据来自深
  • C 与 C++ 中的 JNI 调用不同?

    所以我有以下使用 Java 本机接口的 C 代码 但是我想将其转换为 C 但不知道如何转换 include
  • 使用 Unity 在 C# 中发送 http 请求

    如何使用 Unity 在 C 中发送 HTTP GET 和 POST 请求 我想要的是 在post请求中发送json数据 我使用Unity序列化器 所以不需要 新的 我只想在发布数据中传递一个字符串并且能够 将 ContentType 设置
  • 如何测试某些代码在 C++ 中无法编译? [复制]

    这个问题在这里已经有答案了 可能的重复 单元测试编译时错误 https stackoverflow com questions 605915 unit test compile time error 我想知道是否可以编写一种单元测试来验证给
  • 用数组或向量实现多维数组

    我想使用单个数组或向量实现多维数组 可以像通常的多维数组一样访问它 例如 a 1 2 3 我陷入困境的是如何实施 操作员 如果数组的维数为 1 则 a 1 应该返回位于索引 1 处的元素 但是如果维数大于一怎么办 对于嵌套向量 例如 3 维
  • 时间:2019-03-17 标签:c#TimerStopConfusion

    我想通过单击按钮时更改文本颜色来将文本框文本设置为 闪烁 我可以让文本按照我想要的方式闪烁 但我希望它在闪烁几次后停止 我不知道如何在计时器触发几次后让它停止 这是我的代码 public Form1 InitializeComponent
  • 当 Verb="runas" 时设置 ProcessStartInfo.EnvironmentVariables

    我正在开发一个 C 应用程序 我需要创建变量并将其传递给新进程 我正在使用ProcessStartInfo EnvironmentVariables 新进程必须提升运行 因此我使用 Verb runas var startInfo new
  • 运行 xunit 测试时无法将输出打印到控制台窗口

    public class test2InAnotherProject private readonly ITestOutputHelper output public test2InAnotherProject ITestOutputHel

随机推荐

  • 使用 VBA 在 Excel 中选择形状

    我正在尝试使用 VBA 按名称选择形状 在我的工作表中 我有 10 个形状 名称分别为 1 到 10 并且想要一个特定的形状 由于某种原因 excel 使用我的代码选择的形状似乎不是我告诉它选择的名称的形状 据我所知 它选择的形状是随机的
  • 无法将“Vary”标头附加到响应中

    我正在尝试添加一个Vary Accept Encoding我压缩的文件的响应头 正如之前所建议的 https stackoverflow com questions 7848796 what does varyaccept encoding
  • 根据任意分布设置 Eigen::Matrix 的系数

    Eigen Matrix 有一个 setRandom 方法 它将矩阵的所有系数设置为随机值 但是 是否有一种内置方法可以将所有矩阵系数设置为随机值 同时指定要使用的分布 有没有办法实现类似以下内容 Eigen Matrix3f myMatr
  • SqlDependency 仅在订阅时触发

    我正在尝试利用SqlDependancy在 SignalR 项目中 但我似乎无法得到OnChanged事件多次触发 它最初在订阅事件上触发 但在对底层数据库进行更改后不会再次触发 我省略了 SignalR 和控制器代码 因为问题似乎出在存储
  • PHP 引导基础知识

    我正在编写我的第一个 PHP 应用程序 每个人都谈论拥有一个bootstrap php初始化您的应用程序 这是有道理的 我已经整理了一个我很满意的 有两件事我不明白 而且似乎没有人提到 我在哪里调用我的引导表单 我是否将其包含在每个页面中
  • C++ 中的 IPv6 连接测试

    是否有任何 C 函数可以测试运行我的程序的计算机是否支持 IPv6 连接 我需要知道类似此页面的结果http test ipv6 com http test ipv6 com 但是在 C 中 EDIT 我试图使用getifaddrs 但返回
  • 如何从 FTP 获取文件(使用 C#)?

    现在我知道如何将文件从一个目录复制到另一个目录 这非常简单 但现在我需要对 FTP 服务器上的文件执行相同的操作 你能给我一些如何在更改文件名的同时从 FTP 获取文件的示例吗 看一眼如何 使用 FTP 下载文件 http msdn mic
  • 将动态加载的自定义 ASP 控件的脚本注册到 DOM

    我在 a 期间加载我的 ascx 控件postback 下拉更改事件 父级 C private void ddlChange MyControl myCtr CallScript Page LoadControl Controls MyCo
  • 通过单击按钮填充 Javascript 中的文本框 [关闭]

    很难说出这里问的是什么 这个问题是含糊的 模糊的 不完整的 过于宽泛的或修辞性的 无法以目前的形式得到合理的回答 如需帮助澄清此问题以便重新打开 访问帮助中心 help reopen questions 我试图通过单击表单按钮来填充表单上的
  • WebClient DownloadString UTF-8 不显示国际字符

    我尝试将网站的 html 保存在字符串中 该网站具有国际字符 即使我将编码设置为与网站字符集相对应的 UTF 8 它们也不会保存到字符串中 这是我的代码 using WebClient client new WebClient client
  • 优化多重连接

    我正在尝试找出一种方法来加速一个特别繁琐的查询 该查询按日期在几个表中聚合一些数据 下面是完整的 丑陋的 查询以及EXPLAIN ANALYZE以表明它是多么可怕 如果有人可以看一下 看看他们是否能发现任何重大问题 很可能 我不是 Post
  • 是否可以使用 Mongoose 在 MongoDB 中创建新数据库?

    我想知道是否可以使用 Mongoose 在 MongoDB 中创建一个新数据库 我在 Node 上运行 并且我知道 Node 的 MongoDB 驱动程序可以做到这一点 但我想知道是否可以仅从 Mongoose 中做到这一点 有没有相当于d
  • 对于 OS X 特定代码,我应该使用什么 C 预处理器条件?

    对于 OS X 特定代码 我应该使用什么 C 预处理器条件 如果我为 OS X 进行编译 则需要包含特定的库 如果为 Linux 进行编译 则需要包含不同的标头 我知道有 APPLE 但我不知道这是否是 OS X 10 x 的当前条件 此操
  • 如何在云(AWS、heroku 等)中跨多个节点建立时钟同步?

    我想在云中运行一个大型节点集群 AWS Heroku 或者可能是自我管理的 VMS 其时钟必须与预定义的容差同步 我正在寻找大约 200 毫秒的容差 这意味着 如果我有 250 个节点 那么这 250 个节点之间的最大时钟差异不应超过 20
  • SQL 查询:在给定时间间隔内处于活动状态的所有 ID 的列表,按开始时间排序

    我有一个包含轨道点 x y 坐标 的 MySQL 表 每行包含 TrackID 时间戳以及该轨道在给定时间点的 X 和 Y 位置 我想要的是在给定时间间隔 tmin tmax 内处于活动状态的所有 TrackID 的列表 按其开始时间排序
  • YouTube 搜索 API 与 YouTube 上的手动搜索返回不同的结果

    我正在使用 YouTube v3 API 来搜索视频 在某些情况下 从 API 返回的结果与我在 YouTube 网站上手动使用完全相同的查询字符串时得到的结果完全不同 请任何人解释为什么会发生这种情况 例如搜索 Zombie Huntin
  • 如何使标签显示带有不同颜色字母的FormattedString?

    我正在使用 FormattedString 在 Xamarin Forms 上的标签上显示自定义文本 我想要实现的是更改一个或多个元素的颜色 例如 但即使我正在更改颜色 标签也只会显示具有相同颜色的所有美元符号 这是视图上的标签
  • 在 Bukkit 插件中将赏金参数读取为整数

    这只是该插件的开始 还会有更多 这就是我想要的 对于 bounty
  • 从初始视口启用“缩小”

    这是在我的 Android Chrome 浏览器上处理视口元标记时出现的问题 未在其他浏览器中测试 我想要一个可以缩小的网页 而不仅仅是放大 如果我用这个 我可以缩小到 0 5 的比例 0 5 是 初始 缩放 正如我所期望的那样 但如果我用
  • C# 对象引用如何在内存中/运行时(在 CLR 中)表示?

    我很想知道 C 对象引用在运行时 在 NET CLR 中 如何在内存中表示 我想到的一些问题是 对象引用占用多少内存 在类的范围和方法的范围中定义时有什么不同吗 它所在的位置是否根据此范围 堆栈与堆 而有所不同 对象引用中维护的实际数据是什