2016-08-22 10 views
-2

Хотите понять, какая часть исходного кода StreamWriter является неуправляемым кодом. Прошли код на сайте http://referencesource.microsoft.com/.Может ли кто-нибудь объяснить, почему StreamWriter является неуправляемым ресурсом.

Но, кажется, сложный код для понимания, есть хорошие комментарии в исходном коде. Но все же было трудное время для понимания, может быть, мои знания не соответствуют этому знаку. Однако, если у кого-нибудь есть блог или статья, которые могут ответить на этот вопрос. это будет замечательно !!!

+0

Что вы подразумеваете под «исходным кодом StreamWriter является неуправляемым кодом»? Вы спрашиваете, почему он одноразовый? – stuartd

+0

да @stuartd !!!. – sameer

+1

Просто потому, что тип, реализующий 'IDisposable', не означает, что он должен ** использовать неуправляемые ресурсы. – user1620220

ответ

2

StreamWriter не является неизменным ресурсом, его классом .NET, и он управляется на 100%.

Другой совершенно другое дело, что StreamWriter может внутренне использовать неуправляемые ресурсы или владеть IDisposable объект, который в свою очередь, может использовать неуправляемый ресурс, или просто расширяет класс, который реализует IDisposable.

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

В конкретном случае StreamWriter очевидно, что он может косвенно потреблять неодинаковые ресурсы; базовый поток (поле экземпляра IDisposableStream stream) может быть FileStream, который явно потребляет неуправляемые ресурсы (например, файл в вашем HD). Но также очень возможно, что базовый поток не использует неуправляемые ресурсы, но как Colin Mackay правильно указывает в комментариях ниже, все потоки должны реализовывать согласованный интерфейс, который предоставляет абстрактный класс Stream.

+0

спасибо, хочу понять, что такое использование streamwriter, обеспечивающее реализацию интерфейса IDisposable. – sameer

+1

@sameer Две причины. Прежде всего, потому что это происходит от 'TextWriter', который реализует' IDisposable'. Во-вторых, поскольку он внутренне использует поле «Стрим», которое является объектом «IDisposable» (одна из причин, по которым я дал, где вы должны реализовать «Dispose()»). – InBetween

+0

Независимо от того, управляется ли базовый поток или нет, он должен (как и сами потоки) по-прежнему иметь согласованный интерфейс для любых абонентов, иначе вы нарушите Принцип замещения Лискова. –

0

StreamWriter управляется, но это соглашение, согласно которому утилита .NET Stream всегда будет утилизировать любые базовые потоки. Потоки часто создаются как контейнеры или обертки вокруг других потоков. Например, может быть оберткой вокруг FileStream (например, при создании StreamWriter с использованием System.IO.File.CreateText). Поскольку FileStream использует управляемые ресурсы, и вы не обязательно имеете прямую ссылку на него, важно иметь возможность распоряжаться им, вызывая Dispose() на StreamWriter.

A FileStream содержит управляемые ресурсы в виде дескрипторов файлов уровня ОС.

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