如果局部(但未使用)变量是对对象的唯一强引用,那么符合标准的 C# 编译器是否可以优化它?

2024-01-24

另请参阅这些相关资源:

  • .NET 垃圾收集器是否执行代码预测分析? https://stackoverflow.com/questions/3161119/does-the-net-garbage-collector-perform-predictive-analysis-of-code(在堆栈溢出上)
  • WP7:GC何时将局部变量视为垃圾 https://learn.microsoft.com/en-us/archive/blogs/abhinaba/wp7-when-does-gc-consider-a-local-variable-as-garbage?wa=wsignin1.0(MSDN 上的博客文章)

换句话说:

一个对象可以被本地引用吗 变量在之前被回收 变量超出范围(例如 因为变量已被赋值,但是 然后不再使用),或者是这样 保证不符合条件的对象 垃圾收集直到变量 超出范围?

让我解释:


void Case_1()
{
    var weakRef = new WeakReference(new object());

    GC.Collect();  // <-- doesn't have to be an explicit call; just assume that
                   //     garbage collection would occur at this point.

    if (weakRef.IsAlive) ...
}

在这个代码示例中,我显然必须计划新版本的可能性object被垃圾收集器回收;因此if陈述。

(请注意,我正在使用weakRef唯一的目的是检查新的object仍然存在。)


void Case_2()
{
    var unusedLocalVar = new object();
    var weakRef = new WeakReference(unusedLocalVar);

    GC.Collect();  // <-- doesn't have to be an explicit call; just assume that
                   //     garbage collection would occur at this point.

    Debug.Assert(weakRef.IsAlive);
}

此代码示例与前一个代码示例的主要变化是新的object被局部变量强引用(unusedLocalVar)。然而,这个变量在弱引用之后再也不会被使用(weakRef) 已经被创造了。


问题:是否允许符合标准的 C# 编译器优化前两行Case_2进入那些Case_1如果它看到了unusedLocalVar只用在一个地方,即作为WeakReference构造函数?即是否有可能断言Case_2可能会失败吗?


C# 编译器做什么并不重要 - 一旦本地引用在方法体中不再存在,JITter/GC 就可以清理它们。查看文档GC保持活动 http://msdn.microsoft.com/en-us/library/system.gc.keepalive.aspx

还有,这个PowerPoint演示文稿 http://download.microsoft.com/download/e/2/1/e216b4ce-1417-41af-863d-ec15f2d31b59/DEV490.ppt,特别是从幻灯片 30 开始,有助于解释 JIT/GC 可以做什么。

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

