C# 析构函数未按预期工作

2024-04-27

请参阅下面的代码。我希望它打印 10 之一,因为我已经显式调用了垃圾收集器。但我总是得到 0 或 20 作为输出。这是为什么?

void Main()
{
    Panda[] forest_panda = new Panda[10];
    for(int i=0; i<forest_panda.GetLength(0);i++)
    {
        forest_panda[i]=new Panda("P1");
    }

    for(int i=0; i<forest_panda.GetLength(0);i++)
    {
        forest_panda[i]=new Panda("P1");
    }

    System.GC.Collect();

    Console.WriteLine("Total Pandas created is {0}",Panda.population);          
}

class Panda
{
    public static int population=0;
    public string name;

    public Panda(string name)
    {
        this.name = name;
        population = population + 1;
    }

    ~Panda()
    {
        population = population - 1;
    }   
}

请注意,Main 的类是由 LINQPad(《C# 4.0 in a Nutshell》一书附带的编辑器)自动创建的。我是 C# 新手。


您尚未运行显式垃圾收集。从文档GC.Collect() http://msdn.microsoft.com/en-us/library/xe0c2357%28VS.80%29.aspx:

使用此方法尝试回收 所有无法访问的内存。 然而,Collect 方法并不 保证所有不可访问的内存 被回收。

所有物体,无论多长时间 他们一直在记忆中, 考虑收集;然而, 托管中引用的对象 代码不被收集。用这个 强制系统尝试的方法 收回最大金额 有效内存。

垃圾收集器经过高度优化,并且在实际进行垃圾收集时完全由自己“决定”,然后调用终结器。此外,这一切都是异步完成的。这也是 Finalizer 被称为非确定性清理的原因。当清理发生时,你永远不会现在。

你现在有两个选择。您可以致电GC.WaitForPendingFinalizers() http://msdn.microsoft.com/en-us/library/system.gc.waitforpendingfinalizers.aspx这将暂停当前线程,直到所有可终结的对象都被终结。或者称这个新的重载为:System.GC.Collect(int生成,System.GCCollectionMode模式) http://msdn.microsoft.com/en-us/library/bb356724%28VS.90%29.aspx with GCCollectionMode.Forced它是在 .NET 3.5 中引入的。

请记住,通常没有必要,更重要的是:一个坏主意手动调用垃圾收集器。此外,仅在极少数情况下才需要实现终结器。调用垃圾收集器会减慢运行时间。实现终结器还会进一步减慢运行时间。当所有实现了终结器的对象准备好被垃圾收集时,垃圾收集器会将它们放入终结队列中。处理这个队列的成本很高。 更糟糕的是,当终结器运行时,不能保证您尝试访问的成员仍然存活。它们很可能已经被收集起来了。这就是为什么只有当你有以下情况时才应该使用终结器:不受管理的需要清理的资源。

在您的示例中绝对不需要所有这些。你真正想要的是I一次性 http://msdn.microsoft.com/en-us/library/system.idisposable.aspx用于确定性清理。

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

C# 析构函数未按预期工作 的相关文章

  • GCC C++ (ARM) 和指向结构体字段的 const 指针

    假设有一个简单的测试代码 typedef struct int first int second int third type t define ADDRESS 0x12345678 define REGISTER type t ADDRE
  • Tensorflow 中的自定义资源

    由于某些原因 我需要为 Tensorflow 实现自定义资源 我试图从查找表实现中获得灵感 如果我理解得好的话 我需要实现3个TF操作 创建我的资源 资源的初始化 例如 在查找表的情况下填充哈希表 执行查找 查找 查询步骤 为了促进实施 我
  • MEX 文件中的断言导致 Matlab 崩溃

    我正在使用mxAssert 宏定义为matrix h在我的 C 代码中 mex 可以完美编译 当我调用的 mex 代码中违反断言时 该断言不会导致我的程序崩溃 而是导致 Matlab 本身崩溃 我错过了什么吗 这是有意的行为吗 当我查看 M
  • 通信对象 System.ServiceModel.Channels.ServiceChannel 不能用于通信

    通信对象System ServiceModel Channels ServiceChannel 无法用于通信 因为它处于故障状态 这个错误到底是什么意思 我该如何解决它 您收到此错误是因为您让服务器端发生 NET 异常 并且您没有捕获并处理
  • try-catch 中未处理的异常

    try list from XElement e in d Descendants wix File where e Attribute Name Value Contains temp Name e Parent Parent Attri
  • 获取从属性构造函数内部应用到哪个属性的成员?

    我有一个自定义属性 在自定义属性的构造函数内 我想将属性的属性值设置为属性所应用到的属性的类型 是否有某种方式可以访问该属性所应用到的成员从我的属性类内部 可以从 NET 4 5 using CallerMemberName Somethi
  • C++11 函数局部静态 const 对象的线程安全初始化

    这个问题已在 C 98 上下文中提出 并在该上下文中得到回答 但没有明确说明有关 C 11 的内容 const some type create const thingy lock my lock some mutex static con
  • 转到 C# WPF 中的第一页

    我正在 WPF 中使用导航服务 为了导航到页面 我使用 this NavigationService Navigate new MyPage 为了返回我使用 this NavigationService GoBack 但是如何在不使用的情况
  • 两组点之间的最佳匹配

    I ve got two lists of points let s call them L1 P1 x1 y1 Pn xn yn and L2 P 1 x 1 y 1 P n x n y n 我的任务是找到它们点之间的最佳匹配 以最小化它
  • C# using 语句、SQL 和 SqlConnection

    使用 using 语句 C SQL 可以吗 private static void CreateCommand string queryString string connectionString using SqlConnection c
  • 如何排列表格中的项目 - MVC3 视图 (Index.cshtml)

    我想使用 ASP NET MVC3 显示特定类型食品样本中存在的不同类型维生素的含量 如何在我的视图 Index cshtml 中显示它 an example 这些是我的代码 table tr th th foreach var m in
  • Qt - 设置不可编辑的QComboBox的显示文本

    我想将 QComboBox 的文本设置为某些自定义文本 不在 QComboBox 的列表中 而不将此文本添加为 QComboBox 的项目 此行为可以在可编辑的 QComboBox 上实现QComboBox setEditText cons
  • 通过等待任务或访问其 Exception 属性都没有观察到任务的异常

    这些是我的任务 我应该如何修改它们以防止出现此错误 我检查了其他类似的线程 但我正在使用等待并继续 那么这个错误是怎么发生的呢 通过等待任务或访问其 Exception 属性都没有观察到任务的异常 结果 未观察到的异常被终结器线程重新抛出
  • C# 搜索目录中包含字符串的所有文件,然后返回该字符串

    使用用户在文本框中输入的内容 我想搜索目录中的哪个文件包含该文本 然后我想解析出信息 但我似乎找不到该字符串或至少返回信息 任何帮助将不胜感激 我当前的代码 private void btnSearchSerial Click object
  • 是否有一个 C++ 库可以从 PDF 文件中提取文本,例如 PDFBox for Java? [关闭]

    Closed 此问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 help closed questions 目前不接受答案 去年 我使用 PDFBox 在 Java 中创建了一个应用程序来获取某些 PDF 文件中的原始文本 现在
  • gdb查找行号的内存地址

    假设我已将 gdb 附加到一个进程 并且在其内存布局中有一个文件和行号 我想要其内存地址 如何获取文件x中第n行的内存地址 这是在 Linux x86 上 gdb info line test c 56 Line 56 of test c
  • Fluent NHibernate 日期时间 UTC

    我想创建一个流畅的 nhibernate 映射来通过以下方式映射 DateTime 字段 保存时 保存 UTC 值 读取时 调整为本地时区值 实现此映射的最佳方法是什么 就我个人而言 我会将日期存储在 UTC 格式的对象中 然后在读 写时在
  • 运行代码首先迁移更新数据库时出错

    我在迁移到数据库时遇到问题 并且似乎找不到我遇到的错误的答案 System MissingMethodException Method not found System Data Entity Migrations Builders Tab
  • 过度使用委托对性能来说是一个坏主意吗? [复制]

    这个问题在这里已经有答案了 考虑以下代码 if IsDebuggingEnabled instance Log GetDetailedDebugInfo GetDetailedDebugInfo 可能是一个昂贵的方法 因此我们只想在调试模式
  • Azure函数版本2.0-应用程序blobTrigger不工作

    我有一个工作功能应用程序 它有一个 blob 输入和一个事件中心输出 在测试版中工作 随着最新的更改 我的功能不再起作用 我尝试根据发行说明更新 host json 文件 但它没有引用 blob 触发器 version 2 0 extens

随机推荐

  • 如何将变量从一个 PowerShell 脚本加载到另一个?

    我有一个主脚本正在调用其他几个脚本 我需要将其他脚本中的变量加载到主脚本中 以便我可以将它们转储到 html 文件中 我尝试对我正在调用的脚本进行点采购 但这不起作用 或者我做错了什么 任何帮助 将不胜感激 脚本的示例部分 get clus
  • 在弹出窗口中打开 Google Play(如 Vimeo、Wisher、Buzzfeed)- 即时应用

    如何在 Wisher Buzzfeed Vimeo 等弹出窗口中打开 Google Play 我在看谷歌文档 https developer android com distribute marketing tools linking to
  • C# 以编程方式访问 Excel 宏

    我正在使用 Excel 文件的目录来获取有关每个文件的信息 我正在尝试使用 C Excel 互操作来收集有关与其中一些文件关联的 VBA 宏的信息 其代码如下 问题在于 所有 Excel 文件都没有启用对宏的编程访问 我可以在文件的本地副本
  • PHP - 如何替换 url 的特殊字符

    我正在尝试转换特殊字符 例如 我将使用它们来进行 GET 请求 我为此构建了一个函数 function convert text text t text specChars array gt 20 gt 21 gt 22 gt 23 gt
  • 如何将大于127的ASCII值发送到串口

    每当我将任何大于 127 的 ASCII 值发送到 com 端口时 我都会在串行端口上收到垃圾输出值 ComPort Write data 严格来讲ASCII http en wikipedia org wiki ASCII仅包含 128
  • 使用 WiX 将程序集放入 GAC 和安装路径中

    我刚刚开始学习如何使用 WiX 但遇到了障碍 我的软件包使用第三方库 该库要求 GAC 和软件包安装目录中都存在一些文件 使用 WiX 我可以使文件显示在安装目录或 GAC 中 但不能同时显示在两者中 有什么办法可以解决这个问题吗 这里有一
  • 在 C++ 中传递参数到 boost odeint

    This https stackoverflow com questions 33856910 passing runtime parameters to odeint integrator 答案很有帮助 但我想知道如何将不同类型的多个参数
  • 无需实现可克隆接口即可克隆对象

    要克隆对象 我需要实现 可克隆 接口吗 因为这里我的类是一个 jar 文件 我的意思是 API 所以我无法编辑课程 我听说所有类都扩展了基对象类 并且该对象类实现了可克隆接口 这是否意味着我们可以直接克隆对象而不实现接口 如果是这样 在我的
  • 类型 RoleStore 不可分配给服务 IRoleStore

    我正在尝试使用 Autofac 为使用 MVC5 和 EF6 的项目设置依赖项注入 我很难弄清楚如何正确解耦 EntityFramework RoleStore 实现 我只想依赖 Identity IRoleStore 但我知道对于泛型类
  • 如何将 ListPlot 的图形与 Plot 的图形结合起来?

    有没有办法将图形组合起来ListPlot到一个图形Plot 我需要在 ListPlot 的图形上绘制函数的图形 您可以将任何图形与Show函数如下 Show myListPlot myPlot 这概括为一次组合任意数量的图 Show p1
  • 为什么不卸载类加载器就无法卸载类?

    答案是 卸载java中的类 https stackoverflow com questions 148681 unloading classes in java says 卸载类的唯一方法是使用的类加载器被垃圾收集 我看了一下JLS htt
  • 使用 bash 解析 ICS 文件

    这是一个谷歌日历 ics 文件 我每次都会下载它来检查是否有新的比赛事件被添加或更改 并且我出现在IRC上 我需要转换这样的文件 BEGIN VEVENT DTSTART 20160612T201000Z DTEND 20160612T21
  • pyparsing:示例 JSON 解析器对于字典列表失败

    All 我试图了解如何使用 pyparsing 处理字典列表 我已经回到了JSON 解析器示例 http pyparsing wikispaces com file view jsonParser py 30308858 jsonParse
  • Log4J 配置不显示 JBoss AS7 中的 Spring Transaction 和其他日志

    以下是我的 log4j properties log4j rootLogger ALL stdout log4j appender stdout org apache log4j ConsoleAppender log4j appender
  • Processmaker 中的 Jquery Ajaxing

    我正在使用一个名为 ProcessMaker 的网络应用程序 他们不支持 jquery 所以我必须自己弄清楚如何整合它 他们的论坛上有很多人试图完成它 所以幸运的是它现在已经被记录下来 如果有人愿意这样做 这里是我详细介绍了该过程的链接 我
  • 循环遍历 POST 数组

    我需要循环遍历 post 数组并提交它 stuff 1
  • 如何训练具有 2D 输出的网络? (蟒蛇,凯拉斯)

    我想训练一个回归网络 其输出是两个坐标 x1 y1 和 x2 y2 我的问题是 如果我想训练网络 我的输出应该分开吗 我的意思是我的输出应该是这样的 x1 y1 x2 y2 或者有没有办法将它们堆叠起来 例如 x1 y1 x2 y2 提前致
  • 明确的追溯 .gitignore (如何让 Git 完全/追溯地*忘记*现在在 .gitignore 中的文件)

    Preface This question attempts to clear the confusion regarding applying gitignore retroactively not just to the present
  • 使用局部函数和全局函数哪个更优化?

    我想知道使用 a 是否更优化局部功能 在下面的例子中 drawBitmap 只需要3个参数 and 无法内联因为该函数访问一些所有者过程变量 或者使用可以内联的全局函数 但它真的会内联吗 这需要5个参数 也不知道这是否重要 但是这段代码主要
  • C# 析构函数未按预期工作

    请参阅下面的代码 我希望它打印 10 之一 因为我已经显式调用了垃圾收集器 但我总是得到 0 或 20 作为输出 这是为什么 void Main Panda forest panda new Panda 10 for int i 0 i