测试终结器和 IDisposable

2024-03-27

问题是如何测试调用 Finalize 时对象释放资源的事实。 该类的代码:

public class TestClass : IDisposable {

    public bool HasBeenDisposed {get; private set; }

    public void Dispose() {
        HasBeenDisposed = true;
    }

    ~TestClass() {
        Dispose();
    }
}

请注意我现在不关心 Dispose/Finalize 的正确实现,因为我想先找到测试它的方法。在这个阶段,假设已处置如果调用 Dispose/Finalize ware,则将设置为 true。

我写的实际测试如下:
更新为弱引用:

[Test]
public void IsCleanedUpOnGarbadgeCollection() {
    var o = new TestClass();
    o.HasBeenDisposed.Should().Be.False();

    **var weak = new WeakReference(o, true); // true =Track after finalisation
    o = null; // Make eligible for GC**

    GC.Collect(0, GCCollectionMode.Forced);
    GC.WaitForPendingFinalizers();


    **((TestClass)weak.Target)**.HasBeenDisposed.Should().Be.True();
}

或者我更喜欢的代码(更新后添加):

[Test]
public void IsCleanedUpOnGarbadgeCollection() {
    WeakReference weak = null;

    // Use action to isolate instance and make them eligible for GC
    // Use WeakReference to track the object after finalisaiton
    Action act = () = {
        var o = new TestClass();
        o.HasBeenDisposed.Should().Be.False();
        weak = new WeakReference(o, true); // True=Track reference AFTER Finalize
    };

    act();

    GC.Collect(0, GCCollectionMode.Forced);
    GC.WaitForPendingFinalizers();

    // No access to o variable here which forces us to use WeakReference only to avoid error
    ((TestClass)weak.Target).HasBeenDisposed.Should().Be.True();
}

该测试失败(更新后通过)但我观察到以下(UPDATED):

  1. GC.WaitForPendingFinalizers() 确实挂起线程并最终确定实例o,但前提是没有扎根。为其分配 NULL 并使用 Wea​​kReference 在最终确定后获取它。
  2. Finalize(析构函数)代码在正确的点执行o不持有实例。

那么测试这个的正确方法是什么。我想念什么?

我想这是变量o这会阻止 GC 收集它。
UPDATE: 是的,就是这个问题。不得不使用 Wea​​kReference 来代替。


“我想是变量 o 阻止了 GC 收集它。”正确的。堆栈上存在引用意味着该对象是可访问的,因此不符合收集(和终结)的条件。

由于对象只有在没有引用时才会被终结,因此测试终结行为可能会很棘手。 (您需要引用该对象才能对其进行断言!)一种方法是间接执行此操作:让对象在终结期间发送某种消息。但这纯粹出于测试目的而扭曲了最终代码。您还可以保留对该对象的弱引用,这将使其有资格进行终结,并让它在终结器中自行复活 - 但同样,您不希望让它在生产代码中自行复活。

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

