Dispose () yöntemi, null nesneyle birlikte using ifadesinde çağrılır mı?


179

İfadeyi using(potansiyel olarak) boş bir nesne üzerinde kullanmak güvenli midir?
Aşağıdaki örneği düşünün:

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

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

DisposeSadece nesne null değilse çağrılması garanti edilir NullReferenceExceptionmi ve ben alamayacağım ?


Yanıtlar:


172

Evet, Dispose()yalnızca boş olmayan nesnelerde çağrılır:

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


30
Değişkeniniz null olsa bile, kullanım bloğunun yürütüldüğünü ve değişkeninizi ilk olarak null kontrol etmeden kullanım bloğunun içine başvurursanız, NullReferenceException elde edeceğinizi unutmayın. Yanlış yorumlamayı önlemek için, bu cevap şöyle olmalıdır: "Evet, Dispose()yalnızca boş olmayan nesnelerde çağrılır".
surfen

37

usingNesnenin nullçağrılmadan önce olmadığını kontrol etmek için genişletmeDispose , bu yüzden evet, güvenlidir.

Sizin durumunuzda şöyle bir şey elde edersiniz:

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

14

Onunla iyi olmalısın:

using ((IDisposable)null) { }

Burada istisna yok.

Yan not: bunu bir istisna ile nereye foreachve IEnumerablene ile karıştırmayın .


1

Evet, Elden Çıkarmadan önce referans boş bırakılacaktır. Kodunuzu Reflektör'de görüntüleyerek kendinizi inceleyebilirsiniz.


-3

Deneyimlerime göre null referans istisnası alamayacaksınız. Basitçe yok sayılır.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.