如果局部(但未使用)变量是对对象的唯一强引用,那么符合标准的 C# 编译器是否可以优化它? 的相关文章

  • 计算 Richtextbox 中所有单词的最有效方法是什么?

    我正在编写一个文本编辑器 需要提供实时字数统计 现在我正在使用这个扩展方法 public static int WordCount this string s s s TrimEnd if String IsNullOrEmpty s re
  • 错误:表达式不产生值

    我尝试将以下 C 代码转换为 VB NET 但在编译代码时出现 表达式不产生值 错误 C Code return Fluently Configure Mappings m gt m FluentMappings AddFromAssemb
  • 如何在加载.NET WinForm应用程序user.config文件时捕获异常?

    有时 在使用默认配置系统的 NET 2 0 WinForm 桌面应用程序中 user config文件将被损坏并且无法再加载 当配置系统尝试加载它时 它会抛出一个System Xml XmlException 抛开 为什么文件首先被损坏 的
  • 使用 LINQ2SQL 在 ASP.NET MVC 中的各种模型存储库之间共享数据上下文

    我的应用程序中有 2 个存储库 每个存储库都有自己的数据上下文对象 最终结果是我尝试将从一个存储库检索到的对象附加到从另一个存储库检索到的对象 这会导致异常 Use 构造函数注入将 DataContext 注入每个存储库 public cl
  • 复制目录内容

    我想将目录 tmp1 的内容复制到另一个目录 tmp2 tmp1 可能包含文件和其他目录 我想使用C C 复制tmp1的内容 包括模式 如果 tmp1 包含目录树 我想递归复制它们 最简单的解决方案是什么 我找到了一个解决方案来打开目录并读
  • 单个对象的 Monogame XNA 变换矩阵?

    我读过一些解释 XNA Monogame 变换矩阵的教程 问题是这些矩阵应用于 SpriteBatch Begin matrix 这意味着所有 Draw 代码都将被转换 如何将变换矩阵应用于单个可绘制对象 就我而言 我想转换滚动背景 使其自
  • 将 Word 文档另存为图像

    我正在使用下面的代码将 Word 文档转换为图像文件 但是图片显得太大 内容不适合 有没有办法渲染图片或将图片保存到合适的尺寸 private void btnConvert Click object sender EventArgs e
  • 在 C 中初始化变量

    我知道有时如果你不初始化int 如果打印整数 您将得到一个随机数 但将所有内容初始化为零似乎有点愚蠢 我问这个问题是因为我正在评论我的 C 项目 而且我对缩进非常直接 并且它可以完全编译 90 90 谢谢 Stackoverflow 但我想
  • qdbusxml2cpp 未知类型

    在使用 qdbusxml2cpp 程序将以下 xml 转换为 Qt 类时 我收到此错误 qdbusxml2cpp c ObjectManager a ObjectManager ObjectManager cpp xml object ma
  • 为什么调用非 const 成员函数而不是 const 成员函数?

    为了我的目的 我尝试包装一些类似于 Qt 共享数据指针的东西 经过测试 我发现当应该调用 const 函数时 会选择它的非 const 版本 我正在使用 C 0x 选项进行编译 这是一个最小的代码 struct Data int x con
  • 如何检测表单的任何控件的变化?

    如何检测 C 中表单的任何控件的更改 由于我在一个表单上有许多控件 并且如果表单中的任何控件值发生更改 我需要禁用按钮 我正在寻找一些内置函数 事件处理程序 属性 并且不想为此创建自定义函数 不 我不知道任何时候都会触发任何事件any控制表
  • 如何在 Xaml 文本中添加电子邮件链接?

    我在 Windows Phone 8 应用程序中有一些大文本 我希望其中有电子邮件链接 例如 mailto 功能 这是代码的一部分
  • C# HashSet 只读解决方法

    这是示例代码 static class Store private static List
  • 如何禁用 fread() 中的缓冲?

    我正在使用 fread 和 fwrite 读取和写入套接字 我相信这些函数用于缓冲输入和输出 有什么方法可以在仍然使用这些功能的同时禁用缓冲吗 Edit 我正在构建一个远程桌面应用程序 远程客户端似乎 落后于服务器 我不知道可能是什么原因
  • “接口”类似于 boost::bind 的语义

    我希望能够将 Java 的接口语义与 C 结合起来 起初 我用过boost signal为给定事件回调显式注册的成员函数 这非常有效 但后来我发现一些函数回调池是相关的 因此将它们抽象出来并立即注册所有实例的相关回调是有意义的 但我了解到的
  • 不同类型指针之间的减法[重复]

    这个问题在这里已经有答案了 我试图找到两个变量之间的内存距离 具体来说 我需要找到 char 数组和 int 之间的距离 char data 5 int a 0 printf p n p n data 5 a long int distan
  • 调用堆栈中的“外部代码”是什么意思?

    我在 Visual Studio 中调用一个方法 并尝试通过检查调用堆栈来调试它 其中一些行标记为 外部代码 这到底是什么意思 方法来自 dll已被处决 外部代码 意味着该dll没有可用的调试信息 你能做的就是在Call Stack窗口中单
  • 我的班级应该订阅自己的公共活动吗?

    我正在使用 C 3 0 遵循标准事件模式我有 public event EventHandler
  • 使用 .NET Process.Start 运行时挂起进程 - 出了什么问题?

    我在 svn exe 周围编写了一个快速而肮脏的包装器来检索一些内容并对其执行某些操作 但对于某些输入 它偶尔会重复挂起并且无法完成 例如 一个调用是 svn list svn list http myserver 84 svn Docum
  • 从列表中选择项目以求和

    我有一个包含数值的项目列表 我需要使用这些项目求和 我需要你的帮助来构建这样的算法 下面是一个用 C 编写的示例 描述了我的问题 int sum 21 List