测试终结器和 IDisposable 的相关文章

  • 防止字符串中出现西里尔文/希腊文/中文 - C# 4.0

    我们有一个支持希腊语 西里尔语 中文字符的系统 使用 ASP NET C 4 0 但第三方系统似乎无法正常工作 为了避免为此第三方系统输入数据时出现问题 我想将文本字段限制为仅接受英语或重音字符 但返回其他字符的验证错误 我怎样才能做到这一
  • 将对象列表添加到 ef 中的上下文

    是否可以在不使用 foreach addObject 的情况下将对象列表添加到实体框架中的 Context 感谢帮助 从 EntityFramework 6 开始 您可以使用DbSet AddRange 方法 IEnumerable htt
  • 如何对ArrayList(int)进行排序

    我怎样才能排序Arraylist按升序和降序排列 例子 ArrayList list new ArrayList list Add 2 list Add 8 list Add 0 list Add 1 如何按升序和降序对上面的列表进行排序
  • 在 .NET 并发线程之间传递数据的最佳方式是什么?

    我有两个线程 一个需要轮询一堆单独的静态资源以查找更新 另一种需要获取数据并将其存储在数据库中 线程1如何告诉线程2有东西要处理 如果数据块是独立的 则将数据块视为要由线程池处理的工作项 使用线程池和QueueUserWorkItem将数据
  • 是否可以从 C++ 应用程序调用 C# 应用程序?

    我是一名编程学生 现在我已经上了两门 C 课程 这个学期我将参加我的第一门 C 课程 出于好奇 是否可以从 C 应用程序调用 C 应用程序 如果是的话 是否还可以检查运行该程序的计算机是否具有 NET框架 我只是很好奇 我想如果可能的话 这
  • 如果未引发异常,则通过 Python 单元测试

    在Python中unittest框架 是否有一种方法可以在未引发异常的情况下通过单元测试 否则会因 AssertRaise 而失败 如果我正确理解你的问题 你could做这样的事情 def test does not raise on va
  • C# 中的 C/C++ 代码编译器

    在 C 中 我可以使用下面的代码编译 VB 和 C 代码 但无法编译 C C 代码 有什么办法可以做到这一点吗 C 编译器 public void Compile string ToCompile string Result null st
  • 使用 xslt 将 xml 转换为 xsl-fo 时动态创建超链接?

    我想使用 xsl 文件在 PDF 报告中创建标题 如果源文件包含超链接 则应将其呈现为超链接 否则呈现为纯文本 例如 我的 xml 如下所示 a href http google com target blank This is the h
  • 使用 C# 动态创建按钮并按预定义的顺序放置它们

    NET 4 5 C 创建 Windows 窗体 我想动态创建和添加按钮并为其分配单击事件 但希望它们以特定的方式动态放置 就像图像一样 我的问题是如何以上述方式动态放置按钮 即 4x4 格式 一行 4 个按钮 4 列 但行数不受限制 是否可
  • 获取低阶 N 位

    有什么方法可以获得任何整数的低阶n位 其中n可以是 1 到 32 之间的任意数字 无需预先计算 32 个位掩码 每个订单一个 并使用 操作员 我也不想使用 具有 2 的幂 只是按位运算 Edit 例如 假设用户输入一个整数Num和另一个整数
  • .NET 紧凑框架中的信号量

    不幸的是 使用 NET Compact Framework 时 System Threading 中没有信号量 我不确定为什么会这样 有人有想法吗 经过谷歌搜索后 我发现很多人给出了他们自己的实现 但他们中没有一个真正工作得很好 或者根本没
  • 模拟 Spock 中的超类

    如何对 Spock 中具有超类的类进行单元测试 该超类调用来自其超类的方法调用 或者如何模拟 Spock 中的超类 Ex class Bar def method1 parm1 Method actions class Foo extend
  • 文件是通过 Visual Studio 下载的,但不是通过 .exe 下载的

    当我尝试下载 a 时出现以下错误 pdf通过我的网址从文件 exe file 服务器违反了协议 部分 响应头 详细信息 CR 后必须跟 LF 但当我尝试从 Visual Studio 调试代码时 也会下载同样的内容 我完全迷失了 不知道发生
  • xmlns 元素的顺序重要吗

    我不知道如何在 google 中搜索此内容 但是 xmlns 元素的问题在 XML 文件中重要吗 我正在 ASP NET VB 中使用 XMLWriter 创建一个 XML 文件 并且尝试匹配我提供的示例
  • .net 4.5 可以与 .net 4.0 并行工作吗?

    我有兴趣安装 NET 4 5 但我听说这是就地升级 由于我公司的用户使用的是Windows XP 我无法发布任何使用 NET 4 5 的客户端应用程序 http visualstudio uservoice com forums 12157
  • Web UI 中的 .Result 出现死锁

    我正在阅读以下主题http blog stephencleary com 2012 07 dont block on async code html http blog stephencleary com 2012 07 dont bloc
  • .net 运行时 - Silverlight 运行时 =?

    我用 google 搜索了一下 但没能找到 net CLR 中的哪些类未包含在 CoreCLR 又名 Silverlight 中的详细列表 Windows net Framework 中缺少什么 Silverlight 另外 是否存在 Si
  • .NET 可移植类库中的 .ToShortDateString 发生了什么

    我想知道为什么没有 ToShortDateString在 NET 可移植类库中 我有 2 个项目 Silverlight 和常规 NET 类库 使用相同的代码 并且代码涉及调用 ToShortDateString on a DateTime
  • 我应该在单元测试中使用 AutoMapper 吗?

    我正在为 ASP NET MVC 控制器方法编写单元测试 这些控制器依赖于IMapper 我创建的用于抽象 AutoMapper 的接口 使用 Castle Windsor 通过构造函数注入传入 动作方法使用IMapper从领域对象映射到
  • 字节到二进制字符串 C# - 显示所有 8 位数字

    我想在文本框中显示一个字节 现在我正在使用 Convert ToString MyVeryOwnByte 2 但是 当字节开头有 0 时 这些 0 就会被删除 例子 MyVeryOwnByte 00001110 Texbox shows g

