null 객체와 함께 using 문에서 Dispose ()가 호출됩니까?


179

using(잠재적으로) 널 오브젝트 에서 명령문 을 사용하는 것이 안전 합니까?
다음 예제를 고려하십시오.

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

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

Dispose객체가 null이 아닌 경우에만 호출 되는 것이 보장 NullReferenceException됩니까?


답변:


172

예, Dispose()널이 아닌 오브젝트에서만 호출됩니다.

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


30
변수가 null 인 경우에도 using 블록이 실행되고 변수를 먼저 null 확인하지 않고 using 블록 내에서 변수를 참조하면 NullReferenceException이 발생합니다. 잘못된 해석을 방지하기 위해이 대답은 "예, Dispose()널이 아닌 오브젝트에서만 호출됩니다"라고 표시해야합니다.
서핑

37

의 확장 using은 객체가 null호출하기 전에 객체가 아닌지 확인 Dispose하므로 안전합니다.

귀하의 경우 다음과 같은 것을 얻을 수 있습니다 :

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

14

당신은 그것을 좋아해야합니다 :

using ((IDisposable)null) { }

여기에는 예외가 없습니다.

사이드 참고 : 함께이 실수하지 않습니다 foreachIEnumerable경우 예외가 발생합니다.


1

예, 참조를 폐기하기 전에 null 검사가 수행됩니다. Reflector에서 코드를보고 자신을 검사 할 수 있습니다.


-3

내 경험에 따라 null 참조 예외가 발생하지 않습니다. 단순히 무시됩니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.