C# Использование использования блоков со статическими объектами

StackOverflow https://stackoverflow.com/questions/753088

  •  09-09-2019
  •  | 
  •  

Вопрос

Я добавляю код в 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 и его содержимое будут удалены, и выполнение продолжится, как и ожидалось, но есть ли что-то, о чем мне нужно знать, что я упускаю из виду?

Спасибо!

Это было полезно?

Решение

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

Вызов Dispose() в WrapperForMyOldApp выполнит очистку.

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

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

Другие советы

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

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

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top