gpt4 book ai didi

c# - 处置流时如何处置任意依赖项?

转载 作者:行者123 更新时间:2023-11-30 12:30:03 26 4
gpt4 key购买 nike

我正在创建一个 .NET API,我的方法之一返回一个 Stream。我需要确保在调用者处置我返回的 Stream 时处置其他一些类。

我能想到的唯一方法是创建一个包装器类,它继承自 Stream 并添加我需要的功能,将其他所有内容委托(delegate)给底层 Stream.

我不喜欢仅仅因为它可能会在未来的 .NET 版本中获得新成员而必须装饰框架类,我需要更新我的 API 以支持这些新成员。

有更好的方法吗?

例子

这里有一个具体的例子供大家思考。

请记住,此类的要求之一是它不能要求处置,请引用示例中的 ContentSource 类。

public class ContentSource
{
public Stream OpenRead()
{
var entry = GetEntry();

// TODO: Ensure that when the stream we return is disposed, we also dispose of `entry.Archive`.
return entry.Open();
}

private ZipArchiveEntry GetEntry()
{
ZipArchive archive = null;
try
{
archive = new ZipArchive(_zipContent.OpenRead(), ZipArchiveMode.Read, false);
var entry = archive.GetEntry(_entryName);
if (entry == null)
{
throw new InvalidOperationException("Specified entry was not found in the ZIP archive. " + _entryName);
}

return entry;
}
finally
{
if (archive != null)
{
archive.Dispose();
}
}
}
}

流包装示例

这是我能想到但我不满意的解决方案。

public sealed class DependencyDisposingStreamWrapper : Stream
{

private readonly Stream _stream;
private readonly IDisposable _dependency;
private bool _disposed;

public DependencyDisposingStreamWrapper(Stream stream, IDisposable dependency)
{
_stream = stream;
_dependency = dependency;
}

# region - Overrides of all Stream members, delegating to underlying stream -

// ...

#endregion

protected override void Dispose(bool disposing)
{
if (!_disposed)
{
if (disposing)
{
_dependency.Dispose();
}

base.Dispose(disposing);

_disposed = true;
}
}

}

最佳答案

组合而不是继承?

这就是 .Net 对 StreamReader 之类的项目的处理方式。基本流有一个成员属性,而不是从流继承。

如果想使用现有的类型,如 StreamReader/Writer、TCPClient 等,您将不得不继承 Stream。

关于c# - 处置流时如何处置任意依赖项?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17306142/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com