2016-10-07 3 views
0

он начинает со мной прочтения stackoverflow answerЗачем мне нужно вызывать dispose на streamreader и stringwriter?

StringWriter implments public abstract class TextWriter : MarshalByRefObject, IDisposable

на MSDN он говорит:

рамочная обеспечивает System.IDisposable интерфейс, который должен быть реализован предоставить разработчику руководство способ освободить неуправляемые ресурсы , как только они не понадобятся.

но что считается неуправляемым ресурсом? Я, очевидно, не думаю, что StringWriter подходит. если я пишу мои собственные без наследования IDisposable .... Я не вижу никакой необходимости добавлять Dispose()

class ConfusedDevStringWriter{ 
    private StringBuilder sb; 
    public ConfusedDevStringWriter(){ //ctor 
     sb = new StringBuilder(); 
    } 
} 

И действительно я тестировал с отладчиком Visual Studio памяти: enter image description here раз функция возвращает, StringWriter и его StringBuilder освобождены ... Moreoever, вызов Dispose, кажется, не делать ничего для StringWriter ...

enter image description here

Так не каждый класс, inhe rit from IDisposable имеет полезное значение Dispose. Опять же, это относится к моему вопросу , что считается неуправляемым ресурсом (примеры будут высоко оценены n_n). Я слышал, что файлы являются одним из них ... но не CLR VM? ... все ресурсы должны управляться им, не?

+3

Вы задаете вопрос "*, что считается неуправляемым ресурсом *" уже есть ответы: http://stackoverflow.com/questions/3433197/what-exactly-are-unmanaged-resources – user3185569

+1

Вопрос в заголовке ответил более или менее в http : //stackoverflow.com/questions/234059/is-a-memory-leak-created-if-a-memorystream-in-net-is-not-closed (тот же Q о MemoryStream). –

+0

Я закрыл его как дубликат http://stackoverflow.com/questions/2475228, который между этим и http://stackoverflow.com/questions/3433197 отвечает на оба вопроса. –

ответ

0

StringWriter наследуется от абстрактного TextWriter, который реализует IDisposable, и имеют некоторые подклассы, которые сделать неуправляемые ресурсы, такими как потоки, дескрипторы файлов и т.д. Таким образом, можно безопасно утилизировать любой подкласс TextWriter без необходимости беспокоиться о если захоронение необходимо или нет.

Так Утилизируя StringWriter не может на самом деле делать ничего (по аналогии с DataSet), но это все-таки хорошая практика, чтобы избавиться от всего, что реализует IDisposable.

+1

Я не согласен. Не рекомендуется использовать код, который ничего не делает. Это на самом деле плохая практика. Языки программирования - это «процесс»; не ждите или ничего не делайте. – Darkonekt

1

StringWriter спускается с TextWriter, который реализует IDisposable, вероятно, потому, что большинствоTextWriters будет иметь неуправляемые ресурсы. Если вы получаете TextWriter, и вы не знаете, откуда оно взялось (т. Е. Это может быть любой потомок TextWriter), то тот факт, что TextWriter реализует IDisposable, позволяет вам правильно управлять любыми неуправляемыми ресурсами, которые у него есть. Вы можете написать код, который принимает любые TextWriter, вызывает Dispose, когда писатель больше не нужен, и надеемся, что все будет очищено ОК.