2010-03-26 21 views
128

using ifadesini (potansiyel olarak) boş bir nesnede kullanmak güvenli midir?Null nesnesiyle deyimi kullanma

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

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

o Dispose nesne boş değil yalnızca denilen olacağını garanti ediyor ve bir NullReferenceException almazsınız:
Aşağıdaki örneği ele alalım?

+3

Denemeyi öneririm ... İhtiyacınız olan kodun çoğuna sahip oldunuz – cjk

+0

İlgili http://stackoverflow.com/questions/2513035 –

cevap

121

Evet, Dispose() sadece boş olmayan nesnelerde denir: referansı atılması boş-kontrol olacak

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

+18

Değişkeniniz sıfır bile olsa, kullanım bloğu olduğunu unutmayın. yürütüldü, ve eğer değişkeninizi ilk önce kullanmadan önce blok içinde referans alırsanız, NullReferenceException alacaksınız. Yanlış yorumlamayı önlemek için, bu cevap şöyle olmalıdır: "Evet," Dispose() "sadece null olmayan nesnelerde çağrılır". – surfen

8

Onunla ok olmalıdır:

using ((IDisposable)null) { } 

İstisna yok burada atılmış.

Yan not: Bunu bir istisna atılacak olan foreach ve IEnumerable ile karıştırmayın.

24

using için genişleme, null nesnesinin, Dispose numaralı telefonu aramadan önce olmadığını kontrol eder, bu nedenle güvenlidir.

Durumda da böyle bir şey alacağı: Benim deneyimlerimden göre null başvuru özel almazsınız

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

. Basitçe göz ardı edilecektir.

0

Evet, önce. Kodunuzu Reflektör'de görüntüleyerek kendinizi inceleyebilirsiniz.

İlgili konular