2015-04-13 4 views
1

В последнее время я читал о интерфейсе IDisposable (этот вопрос был весьма полезен Proper use of the IDisposable interface), а также об использовании использования оператора (topic Uses of "using" in C#). Затем я начал задаваться вопросом, что, если я должен каким-то образом освободить свой собственный класс коллекции из памяти.Класс коллекции и IDisposable интерфейс

class User{ 
    private string username {set;get;} 
    private string password {set;get;} 
    ... 
} 

Следует ли реализовать интерфейс IDisposable?

class User : IDisposable 
{ 
    ... 
    public void Dispose() 
    { 
     this.Dispose(); 
    } 
} 

поэтому он может быть освобожден из памяти? Или GC делает это автоматически, и я не должен даже беспокоиться об этом.

Насколько я понимаю, важно освобождать неуправляемые ресурсы, такие как соединения с БД и т. Д., Но что касается этих классов коллекций. Поскольку я использую их довольно часто, я действительно начал меня пугать.

tl; dr; Должен ли я реализовать IDisposable в классе User?

С уважением.


редактирования: спасибо всем за ответы!

+2

Вам нужно реализовать 'IDisposable', только если ваш класс выделяет неуправляемые ресурсы и/или имеет члены класса' IDisposable'. Итак, в вашем случае ответ «Нет», вам не нужно делать этот класс одноразовым. –

ответ

6

Или делает GC автоматически, и я не должен даже беспокоиться об этом.

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

Ваше текущее осуществление будет только назвать себя:

public void Dispose() 
{ 
    this.Dispose(); 
} 

... так что если вы действительно не хотите назвать this.Dispose(), какие бы вы хотите делать, когда Dispose() называется? Это не похоже на то, что удаление вызывает сбор мусора - так какое действие вы хотите предпринять? Если ответ «ничего», вы, вероятно, не должны внедрять IDisposable. (Исключением здесь является то, что он предназначен для базового класса, и вы ожидаете производных классов, требующих удаления ... это более сложный сценарий.)

0

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

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

+0

Важно отметить, что GC ** никогда ** не вызывает '.Dispose()'. Вы должны сделать это сами. – Enigmativity

0

Как сказано в других ответах, только раз вы быть_наст реализовать IDisposable, когда вы имеете дело с неуправляемыми ресурсами или членами класса, которые IDisposable сам (в этом случае вы должны расположить их в своем собственном Dispose методе).

Другой сценарий, который вы можете увидеть, - это когда люди хотят использовать синтаксический сахар using { } для автоматического вызова некоторого метода в конце области переменной без использования формы try { } finally { }.

Ie:

public class MyObject : IDisposable 
{ 
    public void Foo() 
    { 
    } 

    public void Dispose() 
    { 
     // Something they want to call after the use of an instance of MyObject 
    } 
} 
... 
using (var myObj = new MyObject()) 
{ 
    myObj.Foo(); 
} 

вместо

public class MyObject 
{ 
    public void Foo() 
    { 
    } 

    public void MethodToCallAfterUse() 
    { 
     // Something they want to call after the use of an instance of MyObject 
    } 
} 

var myObj = new MyObject(); 
try 
{ 
    myObj.Foo(); 
} 
finally 
{ 
    myObj.MethodToCallAfterUse(); 
} 
0

Если объект запрашивает внешний объект, чтобы "сделать что-то" (выполнение действий, не резервирует ресурс и т.д.) от его имени до последующее уведомление и что внешний объект может продолжать существовать после того, как объект, запрашивающий его услуги, перестанет быть полезным, тогда объект должен гарантировать, что внешний субъект получит уведомление, когда его услуги больше не требуются. Ресурс IDisposable существует как стандартное средство, с помощью которого объект может сказать: «Я могу быть обязан уведомлять внешние сущности, когда мне не нужны их службы, сообщите мне, когда мои услуги больше не понадобятся, поэтому я могу удовлетворить свои обязательство сообщать любым внешним организациям, что я больше не нуждаюсь в их услугах ».

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

Смежные вопросы