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

m0d*_*ixx 2 c# using properties readonly

我在重构某些代码时遇到了这个问题,这在很大程度上取决于Disposable模式。

我确实有一个只读字段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);
    }
}
Run Code Online (Sandbox Code Playgroud)

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

Dan*_*rha 5

我看到两个潜在的问题:

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

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

可能的解决方案是改为注入Factory对象,并使用其factory方法在using块的开始处创建一次性对象。

  • 而且,如果您必须在类实例的生命周期内保留引用,则您的类应实现IDisposable。 (3认同)