Thứ Sáu, 29 tháng 6, 2012

Một demo nhỏ về sử dụng keyword Using trong C#

Using được dùng để khai báo phạm vi sử dụng của một biến. Tuy nhiên chỉ những class được implement từ IDisposable  mới có thể sử dụng được using. Sau khi ra khỏi phạm vi của Using biến khai báo sẽ tự động gọi phương thức Dispose.
Ví dụ:
  1. private void Demo()  
  2. {  
  3.     using (Font font1 = new Font("Arial", 10.0f))  
  4.     {  
  5.         byte charset = font1.GdiCharSet;  
  6.     }  
  7.     //không thấy và sử dụng được biến font1 ở ngoài này  
  8. }  
Lúc này chỉ có thể sử dụng biến font1 ở trong using. Biến font1 sẽ tự động gọi phương thức Dispose trước khi ra khỏi using.
Theo tài liệu MSDN thì đoạn code trên tương đương với:
  1. private void Demo()  
  2. {  
  3.     Font font1 = new Font("Arial", 10.0f);  
  4.     try  
  5.     {  
  6.         byte charset = font1.GdiCharSet;  
  7.     }  
  8.     finally  
  9.     {  
  10.         if (font1 != null)  
  11.             ((IDisposable)font1).Dispose();  
  12.     }  
  13. }  
Điều này cũng có nghĩa nếu return ra khỏi hàm hoặc gặp exception ngay trong using thì phương thức Dispose vẫn sẽ được gọi. Để chứng minh điều này mình đã thử làm ví dụ sau:
Khai báo 1 class implement từ interface IDisposable 
  1. class TestDispose : IDisposable  
  2. {  
  3.     public void Dispose()  
  4.     {  
  5.         Console.Write("Disposed! \n");  
  6.     }  
  7. }  
Khai báo 3 hàm test như sau:
  1. // sử dụng using bình thường  
  2. private static void Test1()  
  3. {  
  4.     Console.WriteLine("Test1");  
  5.     using (TestDispose t = new TestDispose())  
  6.     {  
  7.           
  8.     }  
  9. }  
  10.   
  11. //return ra khỏi hàm trước khi ra khỏi using  
  12. private static void Test2()  
  13. {  
  14.     Console.WriteLine("Test2");  
  15.     using (TestDispose t = new TestDispose())  
  16.     {  
  17.         return;  
  18.     }  
  19. }  
  20.   
  21. // gặp exception trong using  
  22. private static void Test3()  
  23. {  
  24.     Console.WriteLine("Test3");  
  25.     using (TestDispose t = new TestDispose())  
  26.     {  
  27.         throw new Exception("test");  
  28.     }  
  29. }  
Thực hiện test:
  1. static void Main(string[] args)  
  2. {  
  3.     Test1();  
  4.     Test2();  
  5.     try  
  6.     {  
  7.         // hàm này quăng exception nên cần try catch  
  8.         Test3();  
  9.     }  
  10.     catch  
  11.     { }  
  12.     Console.ReadLine();  
  13. }  
Kết quả cả 3 trường hợp phương thức Dispose đều được gọi.

Không có nhận xét nào :

Đăng nhận xét