C # Использование использования блока со статическими объектами - PullRequest
0 голосов
/ 15 апреля 2009

Я добавляю некоторый код в блок using в программе на C #. Я как бы заполняю свое приложение, которое раньше было автономным, в существующее тело кода, поэтому мне нужно немного поэкспериментировать, чтобы оно подходило. В конечном итоге это выглядит следующим образом:

public class WrapperForMyOldApp
{

    public static ItemThatINeed item1;
    public static ItemThatINeed item2;

    public WrapperForMyOldApp () 
    {
        item1 = new ItemThatINeed();
        item2 = new ItemThatINeed();
    }

    public static go()
    {
        // some stuff that i need to do with items 1 and 2
    }
}

public class MainProgram 
{
    .
    .
    .

    public void MethodThatNeedsToMakeUseOfMyApp ()
    {
        ....
        using (WrapperForMyOldApp oldAPp = new WrapperForMyOldApp())
        {
            WrapperForMyOldApp.go();
        }
    }
}

Хорошо, поэтому вопрос здесь таков: нанёс ли я вред эффектам использования блока и / или создал ли какие-то особые побочные эффекты, которые могут отрицательно повлиять на класс MainProgram? Я полагаю, что объект Wrapper и его содержимое будут удалены, и выполнение будет продолжено, как и ожидалось, но есть ли что-то, что мне нужно знать о том, что я пропускаю?

спасибо!

Ответы [ 3 ]

6 голосов
/ 15 апреля 2009

Ваш класс-оболочка реализует IDisposable, а вы просто его не показываете? Если это не одноразово, тогда вам вообще не нужен оператор использования.

5 голосов
/ 15 апреля 2009

Чтобы это работало, вам нужно, чтобы WrapperForMyOldApp реализовал IDisposable.

Вызов Dispose () в WrapperForMyOldApp сделает вашу очистку.

Однако статические объекты обычно используются для объектов, срок службы которых превышает один объект. В общем случае для этого типа использования вы должны сделать экземпляры ItemThatINeed нестатичными, сгенерировать их в конструкторе WrapperForMyOldApp, а затем очистить их в WrapperForMyOldApp.Dispose ().

Со статическими объектами вы потенциально создаете кошмар - вы создаете объект, а затем говорите, что хотите выполнить очистку (в конце блока using), поэтому метод Dispose () будет очищать до статических объектов. Однако, если они привыкнут снова, что должно произойти? Каково правильное поведение, если вы создаете два экземпляра WrapperForMyOldApp в 2 потоках? Я хотел бы рассмотреть эти вопросы, если вы хотите детерминированной очистки.

1 голос
/ 15 апреля 2009

Что ж, если WrapperForMyOldApp реализует IDisposable, и ваша реализация Dispose() может быть уверена, что избавится от любых ресурсов, тогда она должна работать ... но могут быть и другие побочные эффекты. Код может изменить глобальное (статическое) состояние, такое как культура и т. Д. Он может порождать потоки. Все виды вещей.

Это не плохой подход, но вам нужно знать, что код, который вы инкапсулируете делает , чтобы знать, собирается ли Dispose() сделать что-нибудь полезное.

...