【发布时间】:2012-03-28 07:05:57
【问题描述】:
我正在研究 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
// ...
}
【问题讨论】:
-
不同的
Stream类型已经实现了IDisposable- 这意味着从其中一个继承的任何类都会继承这个实现。 -
@Oded,我认为问题中的流有所不同——它们不是从
System.IO.Stream继承的。 -
@svick - 我同意,但我想我会指出 BCL
Stream和相关类型确实实现了接口。
标签: c# .net unmanaged idisposable mediainfo