如果其他构造函数创建它,我应该处置通过构造函数传递的对象吗?
Should I Dispose Object Passed Through Constructor If Other Constructors Create It?
给定以下代码,我是否应该仅在 Bar
class 中创建时才处理 foo
?或者即使 foo
被传递给构造函数,我也应该始终处理它吗?我在想我应该添加另一个私有变量来跟踪 Bar
是否创建了 foo
或者它是否被传递给了 Bar( Foo foo )
构造函数,并且只处理 foo
当它由 public Bar( string name )
构造函数创建时。
public class Bar: IDisposable
{
private Foo foo = null;
public Bar( string name )
{
this.foo = new Foo(name);
}
public Bar( Foo foo )
{
this.foo = foo;
}
public void Dispose()
{
Dispose(true);
GC.SuppressFinalize(this);
}
protected virtual void Dispose( bool disposing )
{
if( disposed )
return;
if( disposing )
foo.Dispose();
this.disposed = true;
}
}
你的想法是对的。
如果您从其他地方传递了一个 Foo
的实例,并自行处理它,您可能会破坏仍在使用 Foo
的代码。如果您创建了 Foo
的实例但不处理它,您将挂在它消耗不必要的内存上。
因此,您最好的选择是跟踪您是否自己创建了实例,如果是,则将其处置。 (您也可以允许调用者指定行为,如评论中所述。)
(或者,你 可以 什么都不做,这样效率会更低,但至少不会破坏任何东西。唯一可能主动破坏某些东西的解决方案是,如果你处理从其他地方传入的实例。)
给定以下代码,我是否应该仅在 Bar
class 中创建时才处理 foo
?或者即使 foo
被传递给构造函数,我也应该始终处理它吗?我在想我应该添加另一个私有变量来跟踪 Bar
是否创建了 foo
或者它是否被传递给了 Bar( Foo foo )
构造函数,并且只处理 foo
当它由 public Bar( string name )
构造函数创建时。
public class Bar: IDisposable
{
private Foo foo = null;
public Bar( string name )
{
this.foo = new Foo(name);
}
public Bar( Foo foo )
{
this.foo = foo;
}
public void Dispose()
{
Dispose(true);
GC.SuppressFinalize(this);
}
protected virtual void Dispose( bool disposing )
{
if( disposed )
return;
if( disposing )
foo.Dispose();
this.disposed = true;
}
}
你的想法是对的。
如果您从其他地方传递了一个 Foo
的实例,并自行处理它,您可能会破坏仍在使用 Foo
的代码。如果您创建了 Foo
的实例但不处理它,您将挂在它消耗不必要的内存上。
因此,您最好的选择是跟踪您是否自己创建了实例,如果是,则将其处置。 (您也可以允许调用者指定行为,如评论中所述。)
(或者,你 可以 什么都不做,这样效率会更低,但至少不会破坏任何东西。唯一可能主动破坏某些东西的解决方案是,如果你处理从其他地方传入的实例。)