Jaka jest różnica, jeśli taka istnieje, między destruktorem a metodą Finalize w klasie?W języku C# jaka jest różnica między destruktorem a metodą Finalize w klasie?
Niedawno odkryłem, że Visual Studio 2008 uważa destruktor za synonim metody Finalize, co oznacza, że Visual Studio nie pozwoli ci jednocześnie zdefiniować obu metod w klasie.
Na przykład następujący fragment kodu:
class TestFinalize
{
~TestFinalize()
{
Finalize();
}
public bool Finalize()
{
return true;
}
}
daje następujący błąd na wezwanie do Finalizacja w destruktora:
The call is ambiguous between the following methods or properties: 'TestFinalize.~TestFinalize()' and 'TestFinalize.Finalize()'
A jeśli wywołanie Finalizacja jest wypowiedziało się, to wydaje następujący błąd:
Type 'ManagementConcepts.Service.TestFinalize' already defines a member called 'Finalize' with the same parameter types
'Należy zaimplementować metodę Finalize, aby wyczyścić niezarządzane zasoby': umieścisz ją w Finaliźcie. To samo z Dispose? – hqt
@hqt: Przypadki, w których należy wdrożyć 'Dispose', znacznie przewyższają te, w których należy wdrożyć finalizator. Zaimplementuj polecenie "Usuń", jeśli jest prawdopodobne, że instancja klasy lub klasy pochodnej będzie ostatnią rzeczą, w której będzie bezpośrednio właścicielem niezarządzanego zasobu lub bezpośrednio będzie właścicielem ostatniej rzeczy, która będzie bezpośrednio właścicielem niezarządzanego zasobu, lub bezpośrednio będzie właścicielem ostatniej rzeczy do bezpośredniego posiadania itp. Zaimplementuj tylko 'Finalize' do czyszczenia zasobów, jeśli posiadasz klasę bezpośrednio posiadającą niezarządzany zasób i prawie nic innego - znacznie węższy scenariusz. – supercat
@hqt: Jeśli jedna klasa będzie bezpośrednio właścicielem zasobów niezarządzanych, a także będzie zawierała odniesienia do innych obiektów, zasoby niezarządzane powinny być generalnie podzielone na własną klasę (która nie powinna zawierać żadnych silnych odniesień do innych elementów), co oznacza, że klasa, która zawiera odwołania do innych obiektów, posiadałaby jedynie "rzeczy, które bezpośrednio posiadają niezarządzane zasoby", zamiast posiadać same zasoby, a zatem nie potrzebowałaby finalizatora. – supercat