Частичное Создание Экземпляра

#c#

Вопрос:

Это скорее вопрос терминологии, чем того, как что-то сделать.

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

Пример: Работа с системой.Диагностика.Процесс открытия виртуальной клавиатуры, OSK. Мне нужна процедура для включения и выключения клавиатуры. Это отлично работает.

 using System.Diagnostics;

namespace Bsc
{
    public static class OnScreenKeyboard
    {
        private static Process virtualKeyboard = new Process();
        public static void ToggleHideShow()
        {
            try
            {
                if (virtualKeyboard.HasExited)
                    virtualKeyboard = Process.Start("osk.exe");
                else
                    virtualKeyboard.Kill();
            }
            catch
            {
                virtualKeyboard = Process.Start("osk.exe");
            }
        }
    }
} 

Глядя на объект virtualKeyboard в окне просмотра, я вижу, как был создан экземпляр virtualKeyboard, но не полностью. На первом проходе виртуальная доска.HasExited выдает исключение. Наблюдая за окном часов, также кажется, что его там нет. Перед линией есть красивая ярко — красная точка с крестиком.

Имя Ценность Тип
HasExited — Виртуальная доска.HasExited» выдал исключение типа » Система.Исключение недействительной операции’ bool {Система.Исключение недействительной операции}

Все еще при первом прохождении try/catch переходит к процессу.Начать. После этого строка выглядит так, как вы ожидали бы для созданного свойства.

Имя Ценность Тип
HasExited ложный тип bool

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

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

Ответ №1:

Согласно документации, HasExited свойство выдает InvalidOperationException , когда с экземпляром не связан процесс операционной Process системы.

Ваше свойство инициализируется новым экземпляром Process класса, который еще не был запущен. Таким образом, с этим экземпляром не связан процесс операционной системы, и HasExited свойство вызовет исключение.

Удалите инициализатор поля и проверьте null его в своем методе.

 public static class OnScreenKeyboard
{
    private static Process virtualKeyboard;
    public static void ToggleHideShow()
    {
        try
        {
            if (virtualKeyboard == null || virtualKeyboard.HasExited)
                virtualKeyboard = Process.Start("osk.exe");
            else
                virtualKeyboard.Kill();
        }
        catch
        {
            virtualKeyboard = Process.Start("osk.exe");
        }
    }
}
 

Комментарии:

1. Итак, так, как у меня было, объект HasExited создан. Я уже просматривал документ, на который вы ссылались раньше. Перечитав его еще раз, несмотря на то, что он является bool, он может иметь 5 различных состояний: True, False и 3 различных исключения. Я никогда не думал об исключениях как о разных состояниях. В этом есть смысл. Я хочу сказать, что исключения могут быть похожи на разные нули, но действительно съеживаются от этого утверждения.

Ответ №2:

Невозможно, чтобы объект был наполовину инициализирован в зависимости от работы языка. Если объект находится в неправильном состоянии, это связано с работой класса/свойств и т. Д., А также с тем, как был написан код для инициализации объекта или исключения при доступе к свойствам.

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