C# некоторые общедоступные свойства недоступны, фактически полностью отсутствуют

У меня странная проблема с простым классом, который имеет 3 общедоступных свойства. По какой-то причине только 2 свойства «существуют», хотя код, который их определяет, идентичен.

В другом месте кода я привязываюсь к этим трем свойствам, 2 из них работают (метрика и весовые единицы), а «distanceUnits» — нет.

Когда я ставлю точку останова на код, в котором создается экземпляр этого класса, и навожу указатель мыши на объект, в качестве общедоступных свойств отображаются только «метрика» и «weightUnits», а когда я раскрываю «непубличные члены», там все, кроме «distanceUnits». "до сих пор отсутствует.

Снимок экрана отладчика:

введите здесь описание изображения

public class AppGlobalSettings : INotifyPropertyChanged
{
    public event PropertyChangedEventHandler PropertyChanged;

    private bool _metric;
    public bool metric
    {
        get { return _metric; }
        set {
            _metric = value;
            if (_metric) {
                distanceUnits = "cm";
                weightUnits = "Kg";
            }
            else {
                distanceUnits = "in.";
                weightUnits = "lbs";
            }
            OnPropertyChanged();
        }
    }

    private string _weightUnits;
    public string weightUnits { get { return _weightUnits; } set { _weightUnits = value; OnPropertyChanged(); } }

    private string _distanceUnits;
    public string distanceUnits { get { return _distanceUnits; } set { _distanceUnits = value; OnPropertyChanged(); } }
...
}

Единственная проблема, о которой я могу думать, заключается в том, что объект создается как «общедоступный статический объект» (см. ниже), но это не объясняет, почему доступны только некоторые свойства...

public class App : Application
{
    public static AppGlobalSettings appSettings;
    public App() {
        appSettings = new AppGlobalSettings();
        appSettings.distanceUnits = "in."; // ** just for debugging **
...
}

Я знаю, что это свойство "существует" и является общедоступным, потому что я добавил код отладки (как указано выше), и оно работает (действительно вызывает метод "set" для "distanceUnits"), но оно не отображается в отладчике и в привязка не работает.

Для полноты картины вот код привязки для меток, отображающих DistanceUnits:

