public static void Main()
Console.WriteLine($"{nameof(DirectUsage)} with dispose");
Console.WriteLine($"{nameof(DirectUsage)} with close");
Console.WriteLine($"{nameof(StreamReaderUsage)} with dispose");
StreamReaderUsage(DisposeIt);
Console.WriteLine($"{nameof(StreamReaderUsage)} with close");
StreamReaderUsage(CloseIt);
Console.WriteLine($"{nameof(StreamReaderUsage)} with dispose");
StreamReaderUsage(DisposeIt, true);
Console.WriteLine($"{nameof(StreamReaderUsage)} with close");
StreamReaderUsage(CloseIt, true);
public static void DirectUsage(Action<dynamic, Stream> disposeIt)
var ms = CreateStreamWithText();
public static void StreamReaderUsage(Action<dynamic, Stream> disposeIt, bool leaveOpen = false)
var ms = CreateStreamWithText();
var sr = new StreamReader(ms, leaveOpen: leaveOpen);
Console.WriteLine(sr.ReadToEnd());
ms.Seek(0, SeekOrigin.Begin);
public static Stream CreateStreamWithText(string text = "Some text")
return new MemoryStream(System.Text.Encoding.UTF8.GetBytes(text));
public static void DisposeIt(dynamic obj, Stream stream)
Console.WriteLine($"Can read before dispose: {stream.CanRead}");
Console.WriteLine($"Can read after dispose: {stream.CanRead}");
public static void CloseIt(dynamic obj, Stream stream)
Console.WriteLine($"Can read before dispose: {stream.CanRead}");
Console.WriteLine($"Can read after dispose: {stream.CanRead}");