Code Review: obiekty COM oraz zasada “double dot”.

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.

4 thoughts on “Code Review: obiekty COM oraz zasada “double dot”.”

  1. A co do tej zasady double dot, czy ona nie jest dobrą praktyką samą w sobie, nie tylko przy obiektach COM ?

  2. @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.

Leave a Reply

Your email address will not be published.