Игнорировать исключение 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 просто приводит к безумию.