        Binding girthUnitBinding = new Binding("distanceUnits");
        girthUnitBinding.Source = App.appSettings;
        girthCell.unitLabel.SetBinding(Label.TextProperty, girthUnitBinding);

И в этом разделе, если я редактирую «distanceUnits» на «weightUnits» просто в качестве теста, привязка работает.

Итак, есть идеи, почему обработчик propertyChanged и отладчик могут видеть «weightUnits», но не «distanceUnits»?


person IamJohnny45    schedule 29.11.2016    source источник
comment
Вы пробовали чистую сборку и перезапускали VS?   -  person 15ee8f99-57ff-4f92-890c-b56153    schedule 29.11.2016
comment
Да, я попробовал сборку-чистое решение и перезапустил VS. Я просто сделал это снова, чтобы быть уверенным. Без изменений. Существуют ли какие-либо другие процедуры восстановления или очистки типа, которые можно было бы попробовать?   -  person IamJohnny45    schedule 29.11.2016
comment
Не то чтобы я когда-либо слышал. Находится ли AppGlobalSettings в той же сборке, что и класс App?   -  person 15ee8f99-57ff-4f92-890c-b56153    schedule 29.11.2016
comment
Я не знаю, как это проверить? Я новичок в C# и Visual Studio. Кстати, в качестве теста я создал совершенно новый класс и точно так же создал его экземпляр как статический. Когда я отлаживаю, ни одно из свойств не отображается, так что, похоже, проблема с компилятором исключается. Я думаю, что это как-то связано со статичностью. Может быть, свойства должны быть созданы или что-то в этом роде...   -  person IamJohnny45    schedule 29.11.2016
comment
Это в том же проекте, я имею в виду?   -  person 15ee8f99-57ff-4f92-890c-b56153    schedule 29.11.2016
comment
Ничего общего со статическим экземпляром, это не имеет смысла. Не шанс. Также я проверил ваш точный код, и он не воспроизводился. Ничего о создании экземпляров свойств; Вы действительно имеете в виду инициализацию, верно? Но нет, отладчик видит их независимо от того, инициализированы они или нет.   -  person 15ee8f99-57ff-4f92-890c-b56153    schedule 29.11.2016
comment
Это отладчик ведет себя странно. Обычной причиной этого является то, что отладчик запускает устаревшую копию EXE-файла (или DLL, в зависимости от того).   -  person 15ee8f99-57ff-4f92-890c-b56153    schedule 29.11.2016
comment
Да, это все в одном проекте. Но дело не только в отладчике, привязка данных тоже не работает. Очищает ли устаревший exe или dll?   -  person IamJohnny45    schedule 29.11.2016
comment
Очистка должна удалять все устаревшие исполняемые файлы, но иногда это не так, например. если у вас есть веб-службы, работающие локально, или полнолуние. Запуск в отладчике означает фактически работающий исполняемый файл, включая привязки. Он может быть устаревшим по сравнению с кодом в редакторе, через который вы проходите. Моя (очень шаткая) гипотеза такова: вы добавили distanceUnits последним, и он запускает копию двоичного файла, которая его не включает.   -  person 15ee8f99-57ff-4f92-890c-b56153    schedule 29.11.2016
comment
Спасибо за ваш отзыв. Просто чтобы попытаться исключить все возможные варианты, о которых я только могу подумать, я создал новый класс TestSettings, который представляет собой упрощенную версию исходного класса. Затем я инициализировал его таким же образом, и отладчик не видит никаких общедоступных свойств (но показывает частные). Кстати, это приложение для Android, разработанное с отладкой Xamarin в эмуляторе. Может быть, это подталкивает какой-то устаревший код к эмулятору.   -  person IamJohnny45    schedule 29.11.2016
comment
Эмулятор OMG Xamarin — вам нужно поговорить с кем-то, кто действительно разбирается в этом. Я добавил тег Xamarin к вопросу. Извините, этот вопрос не в моей сфере.   -  person 15ee8f99-57ff-4f92-890c-b56153    schedule 29.11.2016
comment
Хорошо, мой проект должен быть полностью испорчен... Я закомментировал проблемный класс и создал новый с нуля. Когда я отлаживал точку останова, которая все еще была установлена ​​на закомментированной строке в старом классе, STILL прервала выполнение. Итак, что-то устаревшее или что-то еще заставляет его запускать старый код. Я думаю, что это требует нового вопроса. В очередной раз благодарим за помощь.   -  person IamJohnny45    schedule 30.11.2016
comment
Такой, какая была. Но да, блуждающие точки останова являются ключевым признаком устаревших двоичных файлов. Удачи.   -  person 15ee8f99-57ff-4f92-890c-b56153    schedule 30.11.2016


Ответы (1)


Благодаря комментариям Эда Планкетта о том, что на самом деле это проблема сборки/отладки, я смог найти решение этой проблемы, поэтому я подумал, что отвечу на свой вопрос на всякий случай, если кто-то наткнется на эту тему, хотя исходный вопрос и окончательный ответ кажется совершенно не связанным.

Мое решение было вдохновлено этим сообщением: https://forums.xamarin.com/discussion/45327/newest-version-of-code-not-always-deployed-when-debugging-from-xamarin-studio

Короче:

  1. Завершение работы Visual Studio
  2. Откройте проводник Windows и перейдите в папку с решением.
  3. Delete the contents of each of these folders:
    • Release/obj
    • Релиз/бен
    • Отладка/бен
    • Отладка/объект
  4. If your solution has multiple projects, for example if you are developing cross-platform solutions using Xamarin, you'll potentially need to do this for each project folder in the solution, e.g.:
    • projectname
    • имя проекта.Droid
    • имя проекта.iOS
    • и т. д.

Примечание. Вы могли бы подумать, что «Сборка -> Чистое решение» (или аналогичный) сделает это за вас, но это не так. Приходится заходить вручную и удалять файлы самостоятельно.

Надеюсь, это кому-то поможет, и еще раз спасибо Эду за то, что он направил меня на правильный путь.

person IamJohnny45    schedule 30.11.2016