Dokumentacja MS bywa niekonsekwentna.
Bywa, że opis w doku jakiegoś typu wyraźnie krzyczy, że jest IDisposable
i musi być using
albo Dispose()
, `RNGCryptoServiceProvider na ten przykład:
Important
This type implements the IDisposable interface. When you have finished using the type, you should dispose of it either directly or indirectly. To dispose of the type directly, call its Dispose method in a
try
/catch
block. To dispose of it indirectly, use a language construct such asusing
(in C#) orUsing
(in Visual Basic). For more information, see the "Using an Object that Implements IDisposable" section in the IDisposable interface topic.
Więc przez długi czas szukałem po prostu w docu czy jest wielkie ogłoszenie że IDisposable i jeśli nie było, no to zakładałem, że nie jest IDisposable.
Błąd. Ciągle usuwam w kodzie przypadki użycia obiektów IDisposable bez Dispose'owania ich.
Przykład. HttpClient
. Nigdzie w docu nie ma wielkiego ogłoszenia, że IDisposable. Na samej górze gdy podają, po czym to dziedziczy, też nie ma jawny sposób podane, że implementuje IDisposable, a tylko, że dziedziczy po HttpMessageInvoker
. By się zorientować, że IDisposable, trzeba albo kliknąć w klasę bazową, albo znaleźć metodę Dispose w sekcji Methods.
Ale OK - HttpClient to zły przykład, przecież każdy wie, że to musi być IDisposable bo pewnie trzyma jakieś sockety i w ogóle to powinien żyć tyle, ile apka.
To co można powiedzieć o takiej klasie, jak HMACSHA256
??
Nie wpadłbym na to, że jest IDisposable (co tam w ogóle trzyma??). I znowu nie wynika to w żaden widoczny na pierwszy rzut oka z dokumentacji. Oczywiście nie opakowałem tego w using
.
Dziwię się, że MS nie zaznacza wyraźniej typów IDisposable. Moim zdaniem Visual Studio powinien dawać jakąś literkę D nad każdą zmienną, która jest typu IDisposable i nad każdym wywołaniem metody, która zwraca coś, co jest IDisposable. Za łatwo przeoczyć, że użyło się czegoś IDisposable i nie zorientowało się, że to coś jest IDisposable, a przecież nieDispose'owanie obiektów IDisposable to wyciek i bug.
No ale jest jak jest. Jakieś sprawdzone w boju sposoby na nieprzeaczanie takich rzeczy? W jaki sposób upewniacie się, że nie użyliście niechcący czegoś, co jest IDisposable bez zauważenia, że to jest IDisposable?