随机推荐

  • 在 WPF DataGrid 中显示“显示名称”而不是字段名称

    这是我的类定义 public class Customer Display Name Customer ID public int ID get set Display Name Customer Name public string Cu
  • django Rest框架的控制流程是什么

    我正在为 web 应用程序开发 api 我最初使用的是 tastypie 后来改用了django rest framework drf Drf 对我来说似乎很容易 我打算做的是创建嵌套的用户配置文件对象 我的模型如下 from django
  • QGridLayout 与 PlotWidget-pyqtgraph

    我有 3 个PlotWidget http www pyqtgraph org documentation widgets plotwidget html 来自pyqtgraph图书馆 obj1 obj2 and obj3 我尝试将其插入到
  • ember-simple-auth,验收测试和等待异步操作

    努力应对验收测试 从基本登录测试开始 import test from qunit import moduleForAcceptance from static tests helpers module for acceptance mod
  • 如何在 python selenium 中通过类名及其文本定位元素

    您好 我正在尝试通过元素的类名及其包含的文本来定位元素 div class fc day number 15 div 有一堆fc day number在具有不同值的页面上 我需要具有例如 15 的那个 I do driver find el
  • 将 numpy ndarray 写入图像

    我正在尝试在 Python 中读取二进制文件 8 位 RGB 元组 对其进行一些转换 然后将其写入为 png 图像 我正在执行以下操作 typeinfo np dtype gt i1 read single bytes data np fr
  • 在 PHP 中使用自动加载类时是否存在性能下降?

    目前 我通过在网站的每个页面上包含 all inc php 文件来加载所有类 然后该文件继续包含我将在整个网站上使用的所有配置 类 函数等 我的问题是 我经常使用仅与网站的某些页面 部分相关的类 因此我经常在页面开头包含一堆不会使用的类 显
  • 更改 imshow 来源

    我有一个包含 3 列的数据表 我想根据前两列在彩色二维图中绘制第三列 例如对于下表 即 4 0 4 0 0 313660827978 4 0 5 0 0 365348418405 4 0 6 0 0 423733120134 5 0 4 0
  • 如何在 Toad 中打开表名称自动完成功能?

    我使用的是 Toad 版本 11 0 0 116 当我开始输入表时 我没有获得默认的表名选项 如何开启自动完成功能 Pressing Ctrl should show you a list of available tables 例如输入
  • Jenkins 构建步骤在“npm install ”上失败

    Jenkins 新手 我正在 Jenkins 中设置我们的构建 设置构建步骤来运行 nodejs 脚本 使用 Sencha Touch 2 将构建的应用程序引入本机 iOS 应用程序的脚本 Nodejs 脚本需要扳手库 Jenkins 用户
  • OSX Lion 上 Java 应用程序的全屏功能

    如何在 Java 应用程序中 本地 实现 OSX Lion 的全屏功能 目前给出的答案包含了一种实现全屏功能的好方法 我读到 Eclipse 可能能够使用 Lion 的 本机 全屏功能 这就是我要问的 我在 Apple 的 Java 发行说
  • “npx react-native run-android”与“react-native run-android”有什么区别

    有什么区别npx 反应本机运行 android vs 反应本机运行 Android 目前有两个 CLI react native community cli 由react native直接使用的 这使得它成为您项目的传递依赖 react n
  • React-native 中 Stack.Screens 之间的 Stack.Navigator 淡入淡出过渡?

    如何在 React native 中为 Stacked Screes 添加过渡效果
  • 如何在使用基于类的视图注册后立即登录用户?

    我正在一个销售图像的网站上工作 我正在尝试找到一种方法 以便用户可以login注册后使用class基于视图 我已经使用基于函数的视图完成了它 但我想基于类进行它 因为它需要更少的代码 下面是与function基于的观点 My models
  • 为什么使用标志+位掩码而不是一系列布尔值?

    考虑到我有一个对象可能处于一个或多个真 假状态 我一直有点模糊为什么程序员经常使用标志 位掩码而不是只使用几个布尔值 一切都在 NET 框架上 不确定这是否是最好的示例 但 NET 框架具有以下内容 public enum AnchorSt
  • 使用 FCM 服务离线注销?

    通知消息有公共和私有两种类型 使用此应用程序的任何人都可以看到公共消息 私人消息只能由一个用户看到 这些私人消息可能包含一些机密信息 在iOS上实现这个场景时 设备的 FCM 令牌针对每个应用程序实例 即 在应用程序重新安装时 用户可能会获
  • 在传递函数指针时是否应该转发有关 noexcept-ness 的知识?

    我写了下面的代码来测试noexcept跨函数调用的传播 似乎它并不像我想象的那样工作 在 GCC 4 7 2 中 可以有效地测试函数是否被noexcept仅直接或作为模板专业化参数传递时 但not当作为参数传递给模板化函数时 或者作为函数指
  • ICollection - 获取单个值

    从 ICollection 获取值的最佳方式是什么 除此之外 我们知道该集合是空的 您可以使用 LINQ 来实现此目的 var foo myICollection OfType
  • -canOpenURL:URL 失败:“spotify:” - 错误:“(null)”

    不确定这是否属实 但从我读到的内容来看 人们说这个问题仅发生在 Xcode 模拟器上 因此您必须在实际设备上进行测试 问题是我当前的服务器是本地节点服务器http localhost 3000 并且我的iOS设备无法访问该服务器 1 有没有
  • 测试终结器和 IDisposable

    问题是如何测试调用 Finalize 时对象释放资源的事实 该类的代码 public class TestClass IDisposable public bool HasBeenDisposed get private set publi