Использование синтаксиса для запуска вызова всех объектов, которые реализуют метод Dispose - PullRequest
0 голосов
/ 06 мая 2011

Можно ли использовать с использованием синтаксиса для запуска всех объектов, реализующих интерфейс IDisposable, вызывать соответствующий метод Dispose ()?

Например, если объекты ObjectOne и ObjectTwo существуют винтересующий раздел , можем ли мы сделать так, чтобы метод Dispose () обоих объектов был вызван автоматически.Как показал пример, я знал, как сделать это для одного типа класса, но я не знаю, как сделать этот вид трюка для более чем одного типа класса.Поскольку следующий синтаксис недопустим в C #.

// Это недопустимый оператор C #

using( ObjectOne one = new ObjectOne();
       OjbectTwo two = new ObjectTwo() )
{
   ...  

  // hopefully, the Dispose methods of both **one** and **two** will be called.
}

Конкретный пример, чтобы проиллюстрировать, как вызвать автоматический вызов метода Dispose дляодин тип класса.

namespace ConsoleApplication1
{
    class ObjectOne : IDisposable
    {
        public string ObjectName { get; set; }

        public ObjectOne() : this("Empty") { }
        public ObjectOne(string objName) 
        {
            ObjectName = objName;
        }

        public void Dispose()
        {
            Console.WriteLine("ObjectOne.Dispose " + ObjectName);
        }
    }

    class ObjectTwo : IDisposable
    {
        public string ObjectTwoName { get; set; }

        public ObjectTwo() { }
        public ObjectTwo(string objName)
        {
            ObjectTwoName = objName;
        }

        public void Dispose()
        {
            Console.WriteLine("ObjectTwo.Dispose " + ObjectTwoName);
        }
    }

    class Program
    {
        static void Main(string[] args)
        {
            Console.WriteLine("before");

            // make sure that the Dispose method of object one1 and one2 is called
            using (ObjectOne one1 = new ObjectOne(),
                             one2 = new ObjectOne()
                   )
            {
                // section of interest
                Console.WriteLine("middle");
            }

            Console.WriteLine("after");
            Console.ReadLine();
        }
    }
}

Спасибо.

Ответы [ 4 ]

4 голосов
/ 06 мая 2011
using (ObjectOne one1 = new ObjectOne())                       
using (ObjectTwo one2 = new ObjectTwo())                      
{                 
   // !!!section of interest!!!                 
   Console.WriteLine("middle");             
}  

Это вызовет распоряжение обоими объектами после блока кода.

4 голосов
/ 06 мая 2011

Вы можете вкладывать, используя операторы:

using( ObjectOne one = new ObjectOne())
   using( OjbectTwo two = new ObjectTwo() )
   {
      ...  

     // hopefully, the Dispose methods of both **one** and **two** will be called.
   }

РЕДАКТИРОВАТЬ: единственный другой способ будет реализовать пользовательский список IDisposables:

public class DisposableList : List<IDisposable>, IDisposable
{
   //this is all you need if you will ONLY use it in a using statement or explicitly call Dispose;
   //there is a more developed pattern that performs disposal automatically on finalization.
   public void Dispose()
   {
      foreach(var disposable in this)
         disposable.Dispose();
   }
}

...

using(var disposables = new DisposableList{new ObjectOne(), new ObjectTwo()})
{
   //unfortunately, you must now cast the items back to their types 
   //in order to use them as anything but IDisposables.
   var objectOne = (ObjectOne)disposables[0];
   var objectTwo = (ObjectTwo)disposables[1];

   ...
}
1 голос
/ 06 мая 2011

Взгляните на вопрос, который я задал некоторое время назад

Могу ли я иметь другой тип объектов в C # *, используя * block?

using (Font font3 = new Font("Arial", 10.0f), 
           font4 = new Font("Arial", 10.0f))
{
    // Use font3 and font4.
}

Выше показано, как вы обрабатываете несколько объектов типа одинакового .Как и в ответе на предыдущий вопрос, вы также можете обрабатывать несколько объектов различных типов.

0 голосов
/ 06 мая 2011

Согласно это :

Несколько объектов могут быть использованы с используя заявление, но они должны быть объявлено внутри оператора using, как в следующем примере:

using (Font font3 = new Font("Arial", 10.0f),
            font4 = new Font("Arial", 10.0f))
{
    // Use font3 and font4.
}

Это то, что вы ищете? <ч /> Редактировать: После тестирования вашего кода, я вижу проблему. Вы не можете сделать это с несколькими типами. Так что насчёт примерно такого:

using (ObjectOne one1 = new ObjectOne())
using (ObjectTwo one2 = new ObjectTwo()) {
    // !!!section of interest!!!
    Console.WriteLine("middle");
}

Это, по сути, вкладывает одно использование в другое.

Примечание: в моей консоли это выводит:

before
middle
ObjectTwo.Dispose 
ObjectOne.Dispose Empty
after
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...