我正在处理an OSS project打造流行MediaInfo library在 .NET 中更容易使用,但这个问题是可以概括的。
如果派生类D在调用其基类DB的构造函数时始终实例化对象O。 DB 将其值设置为发送到其构造函数的值,但该值本身在 DB 的基类 B 中声明:
- 谁“拥有”O(又名以下代码中的 mediaInfo)?
- 对于 .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/