是否可以为类编写dispose方法?

时间:2012-03-22 15:23:40

标签: c# dispose

我有一个在类库中定义的类(称为Employee。非静态)。我在另一个项目中实例化该类并调用一些方法。

在该类中编写Dispose方法是否可以?我想编写自定义dispose方法的原因是因为我在Employee类中调用了一个web服务。

public class Employee
{

    SoapSample company = new SoapSample();

    public Employee()
    {
        company.UserCredentials.UserName = "";
        company.UserCredentials.Password = "";
    }

}

8 个答案:

答案 0 :(得分:5)

无论如何,Web服务客户端应该是无状态的,我期待。你想要处理哪些非托管资源?听起来你不需要它。

编辑:说实话,感觉像Employee类型的奇怪设计引用肥皂客户端。你确定这是一个合适的设计吗?

答案 1 :(得分:2)

您可以实现IDisposable界面

public class Employee : IDisposable
{

    SoapSample company = new SoapSample();

    public Employee()
    {
        company.UserCredentials.UserName = "";
        company.UserCredentials.Password = "";
    }

    public void Dispose()
    {
         //TODO:put your cleanup code here
    }

}

答案 2 :(得分:1)

不确定。但是你应该通过继承和实现IDispose接口来实现。

答案 3 :(得分:1)

只需实施IDisposable

答案 4 :(得分:1)

您的员工类应实现IDisposable界面。查看文档http://msdn.microsoft.com/en-us/library/system.idisposable.aspx

答案 5 :(得分:1)

是的......让该类实现IDisposable

public class Employee : IDisposable
{
        public void Dispose()
        {..}
}

但只有当该类使用非托管资源时才会有意义。

何时使用Dispose? :

  

使用此方法可以关闭或释放非托管资源,例如实现此接口的类实例所拥有的文件,流和句柄。按照惯例,此方法用于与释放对象持有的资源或准备对象以供重用相关的所有任务。

答案 6 :(得分:1)

Foo通常应该在两种情况下实现IDisposable:

  1. 至少有一些'Foo`的实例会知道某个时候应该发生的任务,但没有其他任何对象可能及时发生,并且他们会知道有问题的任务一旦发生就可以安全地执行不再需要了。
  2. 至少一些派生自`Foo`的类很容易满足上述标准,并且它们的最后一个有用的引用由代码保存,它们希望与它们一起使用类型为`Foo`,而不是更多派生类型。

Bitmap这样的东西适合第一类,因为它在创建时会要求Windows为其独家使用提供GDI句柄,这意味着:(1)当句柄不再存在时,需要告诉Windows需要; (2)如果Bitmap没有这样做,那么别的什么都没有; (3)一旦不再需要Bitmap,可以安全地删除GDI句柄。

Stream这样的东西适合第二类。在安全地放弃实例之前,基类不知道需要完成的任何特定事情,但是许多派生类将具有这样的要求。此外,在许多情况下,对象可以创建Stream以便将其交给某个其他对象,然后对其自身没有进一步的使用。创建Stream的对象不必关心第二个对象何时完成流,接收Stream的对象不必担心它是否是实际需要的类型清理与否。相反,最简单的模式是Stream的创建者将其交给一个方法,该方法明确要求收件人清理它,并让收件人调用Dispose而不必担心是否该方法实际上在给定的特定类型中执行任何操作。

答案 7 :(得分:0)

您是否需要在对象的生命周期内保留客户端对象?如果不是在您调用它的方法中处置客户端,如果是,则实现一次性模式。