我有一些代碼在發佈版本和調試版本之間的行爲不同。它在Debug中正確運行,但在Release中不正確。爲什麼此程序在發佈版本中輸入if塊但不在調試版本中?
我有一個函數返回ReadOnlyCollection<MyCustomClass>
。一個部分是這樣的:
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();
}
對於我已經簡化了代碼,並命名爲一種通用的方式變量排除故障的目的,方法和returnEmptyList
returnListWithOneItem
如下所示:顯然
private List<string> returnEmptyList()
{
return new List<string>();
}
private List<string> returnListWithOneItem()
{
return new List<string> {"something"};
}
它不應該進入if
塊,因爲list2.Count
應始終爲1,但是當我在一個發佈版本執行此,它確實:
因此,有明確一些優化回事,因爲你可以看到,list1
不可訪問,並通過它加強在執行管線416,然後立即躍升至行421,我應該說,在我的解決方案使用的所有組件。 NET框架4.6.2,並且我正在運行Visual Studio 2017版本15.3.5。
當我改變構建調試和執行這一點,執行管線416,417,和上線418它顯示list1.Count
是0和list2.Count
爲1,它正確地做不進入if
塊。
我試圖做一個測試項目來重現這一點,但我不能。我正在尋找任何方式來達到此目的。我不只是想要一個讓它消失的修復程序 - 我需要明白我做錯了什麼。
這聽起來像編譯器中的錯誤。你能在每個版本中發佈編譯後的IL嗎? – SLaks
在** Release **模式下進行調試可能會產生問題:當前語句指針可能不準確,並且如果您已啓用** Optimize Code **,則可能會優化變量。轉到項目屬性並檢查** Build **選項卡下。如果需要禁用,您可能需要在完成後再次啓用它。 –
如果未輸入「if」程序段,那麼稍後在此功能中會做什麼? – Evk