Analiza kodu mówi mi, że Enumarble.Where(this ...)
zwraca instancję WhereListIterator<T>
, która jest (wygląda) typem wewnętrznym w ramach .NET, która implementuje IDisposable
.Coverity, Enumerable.Where (this ...) i IDisposable
Coverity nie podoba się IDisposable
, aby przejść niezaangażowany, a zatem sugeruje, że usunę wspomnianą instancję. Oczywiście nie mogę pozbyć się instancji bez sprawdzania typów, ponieważ mówi się, że zwraca Enumerable.Where(this ...)
, aby zwrócić IEnumerable<T>
, która nie jest ihnerit z IDisposable
.
Moje pytanie brzmi następująco: .NET oczekuje, że wyrzucę WhereListIterator<T>
, czy też iterator się wyrzuci (powiedzmy po każdym wyliczeniu). Jeśli nie mam zamiaru się go pozbyć, to dlaczego interfejs jest zaimplementowany? Prowadzi mnie to do trzeciego, nieco niezwiązanego z sobą pytania: czy implementacja IDisposable
została jawnie zaimplementowana, czy Coverity (analiza kodu) nadal uważa, że powinienem ją usunąć?
Kod Przykład:
var myList = new List<int>{ 1, 2, 3, 4 };
var evenNumbers = myList.Where(x => x % 2 == 0);
foreach(var number in evenNumbers)
{
Console.WriteLine(number);
}
if(evenNumbers is IDisposable)
{
((IDisposable)evenNumbers).Dispose(); // This line will be executed
}
pętla foreach automatycznie wywołuje utylizować w jego imieniu; jeśli narzędzie do analizy kodu nie zna tego faktu, prawdopodobnie powinieneś użyć dokładniejszego narzędzia do analizy kodu. Możesz rozważyć zgłoszenie go jako błędu dla opiekunów narzędzia. –
To była moja myśl, ale zamiast być upartym, pomyślałem, że powinienem zapytać społeczność. –
Możesz też poczekać, aż ludzie, którzy produkują to narzędzie analityczne, zatrudnią Erica Lipperta do przepisywania swoich rzeczy. Ten problem nie występuje już w Coverity. –