Praca z obiektami COM może być trudna i czasami frustrująca. Przykład:
Worksheet sheet = excelApp.Worksheets.Open(...); // Jakaś logika. Odczytywanie lub modyfikacja arkusza itp. Marshal.ReleaseComObject(sheet); Marshal.ReleaseComObject(excelApp);
O obiektach COM należy pamiętać, również po zakończeniu pracy z nimi – należy zwolnić wszelkie zasoby. Nie zawsze jest to proste i oczywiste. Powyższy kod spowoduje memory leak ponieważ Worksheets również musi zostać zwolniony. Metoda Open jest wywołana na obiekcie Worksheets, który został zapomniany w powyższym fragmencie kodu.
Zasada pracy z obiektami COM jest prosta i mówi, aby unikać podwójnych kropek czyli odwoływania się do dwóch różnych obiektów. Po refaktoryzacji kod powinien wyglądać następująco:
Worksheets sheets = excelApp.Worksheets; Worksheet sheet = sheets.Open(...); ... Marshal.ReleaseComObject(sheet); Marshal.ReleaseComObject(sheets); Marshal.ReleaseComObject(excelApp);
Jak widać, nie ma w żadnej linii podwójnych odwołań. Dzięki temu, łatwo zauważyć, które obiekty powinny zostać zwolnione. Warto przestrzegać tej zasady ponieważ późniejsza analiza memory leak może spowodować wiele problemów.
Tego nie wiedziałem, bardzo prosta, aczkolwiek wartościowa porada.
A co do tej zasady double dot, czy ona nie jest dobrą praktyką samą w sobie, nie tylko przy obiektach COM ?
@morel:
No nie wiem. Gdyby był to kod managed, jaki jest sens rozdzielania tego na dwie linie? Nie widzę sensu o ile nie istnieje ryzyko NULL’a. Jeśli tak, wtedy trzeba dodać Assert albo IF.
@Piotr Zieliński:
Morelowi chodziło chyba o prawo Demeter.