2012-03-08 1 views
1

Я только что столкнулся с чем-то довольно причудливым запуском приложения в режиме Debug (, Any Cpu). Я был бы признателен, если бы кто-нибудь просветил меня относительно того, что здесь происходит?Удивительно CLR/JIT? поведение - отсроченная инициализация локальной переменной

// PredefinedSizeGroupMappings is null here 
Dictionary<string, int> groupIDs = PredefinedSizeGroupMappings ?? new Dictionary<string, int>(); 

// so groupIDs is now initialized as an empty Dictionary<string, int>, as expected 

// now: PredefinedSizesMappings is null here - therefore I expect sizeIds 
// to be initialized as an empty dictionary: 
Dictionary<string, string> sizeIds = PredefinedSizesMappings ?? new Dictionary<string, string>(); 

// but at this point sizeIds is still null! :O That's what debugger shows. 
var groupsReport = new AutomappingReportArgs(); 

// only once we get here - it's suddenly not... The debugger shows: "Count = 0" 
var sizesReport = new AutomappingReportArgs(); 

AutomappingReportArgs класс не имеет никакой связи с переменной sizeIds, хотя его конструктор делает alocate ряд словарей:

public AutomappingReportArgs() 
{ 
    ChangedNames = new Dictionary<string, KeyValuePair<string, string>>(); 
    CreatedAfterRename = new Dictionary<string, string>();    
    Existing = new Dictionary<string, string>(); 
    Created = new Dictionary<string, string>(); 
    Failed = new Dictionary<string, string>(); 
} 

Я предполагаю, что это должен быть какой-то компилятор или оптимизации CLR, но Я хотел бы узнать его механизм более подробно. В чем причина этой «отсроченной инициализации»?

И почему это непоследовательно, почему это работает сразу для Dictionary<string, int>, но не для Dictionary<string, string>? Это из-за того, что компилятор не видит никакой инициализации Dictionary<string, int>, поэтому он не может отложить ее на потом?

+0

Вы очистили свою сборку и попробуйте еще раз? – Oded

+0

Я повторил это несколько раз. Очистите его в каком смысле? –

+1

Очистите, как при щелчке правой кнопкой мыши на Solution, затем «Clean Solution». – Oded

ответ

2

Это довольно стандартное поведение при отладке оптимизированного кода. Вряд ли будет иметь место здесь. Скорее всего, будет ошибкой в ​​отладчике. Было важное исправление для SP1 для PostScript для VS2008, в котором исправлено множество проблем отладчика.

Вы найдете ссылку на исправление в this answer. Не так уверенно, как исправление относится к Express Edition, вы должны быть в порядке, но я не могу этого гарантировать.

Смежные вопросы