Самые большие загадки часто имеют самые глупые основания.Это урок непреднамеренных побочных эффектов.
Я обнаружил это, подумав о том, как удивительно, как член может быть изменен неожиданно.Я нашел решение до того, как прочитал комментарий @mjwills, но он определенно нюхал правильную вещь.
Что я упустил (конечно!), Так это то, что я только что написал код метода ToString () для класса... это не было отлажено.Почему я оставил это?Потому что это, очевидно, не может ни на что повлиять, поэтому это не может быть частью проблемы.
Bzzzzt!она использовала переменную-член как блокнот и обнуляла ее (есть побочный эффект);это было явно непреднамеренно.
Когда это означает, что когда код просто запускается, ToString () не вызывается, и переменная-член DOES корректно изменяется.(У меня даже были модульные тесты для процедуры «Set», которые проверяли все это, и они работали).
Но когда вы отлаживаете… отладчик может (и делал в этом случае) показывать локальные переменные,Для этого он, очевидно, вызовет ToString (), чтобы получить хорошее отображаемое значение.Таким образом, один шаг заставил ToSTring () быть вызванным, и его ошибочное присвоение переменной нуля обнуляло слот после каждого вызова шага.
Так что это не был сеттер, который меня укусил.Это было возможно добытчиком.(Где ключевое слово PURE FORTRAN, когда оно вам нужно?)
Эйнштейн ненавидел жуткие действия на расстоянии.Программисты ненавидят жуткие побочные эффекты на расстоянии.
Немного удивляет идея отладчика, вызывающего ToString () для класса, конструктор которого еще не завершен.Каким утверждениям о состоянии класса может доверять ToString, если конструктор не выполнен?Я думаю, что MS отладчик должен быть исправлен.При этом я бы потратил время на отладку ToString вместо того, чтобы гоняться за этим.
Спасибо, что согласились с моим вопросом.Это дало мне ответ.