Created
August 22, 2012 23:51
-
-
Save breezhang/3430657 to your computer and use it in GitHub Desktop.
Implementing a Dispose Method
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
copy from http://msdn.microsoft.com/en-us/library/fs2xkftw(v=vs.110) | |
using System; | |
using System.IO; | |
class Program | |
{ | |
static void Main() | |
{ | |
try | |
{ | |
// Initialize a Stream resource to pass | |
// to the DisposableResource class. | |
Console.Write("Enter filename and its path: "); | |
string fileSpec = Console.ReadLine(); | |
FileStream fs = File.OpenRead(fileSpec); | |
DisposableResource TestObj = new DisposableResource(fs); | |
// Use the resource. | |
TestObj.DoSomethingWithResource(); | |
// Dispose the resource. | |
TestObj.Dispose(); | |
} | |
catch (FileNotFoundException e) | |
{ | |
Console.WriteLine(e.Message); | |
} | |
} | |
} | |
// This class shows how to use a disposable resource. | |
// The resource is first initialized and passed to | |
// the constructor, but it could also be | |
// initialized in the constructor. | |
// The lifetime of the resource does not | |
// exceed the lifetime of this instance. | |
// This type does not need a finalizer because it does not | |
// directly create a native resource like a file handle | |
// or memory in the unmanaged heap. | |
public class DisposableResource : IDisposable | |
{ | |
private Stream _resource; | |
private bool _disposed; | |
// The stream passed to the constructor | |
// must be readable and not null. | |
public DisposableResource(Stream stream) | |
{ | |
if (stream == null) | |
throw new ArgumentNullException("Stream in null."); | |
if (!stream.CanRead) | |
throw new ArgumentException("Stream must be readable."); | |
_resource = stream; | |
_disposed = false; | |
} | |
// Demonstrates using the resource. | |
// It must not be already disposed. | |
public void DoSomethingWithResource() { | |
if (_disposed) | |
throw new ObjectDisposedException("Resource was disposed."); | |
// Show the number of bytes. | |
int numBytes = (int) _resource.Length; | |
Console.WriteLine("Number of bytes: {0}", numBytes.ToString()); | |
} | |
public void Dispose() | |
{ | |
Dispose(true); | |
// Use SupressFinalize in case a subclass | |
// of this type implements a finalizer. | |
GC.SuppressFinalize(this); | |
} | |
protected virtual void Dispose(bool disposing) | |
{ | |
// If you need thread safety, use a lock around these | |
// operations, as well as in your methods that use the resource. | |
if (!_disposed) | |
{ | |
if (disposing) { | |
if (_resource != null) | |
_resource.Dispose(); | |
Console.WriteLine("Object disposed."); | |
} | |
// Indicate that the instance has been disposed. | |
_resource = null; | |
_disposed = true; | |
} | |
} | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment