将已经实例化的 属性 传递到 using 语句中是一种好习惯吗?

Is it good practice to pass an already instanciated property into a using statement?

我在重构一些严重依赖一次性模式的代码时遇到了这个问题。

我确实有一个只读字段 DbContext,它正在构造函数中初始化。现在我想知道我是否可以将字段传递到 using 块中以正确处理它。或者我是否必须摆脱字段和初始化以在每个 using 块中初始化它

protected readonly DbContext _context;

public Repository(DbContext context)
{
    _context = context;
}

public Task<T> GetAsync(Guid id)
{
    using (_context)
    {
        return _context.Set<T>().FindAsync(new CancellationToken(), id);
    }
}

我希望以正确的方式应用 Dispose 模式

我看到两个潜在的问题:

  1. 当您退出 using 块时,object 将被释放。如果您随后尝试重用它,您可能会在某处抛出 InvalidOperationException
  2. 有些 object 在处置时不会释放所有托管资源。他们可能仍在引用一些 large-ish object,当您引用一次性 object 时,这些不能被垃圾收集。例证:MemoryStream - 当您处理它时,MemoryStream 不会取消引用其内部 byte[] 缓冲区。这意味着除非您取消引用流本身,否则无法收集数组并且实际上是内存泄漏。

所以从我的角度来看,最好在 using 语句中创建一个新的 object,因为它会自动为您处理它, 取消引用它以便收集它。

一个可能的解决方案是注入工厂 object,并使用其工厂方法在 using 块的开头创建一次性 object。