Обеспечить вызов метода при выходе из класса - PullRequest
0 голосов
/ 31 октября 2011

У меня есть базовый класс, который, когда любой унаследованный класс, добавит GUID в список в другом одноэлементном классе. Я хочу иметь метод в базовом классе, который будет удалять GUID из списка, когда унаследованный класс завершит свое выполнение. Я пытался поместить вызов метода в метод Dispose, но не был уверен, что это правильный путь, так как я хочу, чтобы вызов метода удалял GUID как можно скорее, поэтому я не хотел ждать .NET GC, чтобы начать свою работу. Кроме того, поскольку я никогда ранее не реализовывал Dispose, могу ли я просто добавить интерфейс IDisposable в свой базовый класс и создать метод Dispose, который включает логику удаления GUID, или вам нужно явно включить другую логику в метод Dispose?

Ответы [ 2 ]

0 голосов
/ 31 октября 2011

Нет никакого волшебства в написании метода Dispose. Это ничем не отличается от любого другого метода. Если вы не позвоните, система не сделает это за вас.

КРОМЕ:

Если вы действительно хотите убедиться, что эти драгоценные ресурсы очищены должным образом, вам также необходимо создать некоторые меры безопасности для ситуаций, когда GC попадает к вашему объекту, даже если метод Dispose не вызывался обычным способом.

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

0 голосов
/ 31 октября 2011

На самом деле вы смешиваете вещи.

Сборщик мусора никогда не вызовет Dispose в вашем классе.Вы должны реализовать IDisposable, чтобы клиент мог гарантировать, что метод очистки всегда вызывается:

using System;

class BaseClass : IDisposable {
    bool _guidremoved = false;
    public void RemoveGuid() {
        if (!_guidremoved) {
            _guidremoved = true;
            // your logic here                
        }
    }
    public void Dispose() {
        RemoveGuid();
    }
}

class Derived : BaseClass { 
}

static class Program {
    static void Main(string[] args) {
        using (Derived d = new Derived()) { 
            // do stuff here...

            // call RemoveGuid explicitly, if needed
            d.RemoveGuid();
        } // when we exit this block, Dispose is called
    }
}

В этом примере блок using гарантирует, что метод RemoveGuid вызывается Dispose() если строка с d.RemoveGuid() не достигнута.

Сборщик мусора вместо этого вызовет деструктор (или, лучше, метод Finalize) вашего класса, когда он будет работать, но это, вероятно, небыть подходящим местом для удаления GUID в вашем случае.

Проверьте Реализация Завершить и утилизировать для очистки неуправляемых ресурсов для получения более подробной информации.

...