2014-05-07 22 views
7

Próbuję usunąć wszystkie elementy z ToolStripDropDownButton. Ponieważ są one jednorazowe, nazywam metodę dispose na każdym z nich. Ale widzę, że po wywołaniu metody dispose() właściwość IsDisposed nadal zwraca wartość false. Dlaczego tak jest i jak mogę sprawdzić, czy Dispose() jest wywoływana na dowolnym obiekcie? To nie jest problem (mam nadzieję) w moim obecnym projekcie, ale naprawdę chciałbym wiedzieć, co tu się dzieje ...Dlaczego IsDisposed zwraca false po wywołaniu Dispose()?

mój kod do tej pory:

private void ClearDropDownAccessConnections() 
{ 
    ToolStripItem button = null; 

    for (int i = toolStripDropDownButtonAccess.DropDownItems.Count - 1; i > 0; i--) 
    { 
     button = toolStripDropDownButtonAccess.DropDownItems[i] as ToolStripItem; 
     if ((button.Tag != null) && ((int)button.Tag == 10)) 
     { 
      toolStripDropDownButtonAccess.DropDownItems.Remove(button); 
      button.Dispose(); 
      //IF I CHECk HERE THEN button.IsDisposed IS STILL FALSE    } 
     } 
    } 
+0

ToolStripItems to elementy "szczupłe", nie używają okna. I nie wywodzą się z klasy Control. To często oznacza, że ​​w rzeczywistości nie mają niczego wartego wyrzucenia. Sprawia, że ​​są one dość błędne. –

+0

[Więcej informacji na temat 'IDisposable'] (http://stackoverflow.com/a/538238/2478357). – Loetn

Odpowiedz

4

Dla niezależnie od powodu, , pierwotni programiści .NET zdecydowali się odwrócić flagę IsDisposed tylko wtedy, gdy umieszczona ToolStripItem ma niepustą właściwość Owner (którą wcześniej pośrednio ustawiłeś na linii null). Wydaje się, że nie ma to większego wpływu - tzn. Można założyć, że ToolStripItem jest bezpiecznie unieszkodliwiony pomimo tego dziwnego zachowania.

Jeśli chodzi o szersze pytanie - interfejs IDisposable nie zapewnia żadnego sposobu sprawdzenia, czy obiekt został usunięty (i co gorsza - klasy wdrażające go nie muszą gwarantować wykonania bez wyjątku, jeśli jest on nazywany więcej niż raz (patrz MSDN)). Musisz polegać na programistach wspomnianych klas, aby dostarczyć pewnych informacji, jeśli obiekt został faktycznie usunięty (co jak można zobaczyć w przykładzie ToolStripItem nie jest metodą sprawdzającą), lub śledzić to w jakiś sposób w kodzie.

Powiedziawszy to wszystko, rzadko staje się problemem w rzeczywistych sytuacjach (choć warto być tego świadomym).

+0

Dlaczego programiści .NET nie dają nam metody .Free, jak w Delphi. – GuidoG

+0

@ user3611669 Głównie dlatego, że jedną z głównych idei kryjących się za .NET jest to, że nie potrzebujesz funkcji "Wolny", tzn. Pamięcią zarządza środowisko wykonawcze, a nie programista (nie chcę wdawać się w dyskusję na temat profesjonalistów i przeciw). .NET 'Dispose'! = Delhpi 'Free' (co najmniej w najlepszym z mojego ograniczonego rozumienia Delphi), jak w większości normalnych scenariuszy' Dispose' nie wpłynie na ilość wolnej pamięci. – decPL