#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:
Невозможно, чтобы объект был наполовину инициализирован в зависимости от работы языка. Если объект находится в неправильном состоянии, это связано с работой класса/свойств и т. Д., А также с тем, как был написан код для инициализации объекта или исключения при доступе к свойствам.
Если объект не всегда делает то, что вы ожидаете, вам нужно проверить наличие исключения, выполнить защитное кодирование и обработать различные сценарии в своем собственном коде.