Каково лучшее приложение .dispose () [закрытый]

Я не верю, что есть Assert, который будет сравнивать две директории, но вы можете использовать PHP Scandir, который даст вам массив содержимого директории и сравнить их.

$files1 = scandir($directory1);
$files2 = scandir($directory2);

$this->assertEquals($files1, $files2);
5
задан casperOne 5 April 2012 в 13:17
поделиться

6 ответов

Я настоятельно рекомендую чтение, Очищающее Неуправляемые ресурсы на MSDN, оно имеет статьи, затрагивающие то, когда использовать, Располагают и как реализовать IDisposable правильно. Ваш инстинкт пищеварительного тракта главным образом корректен, поскольку редко необходимо реализовывать IDisposable, если класс не использует неуправляемые ресурсы или является контейнером для объекта, который реализует IDisposable.

Относительно осуществления вызова Располагают, когда Вы правильно реализуете интерфейс IDisposable, Вы присоединяете финализатор, который вызовы Располагают для ловли тех отставших и ненормативных классов, которые забыли.

Соответствующие статьи:

Реализация расположить метода

Описывает реализацию Расположить метода для того, чтобы высвободить неуправляемые средства.

Использование возражает, которые инкапсулируют ресурсы

Описывает способы гарантировать, что Расположить метод называют, такие как оператор использования C# (Используя в Visual Basic).

(редактирование: добавленная дополнительная информация)

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

Public Class someClass()
  sub someMethod
    Using someResource As New ResourceType( arguments )
       ' no worries about IDisposable for someResource, as it is automatic
    End Using
  end sub
End Class
5
ответ дан 13 December 2019 в 05:44
поделиться

Это - довольно длинный ответ для покрытия всего полностью, так надо надеяться, никто не будет возражать, если я свяжусь с сообщением в блоге, которое должно, надо надеяться, ответить на все.

6
ответ дан 13 December 2019 в 05:44
поделиться

Существует большая дезинформация там о IDisposable. Это - ШАБЛОН, который помогает выполнить то, что раньше традиционно выполнялось через деструктор в C++. Проблема состоит в том, что в.NET, разрушение объекта не детерминировано (этого не происходит автоматически, когда объект выходит из объема, а скорее происходит во время Сборки "мусора", которая находится на отдельном низкоприоритетном потоке).

Вы не должны реализовывать, Располагают, если у Вас нет ресурса, который должен быть выпущен некоторым способом. Например, если какая-либо Ваша частная реализация элементов данных Располагает, необходимо, вероятно, реализовать, Располагают также, и вызов Располагают на тех членах парламента, не занимающих официального поста в Вашем Располагать. Аналогично, необходимо выпустить любые дескрипторы PInvoke в, Располагают.

Кроме того, Расположить метод НЕ называют автоматически для Вас после сборки "мусора". Это - самая большая часть дезинформации. Необходимо звонить, Располагают от Деструктора (C#) или Завершают (VB.NET). Вот хороший шаблон для реализации, Расположите:

public class Foo : IDisposable
{
   public Foo()
   {
      // Allocate some resource here
   }

   ~Foo()
   {
      Dispose( false );
   }

   public void Dispose()
   {
      Dispose( true );
   }

   private void Dispose( bool disposing )
   {
      // De-allocate resource here
      if ( disposing )
         GC.SuppressFinalize( this );
   }
}

Причина, что Вы называете GC.SupressFinalize, состоит в том, что, если Ваш объект имеет финализатор, Ваш объект будет на самом деле способствоваться следующему поколению GC, потому что это должно звонить, Завершают в первый раз, когда GC обтекает и не может выпустить Ваш объект, пока завершение не закончено, и поэтому память на самом деле не освобождена до 2-го, пробежавшего GC. Если Вы звоните, Располагают вручную, то можно пропустить финализатор, позволив объекту быть выпущенными во время первичной обработки GC.

Для извлечения максимальную пользу из Располагают, используют использование keword:

using ( Foo f = new Foo() )
{
   // Do something with Foo
}

Это - точно то же, как будто Вы записали это:

Foo f;
try
{
   f = new Foo();
   // Do something with Foo
}
finally
{
   f.Dispose();
}

Некоторым людям нравится устанавливать булевскую переменную в их классе, названном _disposed и затем проверять, что bool во время каждого вызова метода, и выдают исключение, при попытке назвать метод на объекте после того, как Располагают, назван. Для внутренних классов проекта я обычно рассматриваю это излишество, но мог бы быть хорошей вещью сделать, если Вы создаете библиотеку для потребления третьими сторонами.

1
ответ дан 13 December 2019 в 05:44
поделиться

Dispose() метод используется для чистки любых ресурсов рано. Хотя сборщик "мусора" исправляет любую неиспользованную память для Вас, Вам решать для заключения сделки с вещами как сеть/соединения с базой данных и дескрипторы файлов. Обычно, Вы хотели бы эти вещи, освобожденные, как только они больше не необходимы, таким образом, Вы реализуете доступный шаблон и используете в своих интересах Using statment для вызова его в блоке попытки/наконец негласно.

0
ответ дан 13 December 2019 в 05:44
поделиться

В целом Вы должны Вы реализовывать IDisposable каждый раз, когда Ваш класс намеревается ОТКРЫТЬ что-то. Является ли это дескриптором в файл, соединением с базой данных или некоторым ресурсом, который поднимет значительный блок памяти или который оставит Ваше приложение в нестабильном состоянии, это всегда - хорошая реализация идеи IDisposable для определения кода, который ЗАКРОЕТ те ресурсы.

Вы действительно не можете осуществить других разработчиков для вызова Вашего располагать методы, но реализующий IDisposable автоматически означает, что мы можем использовать оператор Using; который, после того как Вы вырабатываете привычку, трудно повредить :)

0
ответ дан 13 December 2019 в 05:44
поделиться

Необходимо реализовать IDisposable в классе если класс также:

  • владейте некоторыми другими объектами, которые реализуют IDisposable
  • выделяет некоторые ресурсы через неуправляемый интерфейс как P/Invoke.
0
ответ дан 13 December 2019 в 05:44
поделиться
Другие вопросы по тегам:

Похожие вопросы: