Powodem ostrzeżenia jest to, że wewnątrz pętli można uzyskać dostęp do zmiennej, która się zmienia. Jednak "poprawka" tak naprawdę nie robi nic dla ciebie w tym kontekście bez pętli.
Wyobraź sobie, że masz pętlę FOR i jeśli była w środku, a deklaracja łańcucha znajdowała się poza nią. W takim przypadku błąd byłby prawidłowym identyfikowaniem problemu przechwytywania odniesienia do czegoś niestabilnego.
Przykładem tego, czego nie chcą:
string acctStatus
foreach(...)
{
acctStatus = account.AccountStatus[...].ToString();
if (!SettableStatuses().Any(status => status == acctStatus))
acctStatus = ACCOUNTSTATUS.Pending.ToString();
}
Problem polega na tym, że zamknięcie przechwyci odniesienie do acctStatus, ale każdej iteracji pętli zmienia tę wartość. W że przypadku lepiej byłoby:
foreach(...)
{
string acctStatus = account.AccountStatus[...].ToString();
if (!SettableStatuses().Any(status => status == acctStatus))
acctStatus = ACCOUNTSTATUS.Pending.ToString();
}
W kontekście tej zmiennej jest pętla, nowa instancja będzie tworzone za każdym razem, ponieważ zostały przeniesione zmienną wewnątrz kontekstu lokalnego (do pętli).
Zalecenie brzmi jak błąd w analizie tego kodu przez Resharpera. Jednak w wielu przypadkach jest to ważny problem (np. Pierwszy przykład, w którym odniesienie się zmienia pomimo przechwytywania w zamknięciu).
Moja zasada jest taka, że gdy masz wątpliwości, zrób coś lokalnego.
Oto prawdziwy przykład świat byłem ugryziony przez:
menu.MenuItems.Clear();
HistoryItem[] crumbs = policyTree.Crumbs.GetCrumbs(nodeType);
for (int i = crumbs.Length - 1; i > -1; i--) //Run through items backwards.
{
HistoryItem crumb = crumbs[i];
NodeType type = nodeType; //Local to capture type.
MenuItem menuItem = new MenuItem(crumb.MenuText);
menuItem.Click += (s, e) => NavigateToRecord(crumb.ItemGuid, type);
menu.MenuItems.Add(menuItem);
}
pamiętać, że przechwytywanie typ NODETYPE lokalny, zwróć uwagę NODETYPE i HistoryItem crumb.ItemGuid, a nie okruchów [i] .ItemGuid. Dzięki temu moje zamknięcie nie będzie zawierało odniesień do elementów, które ulegną zmianie.
Przed użyciem locals zdarzenia wywołałyby bieżące wartości, a nie oczekiwane wartości przechwycone.
Sprawdź to Pytanie i zaakceptowana odpowiedź mogą okazać się pomocne. http://stackoverflow.com/questions/235455/access-to-modified-closure – Chuck