0) { "> 0) { "> 0) { " />

Должен ли я уничтожить объект, как только я закончу?

В C# мне нужно всегда уничтожить объект, когда я закончил с ним? Если нет, то на каких условиях мне нужно уничтожить объект и вызвать деструктор? Что произойдет, если я не уничтожу объект? Каковы плюсы и минусы?

Простой пример:

Help h = new Help();

h.program_name = "myprogram.exe";
h.release_date = "01/10/2013";
h.version_number = "1.2.0.0"; 

if (args.Length > 0)
{
    if ((args[0] == "-help") || (args[0] == "-version")||(args[0] == "/?"))
    {
        h.writeline();
    }
}
3
Что это за пример?
добавлено автор Rotem, источник

5 ответы

Если объект не реализует интерфейс IDisposable , нет необходимости для вас что-то делать с ним, когда вы закончите использовать его.

Пусть сборщик мусора выполнит свою работу, и все будет хорошо и правильно в мире.

11
добавлено

Только объекты, имеющие дело с неуправляемыми ресурсами, должны быть явно удалены. Эти типы должны реализовывать интерфейс IDisposable. Хорошим способом борьбы с этими объектами является использование с помощью :

using (SqlConnection conn = new SqlConnection(...))
{
   //...do stuff with conn
} //conn.Dispose() will automatically be called here
5
добавлено
Как узнать, есть ли у меня объекты, которые работают с неуправляемой памятью?
добавлено автор John Ryann, источник
@John Ryann - одна хорошая подсказка, когда вы используете pinvokes и часто получаете дескриптор в качестве значений IntPtr. Когда вы имеете дело с такими вещами, вы должны явно освободить их.
добавлено автор Adi, источник
А для API MS вы увидите это объявление в синтаксисе класса. Взгляните на [ msdn.microsoft.com/en-us/library/& hellip; , и вы увидите открытый класс SPSite: IDisposable .
добавлено автор Reacher Gilt, источник
@JohnRyann Самая большая подсказка - когда они реализуют IDisposable.
добавлено автор asawyer, источник

В общем случае C# использует сборщик мусора, поэтому нет необходимости «разрушать» объекты вручную.

В некоторых случаях вам может потребоваться немедленное освобождение ресурсов, связанных с некоторыми объектами, такими как соединения сети/базы данных, открытые файлы и т. Д. Использование «использования» часто является лучшим способом сделать это.

2
добавлено

В C# вам не нужно отключать всегда , но только при необходимости. Обычно при разработке класса вы объявляете и реализуете IDisposable интерфейс, который при необходимости выполняет фактическую очистку. Вы нуждаетесь , чтобы позаботиться о возможных неуправляемых ресурсах, которые могли бы распределить ваши экземпляры класса, и перегруженных Dispose() метод - лучшее место, где вы должны позаботиться о них и освободить их.

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

0
добавлено

Как уже упоминалось, в C# есть GC для очистки объекта.

В C# нет деструктора, но есть finalizer , который вызывается при сборке объекта. Но в большинстве случаев нет необходимости реализовывать финализатор.

Some information about Finalize method: http://msdn.microsoft.com/en-us/library/system.object.finalize.aspx

Если нам требуется конкретное поведение при утилизации объектов (например, очистка неуправляемых ресурсов), вы должны реализовать метод Finalize.

This is the way how you can do it: http://msdn.microsoft.com/en-us/library/vstudio/b1yfkh5e(v=vs.100).aspx

Остерегайтесь внедрения Finalize, он вызывает двойную работу для GC для очистки этого объект.

0
добавлено
Извините, я допустил ошибку в терминологии.
добавлено автор Alexander Balte, источник
Там есть деструкторы в C #: msdn.microsoft.com/en-us/library/66x5fx1b%28v=vs.80%29.aspx
добавлено автор Sebastian Negraszus, источник
Microsoft Stack Jobs
Microsoft Stack Jobs
1 788 участник(ов)

Work & freelance only Microsoft Stack. Feed https://t.me/Microsoftstackjobsfeed Чат про F#: @Fsharp_chat Чат про C#: @CSharpChat Чат про Xamarin: @xamarin_russia Чат общения:@dotnettalks

Microsoft Developer Community Chat
Microsoft Developer Community Chat
584 участник(ов)

Чат для разработчиков и системных администраторов Microsoft Developer Community. __________ Новостной канал: @msdevru __________ Баним за: оскорбления, мат, рекламу, флуд, флейм, спам, NSFW контент, а также большое количество оффтоп тем. @banofbot