c# - 哪个类 "owns"是非托管资源(并且实现了 IDisposable)?

标签 c# .net unmanaged idisposable mediainfo

我正在处理an OSS project打造流行MediaInfo library在 .NET 中更容易使用,但这个问题是可以概括的。

如果派生类D在调用其基类DB的构造函数时始终实例化对象O。 DB 将其值设置为发送到其构造函数的值,但该值本身在 DB 的基类 B 中声明:

  1. 谁“拥有”O(又名以下代码中的 mediaInfo)?
  2. 对于 .NET 应用程序,其中哪一个应实现 IDisposable? 注意:O 是非托管的,或者至少是包装在非托管库周围的托管对象的实例,但确实需要以“MediaInfo.Close();”。我不确定这算不算“不受管理”。

为了帮助澄清,让我使用实际代码:

D 源自 DB:

// MediaFile is "D" 
public sealed class MediaFile : GeneralStream
{
    public MediaFile(string filePath)
        : base(new MediaInfo(), 0) {
        // mediaInfo is "O"
        mediaInfo.Open(filePath);
    }
}

DB 设置其继承的 O,派生自 B:

// GeneralStream is "DB"
public abstract class GeneralStream : StreamBaseClass
{
    public GeneralStream(MediaInfo mediaInfo, int id) {
        this.mediaInfo = mediaInfo; // declared in StreamBaseClass
        // ...
    }
}

B声明O:

// StreamBaseClass is "B"
public abstract class StreamBaseClass
{
    protected MediaInfo mediaInfo; // "O" is declared
    // ...
}

最佳答案

持有资源引用的对象拥有该资源。

StreamBaseClass 具有引用 mediaInfo 并且应实现 IDisposable。引用和 Dispose 方法将自动由派生类继承。

关于c# - 哪个类 "owns"是非托管资源(并且实现了 IDisposable)?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9657637/

相关文章:

c# - 如何反序列化然后将数据放入表格?

c# - 如果在 Visual Studio 解决方案中使用类的属性,我如何在 C# 中检查?

c# - 在函数中验证自定义类的类型

.net - 是否可以在.NET中捕获访问冲突异常?

c# - 固定托管 List<> 以获取指向数据的指针

c# - 将大型数据集从 sql server 迁移到 sqlite 的最快方法

c# - 创建一个封装通用集合的类有什么缺点吗?

c# - 试图在 C# 中理解 Postgres 的二进制复制格式

c# - 拒绝访问 .tmp 路径

c# - 使用 DllImport 调用 C++ 函数