随机推荐

  • 如何隐藏 UIImagepickercontroller 中的状态栏?

    我是 iOS 开发新手 我试图隐藏状态栏UIImagePickerController 每当我单击 拍照 时 就会出现状态栏 它并不隐藏 我希望状态栏仅隐藏在UIImagePickerController 这是我的代码 IBAction t
  • 在机器对机器场景中使用 MSAL 作为 CSP

    我正在尝试使用官方 nuget 库来使用 GraphAPI https github com microsoftgraph msgraph sdk dotnet https github com microsoftgraph msgraph
  • 播放框架WS url空间

    我在 play 框架 2 3 3 中调用 WS url 时遇到问题 其中 url 包含空格 所有其他字符均自动进行 url 编码 但空格除外 当我尝试将所有空格更改为 20 时 WS 由于 字符而将其转换为 2520 对于空格 我得到了 j
  • 为什么锁定 std::mutex 两次“未定义行为”?

    按照这个article http www devx com SpecialReports Article 38883 1954 如果您尝试从同一线程两次锁定非递归互斥锁 而中间没有解锁 则会出现未定义的行为 我非常天真的想法告诉我为什么他们
  • Neo4j 2.0 双类型转储

    在 Neo4j 2 0 社区 上 当我转储包含一些具有 Double 类型属性的节点的数据库时 我获得一个具有科学记数法值的文件 ex 1 43524185E8 导入此文件时 neo4j shell 失败并出现以下错误 Invalid in
  • 在 Eclipse (App Engine) 项目中包含 JAR 文件

    我今天和昨天几个小时都在寻找这个问题的解决方案 所以我决定在这里解决它 尽管这似乎是一个愚蠢的问题 情况 我在 Eclipse Java EE 中设置了一个 Google AppEngine 项目 它已经存在了好几个星期 一切都运行良好 我
  • Linux 上的共享库有哪些好的做法?

    我最近阅读了很多有关 Linux 上共享库的内容 以下是我学到的内容 共享库应该嵌入一个soname包括其主要版本号 就像是 libfoo so 1 其真实文件名还应包含次要版本号 就像是 libfoo so 1 0 当库文件被复制到时 比
  • 如何动态重新加载 Oracle APEX 5.0 树

    当触发事件 例如单击按钮 时 我需要使用新参数重新加载完整树 设置项目值并且需要在 Tree SQL 中使用新项目值 当我尝试使用 刷新 操作刷新树区域时 树节点不刷新 树小部件支持一整套高级操作 问题是 apex 团队从未向开发人员公开过
  • 时间轴值在某些 ggplot 图中不正确,但在其他图中则不然

    Forum 这是我的数据的样子 gt data cvg Source local data frame 938 x 5 Date Day Time Parameter Value time fctr time chr dbl 1 2016
  • 什么 Java 方法接受 int 并返回 +1 或 -1?

    什么 Java 方法需要一个int并返回 1或 1 其判断标准是是否int是正的还是负的 我浏览了文档 但我不擅长阅读它 所以找不到它 我知道我在某处见过它 Integer signum int i http java sun com ja
  • 将参数传递给BAT文件并双击运行

    我想将两个文件路径 对于 Windows 作为命令行参数传递给脚本 在 Windows 中 如果我们右键单击一个文件 我们可以看到 属性 选项 并且在 常规 选项卡下显示像 test bat 这样的文件名 我们可以从那里传递参数吗 实际上我
  • 了解Elasticsearch的write_consistency和quorum规则

    根据elasticsearch文档 write consistency级别仲裁的规则是 法定人数 gt 副本 2 1 使用 ES 0 19 10 在具有 16 个分片 3 个副本的设置中 我们将得到 16 个主分片 48 个复制品 运行 2
  • 带队列的长时间运行的 REST API

    我们正在实现一个 REST API 它将启动多个长时间运行的后端任务 我一直在阅读 RESTful Web Services Cookbook 建议返回 HTTP 202 Accepted 并带有指向正在处理的任务的 Content Loc
  • 使用 RxSwift、驱动程序并绑定到 [关闭]

    Closed 这个问题需要细节或清晰度 help closed questions 目前不接受答案 我第一次问问题 我正在学习RxSwift 如何使用bind to和driver driver和bind to有什么区别 现在还有谁在学习Rx
  • 如何按色调/图例组用百分比注释分组条形图

    我想根据色调在条形顶部添加百分比 这意味着所有红色和蓝色条分别等于 100 我可以使蓝色条等于 100 但红色条不能 哪些部分需要修改 导入和样本数据 import pandas as pd import numpy as np impor
  • 如何使用 $resource 操作设置自定义标头?

    使用 http 我们可以这样做 var config headers something anything http get url to json config success function do something 我想对 reso
  • VS 2017 版本 15.3.x 中的标签助手智能感知不起作用

    在 Visual Studio 2017 的过去版本中 如果开发人员想要拥有标签助手智能感知 他们需要安装 Razor 语言服务 如此答案中所示 Visual Studio 2017 中的 ASP NET Core 标记帮助程序 Intel
  • 手动触发钻取事件,highcharts

    我正在研究 highchart 的向下钻取 向上图表 我能够通过以下方式从 highchart 外部单击点来触发向下钻取事件 chart series 0 data 0 firePointEvent click event 但我找不到任何会
  • 在ajax调用期间创建会话(php-xajax)

    除非完全必要 否则我需要避免在应用程序中创建会话 我注意到 如果会话未启动 xajax 调用将无法正常工作 我的第一个方法是在 xajax 函数的开头创建会话 如果不存在 但是 它不起作用用户第一次调用该调用 自会话创建以来第二次调用 有什
  • 如果局部(但未使用)变量是对对象的唯一强引用,那么符合标准的 C# 编译器是否可以优化它?

    另请参阅这些相关资源 NET 垃圾收集器是否执行代码预测分析 https stackoverflow com questions 3161119 does the net garbage collector perform predicti