2010-03-26 39 views
128

Có an toàn khi sử dụng câu lệnh using trên đối tượng null (có khả năng) không?
Hãy xem xét ví dụ sau:Sử dụng câu lệnh với đối tượng rỗng

class Test { 
    IDisposable GetObject(string name) { 
     // returns null if not found 
    } 

    void DoSomething() { 
     using (IDisposable x = GetObject("invalid name")) { 
      if (x != null) { 
       // etc... 
      } 
     } 
    } 
} 

Có đảm bảo rằng Dispose sẽ được gọi là chỉ khi đối tượng không phải là null, và tôi sẽ không có được một NullReferenceException?

+3

Tôi khuyên bạn nên dùng thử ... Bạn có hầu hết mã bạn cần ở đó – cjk

+0

Related http://stackoverflow.com/questions/2513035 –

Trả lời

121

Vâng, Dispose() chỉ được gọi trên đối tượng không null:

http://msdn.microsoft.com/en-us/library/yh598w02.aspx

+18

Lưu ý rằng ngay cả khi biến của bạn là null, khối sử dụng là thực hiện, và nếu bạn tham chiếu biến của bạn bên trong khối sử dụng mà không kiểm tra null lần đầu tiên, bạn sẽ nhận được NullReferenceException. Để ngăn chặn sự diễn giải sai, câu trả lời này phải ghi rõ: "Có,' Vứt bỏ() 'chỉ được gọi trên các đối tượng không null". – surfen

8

Bạn nên ok với nó:

using ((IDisposable)null) { } 

Không có ngoại lệ ném đây.

Lưu ý phụ: không nhầm lẫn điều này với foreachIEnumerable nơi ngoại lệ sẽ được ném.

24

Việc mở rộng cho using kiểm tra xem đối tượng không phải là null trước khi gọi số Dispose trên đó, vì vậy có, an toàn.

Trong trường hợp của bạn, bạn sẽ nhận được một cái gì đó như:

IDisposable x = GetObject("invalid name"); 
try 
{ 
    // etc... 
} 
finally 
{ 
    if(x != null) 
    { 
     x.Dispose(); 
    } 
} 
-2

Bạn sẽ không phải ngoại lệ tham chiếu null theo kinh nghiệm của tôi. Nó sẽ bị bỏ qua.

0

Vâng, trước khi Vứt bỏ các tham chiếu sẽ được null-kiểm tra. Bạn có thể tự kiểm tra bằng cách xem mã của mình trong Trình phản xạ.

Các vấn đề liên quan