我正在开发一个 OSS 项目,以使流行的MediaInfo 库更易于在 .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
// ...
}