Есть ли способ заставить C# игнорировать NullReferenceException (или любое конкретное исключение в этом отношении) для набора операторов.
Это полезно при попытке чтения свойств из десериализованного объекта, который может содержать много нулевых объектов.
Наличие вспомогательного метода для проверки нулевого значения может быть одним из способов, но я ищу что-то близкое к «При ошибке возобновить следующее» (из 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 для каждого элемента в иерархии, прежде чем получить доступ к элементу листа. т.е. я должен проверить, не являются ли экземпляры [0], prop1, prop2 нулевыми, прежде чем обращаться к «ID».
Есть ли лучший способ избежать проверки на null для каждого элемента в иерархии?





Короче: нет. Перед тем, как пытаться использовать ссылку, проверьте ее на нуль. Одним из полезных трюков здесь могут быть методы расширения C# 3.0 ... они позволяют по-видимому вызывать что-то по нулевой ссылке без ошибок:
string foo = null;
foo.Spooky();
...
public static void Spooky(this string bar) {
Console.WriteLine("boo!");
}
Помимо этого - возможно, какое-то использование условного оператора?
string name = obj == null ? "" : obj.Name;
try
{
// exceptions thrown here...
}
catch (NullReferenceException) { }
Тернарный оператор и / или ?? оператор может быть полезен.
Скажем, вы пытаетесь получить значение myItem.MyProperty.GetValue (), а MyProperty может иметь значение null, и вы хотите установить по умолчанию пустую строку:
string str = myItem.MyProperty == null ? "" : myItem.MyProperty.GetValue();
Или в случае, когда возвращаемое значение GetValue равно нулю, но вы хотите использовать что-то по умолчанию:
string str = myItem.MyProperty.GetValue() ?? "<Unknown>";
Это может быть объединено с:
string str = myItem.MyProperty == null
? ""
: (myItem.MyProperty.GetValue() ?? "<Unknown>");
Я бы выбрал вспомогательный метод. On Error Resume Next просто приводит к безумию.
теперь я использую делегат и обработку исключений 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 за идею