Reden Rodriguez Ответов: 1

Как исправить очень простой экземпляр объекта?


Привет, ребята, у меня есть этот код, и он заставляет меня бросать экземпляр, и я не знаю почему, как я могу сделать это нормально?
(Owner as ReadBarCodeInMenu).btnContainerInquiry.Enabled = true;


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

я попробовал этот код
var menu = new ReadBarCodeInMenu();
но он говорит мне, что я не могу использовать varialbe как тип, и я попытался сделать свой код в новой форме 2, и он работает совершенно нормально, но когда я помещаю его в свою систему, он выдает мне ошибку.

1 Ответов

Рейтинг:
4

Afzaal Ahmad Zeeshan

В строке, которую вы показали,

(Owner as ReadBarCodeInMenu).btnContainerInquiry.Enabled = true;
Есть 2 случая, когда это исключение может быть выброшено. Первый,
(Owner as ReadBarCodeInMenu).btnContainerInquiry./* code */
После того, как вы отлили Owner как ReadBarCodeInMenu, если это значение равно нулю, то btnContainerInquiry, будет недоступна и, таким образом, а NullReferenceException Но на этом все не заканчивается, если владельцем объекта был именно он—поскольку вы предполагаете, что вы пытались инициализировать меню на что-то, хотя объект, на который ссылаются, является владельцем, но все же—второй вызов обновления свойства вызовет исключение,
/* code */.btnContainerInquiry.Enabled = true;
Это потому, что, может быть, btnContainerInquiry не содержит экземпляра. Так что там тоже требуется новый! Наконец, Enabled недвижимость, скорее всего, является boolean поле, и это структура, которая не содержит нулевого значения.

Теперь давайте разберем проблему и попробуем ее решить. Проблема в неинициализированном сообщении памяти заключается в том, что оно говорит вам, что что-то не так, но не может легко помочь вам с отладкой, особенно с такими операторами, как ваш. Ваш код хотя и сильно оптимизирован, но не безопасен. Вы можете переписать его вот так,
var btnContainer = (Owner as ReadBarCodeInMenu)?.btnContainerInquiry;
if(btnContainer != null) {
   btnContainer.Enabled = true;
} else {
   // Why was the btnContainer null?
}
Это предотвратит возникновение исключения, и вы сможете продолжить работу с вашим кодом, а также игнорировать эти исключения. Этот метод использует функции C#для безопасной навигации по объектам и прерывания, как только объект становится нулевым, вместо того чтобы создавать исключение во время выполнения.

Пожалуйста, прочтите здесь больше об этом,
Нуль-условных операторов (Справочник по c#) | Майкрософт документы[^]


BillWoodruff

+5 потрясающе !

Afzaal Ahmad Zeeshan

Спасибо, Билл!