Mam trochę kodu, który zachowuje się inaczej między kompilacją wydania i kompilacją debugowania. Zachowuje się poprawnie podczas debugowania, ale nie w wersji.Dlaczego ten program wchodzi do bloku if w wersji Release, ale nie w wersji Debug?
Mam funkcję, która zwraca ReadOnlyCollection<MyCustomClass>
. Jeden punkt to:
var result = new List<MyCustomClass>();
...
var list1 = this.returnEmptyList();
var list2 = this.returnListWithOneItem();
if (list1.Count == 0 && list2.Count == 0)
{
functionOutVariable = string.Empty;
return result.AsReadOnly();
}
Do celów rozwiązywania problemów Mam uproszczonych kod i nazwane zmienne w sposób ogólny, a metody returnEmptyList
i returnListWithOneItem
pokazane są tutaj:
private List<string> returnEmptyList()
{
return new List<string>();
}
private List<string> returnListWithOneItem()
{
return new List<string> {"something"};
}
Jasno nigdy nie powinno wejść bloku if
ponieważ list2.Count
powinny zawsze być 1, ale kiedy mogę wykonać to w kompilacji Release, to robi:
Więc nie ma wyraźnie niektóre optymalizacji dzieje, ponieważ widać, że list1
jest niedostępne, a po wstępnej przez nią wykonywane linię 416, a potem skoczył natychmiast do linii 421. muszę stwierdzić, że wszystkie zespoły w moim użyciu rozwiązanie. NET Framework 4.6.2, a ja używam wersji Visual Studio 2017 15.3.5.
Kiedy zmienić build debugowania i wykonać to, że wykonuje linia 416, 417, a na linii 418 pokazuje list1.Count
jest 0 i list2.Count
wynosi 1, a właściwie robi nie wprowadzić blok if
.
Próbuję wykonać projekt testowy, aby odtworzyć to, ale nie mogę. Szukam sposobu, aby dojść do sedna tego. Nie chcę tylko poprawki, która sprawia, że odejdzie - muszę zrozumieć, co robię źle.
To brzmi jak błąd w kompilatorze. Czy możesz opublikować skompilowany plik IL w każdej kompilacji? – SLaks
Tryb debugowania w trybie ** wydania ** może być problematyczny: bieżący wskaźnik instrukcji może być niedokładny, a zmienne mogą zostać zoptymalizowane, jeśli włączony jest tryb ** Optymalizacja kodu **. Przejdź do Właściwości projektu i sprawdź w zakładce ** Build **. Wyłącz w razie potrzeby i możesz włączyć tę funkcję ponownie po zakończeniu. –
A co zrobisz później w tej funkcji, jeśli blok "if" nie zostanie wprowadzony? – Evk