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?

Paolo Tedesco
sumber
1
Terkait stackoverflow.com/questions/2513035
Brian Rasmussen

Jawaban:

172

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

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

reko_t
sumber
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();
    }
}
João Angelo
sumber
14

Anda harus setuju dengan itu:

using ((IDisposable)null) { }

Tak terkecuali terlempar ke sini.

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

Darin Dimitrov
sumber
1

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

oli
sumber
-3

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

Melayu
sumber