Я только что столкнулся с чем-то довольно странным при запуске приложения в Debug
режиме (VS 2008 Express
, Any Cpu
). Я был бы признателен, если бы кто-нибудь просветил меня относительно того, что здесь происходит?
// 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
, хотя его конструктор размещает несколько словарей:
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>
инициализацию и не может отложить ее на потом?
bin
. - person Oded   schedule 08.03.2012sizeIds
s. Не доверяйте отладчику. - person CodesInChaos   schedule 08.03.2012Dictionary<string, string>
, которые выделяются в следующем кадре стека, так что давайте подождем с этим до тех пор и выполним все за один раз, тем самым как-то ускоряя процесс. (???) - person Konrad Morawski   schedule 08.03.2012