Czy użycie using
instrukcji na (potencjalnie) pustym obiekcie jest bezpieczne?
Rozważmy następujący przykład:
class Test {
IDisposable GetObject(string name) {
// returns null if not found
}
void DoSomething() {
using (IDisposable x = GetObject("invalid name")) {
if (x != null) {
// etc...
}
}
}
}
Czy jest zagwarantowane, że Dispose
zostanie wywołany tylko wtedy, gdy obiekt nie jest pusty, a ja nie otrzymam NullReferenceException
?
c#
idisposable
using
Paolo Tedesco
źródło
źródło
Odpowiedzi:
Tak,
Dispose()
jest wywoływana tylko w przypadku obiektów niezerowych:http://msdn.microsoft.com/en-us/library/yh598w02.aspx
źródło
Dispose()
jest wywoływana tylko w przypadku obiektów niezerowych”.Rozszerzenie
using
sprawdza, czy obiekt nie jestnull
przed wywołaniemDispose
go, więc tak, jest bezpieczny.W twoim przypadku otrzymasz coś takiego:
źródło
Powinieneś być z tym w porządku:
Nie ma tutaj wyjątku.
Side uwaga: nie mylić z tym
foreach
, aIEnumerable
gdy zostanie wyrzucony wyjątek.źródło
Tak, przed usunięciem referencja zostanie zaznaczona jako null. Możesz sprawdzić siebie, przeglądając swój kod w Reflektorze.
źródło
Nie otrzymasz zerowego wyjątku odniesienia zgodnie z moim doświadczeniem. Zostanie po prostu zignorowany.
źródło