Созданная переменная не содержит никакого значения

У меня есть класс под названием ClassModel. Вот как это выглядит.

class ClassModel
{
    dynamic ConnListInstance;

    public ClassModel() {
        ConnListInstance = Activator.CreateInstance(Type.GetTypeFromProgID("PCOMM.autECLConnlist"));
    }

    public void checkCount() { //this shows a count of 0
        Console.WriteLine(ConnListInstance.Count());
    }

    public void checkCountVersionTwo() { //this shows a count of 1
        ConnListInstance = Activator.CreateInstance(Type.GetTypeFromProgID("PCOMM.autECLConnlist"));
        Console.WriteLine(ConnListInstance.Count());
    }
}

Я создал экземпляр класса на своей главной странице, объявив ClassModel obj = new ClassModel().

Но когда я пытаюсь вызвать метод checkCount, он возвращает 0 вместо 1. checkCountVersionTwo возвращает 1, но только потому, что я добавил создание экземпляра из конструктора.

Что-то не так с тем, как я создал конструктор и класс? Могу ли я узнать, почему он возвращает нулевое / пустое значение? Разве переменная ConnListInstance не должна иметь значение при создании нового объекта ClassModel?

Вы пытались установить точку останова в своем методе checkCount, чтобы узнать, какое значение имеет ConnListInstance? Также, возможно, добавить код для Activator.CreateInstance

Rafalon 02.05.2018 10:41

Я не уверен, что это то, что вы ищете, но значение ConnListInstance равно "{System .__ ComObject}". У меня тоже нет кода Activator.CreateInstance. Судя по всему, это аналог C# метода CreateObject в VB.

thecodeexplorer 02.05.2018 10:48

Скажите, если дважды звонить в checkCountVersionTwo(), у вас дважды 1 или 1 и 2?

Rafalon 02.05.2018 10:51

При двойном вызове checkCountVersionTwo () на выходе дважды будет 1.

thecodeexplorer 02.05.2018 10:54

А вы ничего не делаете между ClassModel obj = new ClassModel(); и obj.checkCountVersionTwo();?

Rafalon 02.05.2018 11:00

Да, я просто создаю новый объект ClassModel и вызываю метод checkCount.

thecodeexplorer 02.05.2018 11:01
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
0
6
90
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Ответ принят как подходящий

Это не имеет ничего общего с вашим кодом, но причина в том, как этот объект работает.

Пожалуйста, прочтите документация:

An autECLConnList object provides a static snapshot of current connections. The list is not dynamically updated as connections are started and stopped. The Refresh method is automatically called upon construction of the autECLConnList object. If you use the autECLConnList object right after its construction, your list of connections is current. However, you should call the Refresh method in the autECLConnList object before accessing its other methods if some time has passed since its construction to ensure that you have current data. Once you have called Refresh you may begin walking through the collection

(курсив мой)

Итак, решение:

public void checkCount() 
{
    ConnListInstance.Refresh();
    Console.WriteLine(ConnListInstance.Count());
}

Я пытался сделать, как вы сказали, и это помогло решить проблему. Спасибо, что осветили принцип работы метода!

thecodeexplorer 02.05.2018 11:12

Это полный код без каких-либо других манипуляций?

Объявление в соответствии с этим, кажется, так. Пожалуйста, добавьте дополнительный код для пояснения.

  1. В конструкторе у вас будет действующий экземпляр, если CreateInstance не завершится по какой-либо причине.

  2. В первом методе проверки вы получите количество объектов, которые он содержит (от времени построения до времени вызова метода).

  3. Во втором методе проверки вы воссоздаете объект и снова получаете его количество в том же блоке. Таким образом, любое возможное время для добавления объекта в список находится в конструкторе ConnListInstance.

Следовательно, для # 2 кажется, что вы манипулируете лежащими в основе данными, и, следовательно, счетчик списка отображается как 0; тогда как во время свежего строительства он отображается как 1.

Другие вопросы по теме