将已经实例化的 属性 传递到 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 模式
我看到两个潜在的问题:
- 当您退出
using
块时,object 将被释放。如果您随后尝试重用它,您可能会在某处抛出 InvalidOperationException
。
- 有些 object 在处置时不会释放所有托管资源。他们可能仍在引用一些 large-ish object,当您引用一次性 object 时,这些不能被垃圾收集。例证:
MemoryStream
- 当您处理它时,MemoryStream
不会取消引用其内部 byte[]
缓冲区。这意味着除非您取消引用流本身,否则无法收集数组并且实际上是内存泄漏。
所以从我的角度来看,最好在 using
语句中创建一个新的 object,因为它会自动为您处理它, 和 取消引用它以便收集它。
一个可能的解决方案是注入工厂 object,并使用其工厂方法在 using
块的开头创建一次性 object。
我在重构一些严重依赖一次性模式的代码时遇到了这个问题。
我确实有一个只读字段 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 模式
我看到两个潜在的问题:
- 当您退出
using
块时,object 将被释放。如果您随后尝试重用它,您可能会在某处抛出InvalidOperationException
。 - 有些 object 在处置时不会释放所有托管资源。他们可能仍在引用一些 large-ish object,当您引用一次性 object 时,这些不能被垃圾收集。例证:
MemoryStream
- 当您处理它时,MemoryStream
不会取消引用其内部byte[]
缓冲区。这意味着除非您取消引用流本身,否则无法收集数组并且实际上是内存泄漏。
所以从我的角度来看,最好在 using
语句中创建一个新的 object,因为它会自动为您处理它, 和 取消引用它以便收集它。
一个可能的解决方案是注入工厂 object,并使用其工厂方法在 using
块的开头创建一次性 object。