C#Mitch Ответов: 2

В C# статический частный члены в Xamarin кросс-платформа XAML-кода форм приложение


После многих лет без кодирования я перезапускаю Программирование c# для своего собственного, начиная с кросс-платформенного приложения XAML.Forms. C# для меня новый язык, но с C и C++ у меня есть многолетний опыт работы.

Меня беспокоит не кодирование и тестирование моего кода, а необычное и неожиданное поведение моего окружения. После того, как у меня возникла та же проблема с моим более сложным кодом, я свел проблему к очень простым вещам вроде этого.
public class Tester
    {
        public static Tester _ttester = null;
        private static bool finit = false;

        public Tester()
        {   
            if (!finit)             // first time?
            {
                finit = true;       // first round done
                _ttester = new Tester();   // initiate a special global object for general use 
            }
        }
    }

С вызовом такого кода, как этот
static Tester tst = null;
tst = new Tester()

в начале кода моего приложения.
Приложение зависает с конструктором in "Tester", который никогда не завершается.

Что я уже пробовал:

Если я использую отладчик, устанавливая точку останова в начале моего конструктора тестера, я замечаю, что не могу просмотреть локальный статический var "finit". "Выражение не может быть оценено". И внутри программы вроде бы то же самое. С "новым тестером" конструктор вызывается рекурсивно. Но член "finit" должен защищать второго тестера, вызывающего третьего. Но отладчик показывает, что это происходит не так. Конструктор "тестер" вызывается снова и снова, никогда не прерываясь. Может быть, очень умный оптимизатор убивает мое кодирование. Я не имею ни малейшего представления и нуждаюсь в некоторой помощи.

Делая то же самое в маленьком "consoleApp" все работает так, как ожидалось. Но в моей более сложной кросс-платформенной среде это не работает. Может быть, из-за того, что вы разделили приложение на две части. Общая часть приложения и специфический код платформы. В прежние времена я мог смотреть на машинный код и видеть, что сгенерировал компилятор. Я не нашел способа увидеть что - то подобное сегодня.
Заранее спасибо.

2 Ответов

Рейтинг:
1

Super Lloyd

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

Решение 1

public class Tester
{
  readonly static Tester cTest = new Tester();
}


Решение 2
public class Tester
{
  readonly static Tester cTest;

  static Tester()
  {
    cTest = new Tester();
  }
}


Рейтинг:
0

C#Mitch

Спасибо за ваше предложение. Я действительно сделал это со статическим конструктором. Но поскольку egualy не работал, я использовал "нормальный" конструктор, чтобы сохранить все как можно более "нормальным".

После того как я проспал одну ночь, а на следующее утро мой компьютер был переведен в спящий режим, все работает так, как и ожидалось. Я только дал конструктору тестера параметр типа (int i) и изменил вызовы в соответствии с этим. Я хотел посмотреть, смогу ли я заглянуть в этот тип выражения во время отладки. Но после этого небольшого изменения все было в порядке. Перестройка не могла сильно измениться, потому что я сделал много маленьких изменений, чтобы получить какое-то решение.

После этого я убрал дополнительный параметр, добавил утром, он работает нормально.

Я действительно понятия не имею, что произошло. Сегодня, когда все работает автоматически, исправить такие проблемы очень сложно.