Можно ли написать метод dispose для класса? - PullRequest
2 голосов
/ 22 марта 2012

У меня есть класс (называемый Employee. Non static), определенный в библиотеке классов.Я создаю экземпляр этого класса в другом проекте и вызываю некоторые методы.

Можно ли написать метод Dispose в этом классе?Причина, по которой я хотел написать собственный метод dispose, потому что я вызываю веб-сервис внутри класса Employee.

public class Employee
{

    SoapSample company = new SoapSample();

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

}

Ответы [ 8 ]

5 голосов
/ 22 марта 2012

Клиент веб-службы в любом случае должен быть без сохранения состояния. Какие неуправляемые ресурсы вы бы хотели использовать? Похоже, вам это не нужно.

РЕДАКТИРОВАТЬ: Чувствуется, что для типа Employee это странный дизайн, чтобы иметь ссылку на мыльный клиент, если честно. Вы уверены, что это подходящий дизайн?

2 голосов
/ 23 марта 2012

Класс Foo обычно должен реализовывать IDisposable в двух случаях:

  1. По крайней мере, некоторые экземпляры `Foo` будут знать о какой-то задаче, которая должна когда-нибудь произойти, но которая не вероятна для других объектовделать это своевременно, и они будут знать, что рассматриваемая задача может быть безопасно выполнена, если они сами больше не нужны.
  2. По крайней мере, некоторые классы, производные от `Foo`, удовлетворяют указанным выше критериям и имеют свои последние полезные ссылки, содержащиеся в коде, который ожидает работать с ними как тип` Foo`, а не как более производный тип.

Что-то вроде Bitmap соответствует первой категории, так как при создании он запрашивает у Windows дескриптор GDI для эксклюзивного использования, что означает: (1) Что-то должно сказать Windows, когда этот дескриптор небольше нужно;(2) Если растровое изображение этого не делает, больше ничего не будет;(3) Как только Bitmap больше не нужен, дескриптор GDI может быть безопасно удален.

Что-то вроде Stream соответствует второй категории.Базовый класс не знает ни о каких конкретных вещах, которые нужно будет сделать, прежде чем экземпляр можно будет безопасно покинуть, но многие производные классы будут иметь такие требования.Кроме того, во многих случаях объект может создать Stream с целью передачи его другому объекту, а затем больше не использовать для себя.Объект, создающий Stream, не должен заботиться о том, когда второй объект завершает работу с потоком, а объект, получающий Stream, не должен беспокоиться о том, действительно ли это тип, требующий очистки или нет.Вместо этого самый простой шаблон - для создателя Stream передать его в методе, который дает понять, что получатель должен очистить его, и чтобы получатель вызвал Dispose, не беспокоясь о том, действительно ли метод делает это.что-нибудь в конкретном типе это было дано.

2 голосов
/ 22 марта 2012

Вы можете просто реализовать интерфейс 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
    }

}
1 голос
/ 22 марта 2012

Да ... сделать этот класс реализации IDisposable

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

Но это будет иметь значение, только если этот класс использует неуправляемые ресурсы.

Когда использовать Dispose? :

Используйте этот метод для закрытия или освобождения неуправляемых ресурсов, таких как файлы, потоки и дескрипторы, которые содержатся в экземпляре класса, реализующего этот интерфейс. По соглашению этот метод используется для всех задач, связанных с освобождением ресурсов, удерживаемых объектом, или подготовкой объекта к повторному использованию.

1 голос
/ 22 марта 2012

Ваш класс сотрудников должен реализовывать интерфейс IDisposable.Ознакомьтесь с документацией http://msdn.microsoft.com/en-us/library/system.idisposable.aspx

1 голос
/ 22 марта 2012

Да.

Просто внедрите IDisposable.

1 голос
/ 22 марта 2012

Конечно.Но вы должны сделать это путем наследования и реализации интерфейса IDispose.

0 голосов
/ 22 марта 2012

Вам нужно сохранить объект client на весь срок службы объекта?Если не просто избавиться от клиента внутри метода, который вы вызываете, и если да, внедрите одноразовый шаблон.

...