2011-08-05 13 views
5

Widziałem niektóre kodu do pracy z AD in this stackoverflow questionZmieszany z wykorzystaniem C# „”

Dostaję mylić o użyciu instrukcji. Myślałem, że to był tylko wykorzystywany do rzeczy, które są zaniepokojeni może stać wyciek pamięci, jak WebClient lub podobny ...

Zresztą:

using (var context = new PrincipalContext(ContextType.Domain)) 
{ 
     using (var user = UserPrincipal.FindByIdentity(context, "username")) 
     { 
      var groups = user.GetAuthorizationGroups(); 
      ... 
     } 
} 

kiedy osiągnie linię var groups = user.GetAuthorizationGroups() - użytkownik jest null , więc linia kończy się niepowodzeniem z NullReference. Kiedy mysz nad nim debugowanie pokazuje zero, a następnie pokazuje Static Members i ma wszystkie wartości.

Jeśli wyjmuje wiersz z użycia instrukcji i po prostu ma var user = UserPrincipal.FindByIdentity(context, "username") użytkownik jest wypełniany zgodnie z wymaganiami.

Co się dzieje?

Edytuj: Wypchałem i wysyłałem fałszywą nazwę użytkownika. Dziwnie jednak, gdy sprawdzam zmienne podczas debugowania, kiedy można oczekiwać, że użytkownik będzie całkowicie zerowy, jeśli wyślę fałszywego identyfikatora użytkownika, ale wyświetli się on pod użytkownikiem: null, statyczni członkowie, a tam są wartości dla tego, w którym byłem aktualnie zalogowany. więc pomyślałem, że ma to związek z użyciem instrukcji potencjalnie. Pozdrawiam!

+0

'using' jest dla wszystkiego, co implementuje' IDisposable'. –

+0

Mówiąc bardziej ogólnie, powinieneś pomyśleć o używaniu instrukcji 'using' (i tym samym' IDisposable'), aby zapobiec * wyciekom zasobów *. Takie zasoby ostatecznie są "pamięcią", ale nie muszą być w bardziej abstrakcyjnym znaczeniu (jak uchwyt pliku, połączenie z bazą danych itp.). –

+1

"Korzystanie z instrukcji" wpływa tylko na zmienną na końcu zakresu stosowania, w którym to momencie udostępnia ją. Czy jesteś pewien, że to nie jest niepoprawny użytkownik? (ponieważ UserPrincipal.FindByIdentity zwraca wartość null, jeśli nie zostanie znaleziony) – Will

Odpowiedz

3

To, co opisujesz, nie może się zdarzyć. Specjalność instrukcji using nie występuje, dopóki blok nie zostanie ukończony, gdy obiekt zostanie usunięty. Więc wewnątrz tego bloku zmienna user jest taka sama, niezależnie od tego, czy jest w instrukcji using czy nie.

1

Instrukcja using gwarantuje, że wywołanie zostanie wywołane, nawet jeśli wystąpi wyjątek podczas wywoływania metod na obiekcie. Możesz osiągnąć ten sam wynik, umieszczając obiekt wewnątrz bloku try, a następnie wywołując Dispose in finally block; tak właśnie kompilator tłumaczy instrukcję użycia.

1

Instrukcja C# "using" zapewnia wygodną składnię, która zapewnia poprawne użycie obiektów IDisposable. Sprawdź, czy PrincipalContext ma metodę jednorazową lub implementuje IDisposable. Jeśli nie, to nie powinieneś używać "używania". Aby uzyskać więcej informacji, patrz MSDN documentation.

2

Używanie jest po prostu syntaktycznym cukrem dla try/finally i automatycznie wywołań Usuń na obiektach, które implementują IDisposable.

+0

Właściwie, po prostu spróbuj/w końcu - nie ma haczyka. (czy jest to "zrób, czy nie, nie ma próby")? –

+0

@Joe Enos, masz absolutną rację. To tylko próba/w końcu. Dziękuję za wskazanie tego. – Icarus

Powiązane problemy