Basically, when you use the using block, when the code is done the object's Dispose-method gets called. And you need to implement the IDisposable interface for that. When you're not using the using-block and object gets garbage collected, object's destructor/finalizer gets called.
1 using System;
2 3 namespace DisposeTest
4 { 5 class Tester
6 { 7 static void Main(string[] args)
8 { 9 // Note: we create objects in separate method, because if we
10 // create instances and call GC in same method, objects would
11 // technically still be associated with running code and would
12 // therefore not be eligible for garbage collection
13 InitializeObjects(); 14 15 // suggest GC that now would be a lovely time to pick up the trash
16 GC.Collect();
17 18 Console.ReadLine();
19 } 20 21 private static void InitializeObjects()
22 { 23 // Create an object, and then set its value to null.
24 // object's Dispose()-method is not called
25 DisposableObject object1 = new DisposableObject { ObjectID = 1 };
26 object1 = null;
27 28 // Object's Dispose()-method is called right after we exit the using block
29 using (DisposableObject object2 = new DisposableObject { ObjectID = 2 })
30 { 31 32 } 33 } 34 } 35 } Here's the class that implements the IDisposable interface, and shows the use of Dispose()-method and destructor.
1 using System;
2 3 namespace DisposeTest
4 { 5 public class DisposableObject : IDisposable
6 { 7 public int ObjectID { get; set; }
8 9 10 // this method is called when object is disposed,
11 // like after using-block
12 public void Dispose()
13 { 14 Console.WriteLine(
15 "Object {0} says: I've been disposed!", ObjectID);
16 } 17 18 // this method gets called when object is garbage collected
19 ~DisposableObject() 20 { 21 Console.WriteLine(
22 "Object {0} says: Argh, garbage collector got me!", ObjectID);
23 } 24 } 25 }
Further reading in MSDN: IDisposable.Dispose Method
No comments:
Post a Comment