Dispose () sẽ được gọi trong câu lệnh sử dụng với đối tượng null?


179

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

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 nó Disposesẽ chỉ được gọi nếu đối tượng không phải là null và tôi sẽ không nhận được NullReferenceException?


Câu trả lời:


172

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

http://msdn.microsoft.com/en-us/l Library / ry598w02.aspx


30
Lưu ý rằng ngay cả khi biến của bạn là null, khối sử dụng được thực thi và nếu bạn tham chiếu biến của mình bên trong khối sử dụng mà không kiểm tra null trước, bạn S get nhận được NullReferenceException. Để ngăn chặn việc giải thích sai, câu trả lời này phải ghi rõ: "Có, Dispose()chỉ được gọi trên các đối tượng không null".
lướt

37

Việc mở rộng để usingkiểm tra xem đối tượng không phải là nulltrước khi gọi Disposenó, vì vậy, nó 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();
    }
}

14

Bạn sẽ ổn với nó:

using ((IDisposable)null) { }

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

Lưu ý bên lề: đừng nhầm lẫn điều này với foreachIEnumerablenơi một ngoại lệ sẽ được ném ra.


1

Có, trước khi loại bỏ tham chiếu sẽ được kiểm tra null. Bạn có thể tự kiểm tra bằng cách xem mã của mình trong Reflector.


-3

Bạn sẽ không nhận được ngoại lệ tham chiếu null theo kinh nghiệm của tôi. Nó sẽ chỉ đơn giản là bỏ qua.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.