C# 如果其他构造函数创建了通过构造函数传递的对象,我应该处理它吗?
给定以下代码,我是否应该仅在C# 如果其他构造函数创建了通过构造函数传递的对象,我应该处理它吗?,c#,class,constructor,dispose,C#,Class,Constructor,Dispose,给定以下代码,我是否应该仅在Bar类中创建foo时处理它?或者我应该总是处理foo,即使它被传递给构造函数?我想我可能应该添加另一个私有变量来跟踪Bar是否创建了foo,或者它是否被传递给Bar(foo foo)构造函数,并且只在public Bar(字符串名)构造函数创建时处理foo public class Bar: IDisposable { private Foo foo = null; public Bar( string name ) { t
Bar
类中创建foo
时处理它?或者我应该总是处理foo
,即使它被传递给构造函数?我想我可能应该添加另一个私有变量来跟踪Bar
是否创建了foo
,或者它是否被传递给Bar(foo foo)
构造函数,并且只在public Bar(字符串名)
构造函数创建时处理foo
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
的一个实例,但不处理它,那么您将保留它所消耗的不必要的内存
因此,您最好的选择是跟踪您是否自己创建了该实例,如果是,则将其处置。(您还可以允许调用者指定行为,如注释中所述。)
(或者,您不能做任何事情,这将更加低效,但至少不会破坏任何东西。唯一可能主动破坏某些东西的解决方案是,如果您处理从其他地方传入的实例。)我知道,标题很糟糕。我只能说。如果可以改进,请进行更改。该对象没有终结器,因此无需抑制[non existant]终结器框架面临此问题,并提供了可选的布尔参数来控制所有权是被接管还是对象保持活动状态。事实上,您的情况与此完全类似,
Bar
是StreamWriter
,Foo
是Stream
,如果给定文件名,Bar
也可以自动创建流。这取决于上下文、这些对象的实际含义、它们的使用方式,调用方是否可能在将其提供给此对象后继续使用它,或者甚至在任何其他上下文中使用它,等等。在该实例中@BenVoigt,尚未确定。然而,在大多数其他情况下,IDisposable
对象被提供给一个对象,它会执行一个或另一个操作,而不是同时执行两个操作。这是一个不寻常的背景,因为两者都有足够的意义,以至于它需要提供这种选择。这当然不是标准。通常,当你把一个一次性物品提供给另一个这样的物品时,你会把这个一次性物品的所有权传给别人。事实并非总是如此,但事实往往如此,而且,只要文档中明确说明了这一点,那么处理对象将是合适的。这通常是在使用对象消耗它的情况下完成的,即使没有处理,也会导致它无法使用。相反,如果调用方保持所有权是有意义的,那就意味着他们只需负责处理它,而不是不处理它。