Игнорировать исключение NullReferenceException при чтении свойств объекта
Есть ли способ направить С# для игнорирования NullReferenceException
(или любого конкретного исключения, если на то пошло) для набора операторов.
Это полезно при попытке прочитать свойства из десериализованного объекта, который может содержать в нем много нулевых объектов.
Наличие вспомогательного метода для проверки нулевого значения может быть одним из способов, но я ищу что-то близкое к "On Error Resume Next" (от VB) на блоке уровня инструкции.
РЕДАКТИРОВАТЬ: Try-Catch пропустит следующие утверждения в исключении
try
{
stmt 1;// NullReferenceException here, will jump to catch - skipping stmt2 and stmt 3
stmt 2;
stmt 3;
}
catch (NullReferenceException) { }
Например: я десериализую XML-сообщение для объекта, а затем попытаюсь получить доступ к свойству типа
Message.instance[0].prop1.prop2.ID
теперь prop2 может быть нулевым объектом (поскольку он не существует в XML-сообщении - необязательный элемент в XSD). прямо сейчас мне нужно проверить значение null для каждого элемента в иерархии, прежде чем обращаться к элементу листа. i.e Я должен проверить, если экземпляр [0], prop1, prop2 не равен null, перед доступом к "ID".
Есть ли лучший способ избежать проверки нулевого элемента для каждого элемента в иерархии?
Ответы
Ответ 1
теперь я использую обработку делегата и NullReferenceException
public delegate string SD();//declare before class definition
string X = GetValue(() => Message.instance[0].prop1.prop2.ID); //usage
//GetValue defintion
private string GetValue(SD d){
try
{
return d();
}
catch (NullReferenceException) {
return "";
}
}
Благодаря
Попробуйте каждую строку кода без отдельных блоков try-catch
для идеи
Ответ 2
Короче: нет. Перед тем, как попытаться использовать эту опцию, проверьте нулевую проверку. Одним из полезных трюков здесь могут быть методы расширения С# 3.0... они позволяют вам вызывать что-то на нулевой ссылке без ошибок:
string foo = null;
foo.Spooky();
...
public static void Spooky(this string bar) {
Console.WriteLine("boo!");
}
Кроме этого - возможно, использование условного оператора?
string name = obj == null ? "" : obj.Name;
Ответ 3
Тернарный оператор и/или? оператор может быть полезен.
Предположим, вы пытаетесь получить значение myItem.MyProperty.GetValue(), а MyProperty может быть пустым, и вы хотите по умолчанию пустую строку:
string str = myItem.MyProperty == null ? "" : myItem.MyProperty.GetValue();
Или в случае, когда возвращаемое значение GetValue равно null, но вы хотите по умолчанию что-то:
string str = myItem.MyProperty.GetValue() ?? "<Unknown>";
Это можно объединить с:
string str = myItem.MyProperty == null
? ""
: (myItem.MyProperty.GetValue() ?? "<Unknown>");
Ответ 4
try
{
// exceptions thrown here...
}
catch (NullReferenceException) { }
Ответ 5
Я бы пошел со вспомогательным методом. On Error Resume Next просто приводит к безумию.