Akankah Buang () dipanggil dalam pernyataan menggunakan dengan objek nol?


179

Apakah aman untuk menggunakan usingpernyataan pada objek null (berpotensi)?
Perhatikan contoh berikut:

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

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

Apakah dijamin hanya Disposeakan dipanggil jika objek tidak nol, dan saya tidak akan mendapatkan NullReferenceException?


Jawaban:


172

Ya, Dispose()hanya dipanggil pada objek non-null:

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


30
Perhatikan bahwa bahkan jika variabel Anda adalah nol, blok penggunaan dijalankan, dan jika Anda mereferensikan variabel Anda di dalam blok menggunakan tanpa terlebih dahulu memeriksa nol, Anda AKAN mendapatkan NullReferenceException. Untuk mencegah salah tafsir, jawaban ini harus menyatakan: "Ya, Dispose()hanya dipanggil pada objek yang bukan nol".
Berselancar

37

Perluasan untuk usingmemeriksa bahwa objek tidak nullsebelum memanggilnya Dispose, jadi ya, aman.

Dalam kasus Anda, Anda akan mendapatkan sesuatu seperti:

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

14

Anda harus setuju dengan itu:

using ((IDisposable)null) { }

Tak terkecuali terlempar ke sini.

Catatan: jangan keliru dengan foreachdan di IEnumerablemana pengecualian akan dilemparkan.


1

Ya, sebelum Membuang referensi akan dicentang nol. Anda dapat memeriksa diri sendiri dengan melihat kode Anda di Reflector.


-3

Anda tidak akan mendapatkan pengecualian referensi nol sesuai pengalaman saya. Ini akan diabaikan begitu saja.

Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.