Я только что столкнулся с чем-то довольно причудливым запуском приложения в режиме 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>
, поэтому он не может отложить ее на потом?
Вы очистили свою сборку и попробуйте еще раз? – Oded
Я повторил это несколько раз. Очистите его в каком смысле? –
Очистите, как при щелчке правой кнопкой мыши на Solution, затем «Clean Solution». – Oded