Как избежать множественных проверок if null [дубликат]
Возможные дубликаты:
глубокая проверка нуля, есть ли лучший способ?
C # элегантный способ проверить, является ли свойство свойства null
Я должен сделать поиск в глубокой объектной модели, как это:
p.OrganisationalUnit.Parent.Head.CurrentAllocation.Person;
Есть ли в любом случае, чтобы оценить это и вернуть null, если любая из цепочек является null (organizationalunit, parent, head и т. д.), без необходимости делать
if (p.org == null && p.org.Parent == null && p.org.Parent.Head . . .
5 ответов:
Вы ищете null-безопасный оператор разыменования
?.(Также известный как безопасная навигация), который есть в некоторых языках (например, Groovy), но, к сожалению, в C# нет этого оператора.Надеюсь, что однажды это будет реализовано....
См.такжеэтот пост Эрика Липперта. Синтаксис, который он предлагает, есть
.?.
Слышали ли вы о законе Деметры?
Цепочка таких длинных последовательностей вызовов не является хорошей идеей. Это создает ужасные зависимости между классами, которые вам не нужны.В вашем примере класс, содержащий
p, становится зависимым от пяти других классов. Я предлагаю вам упростить свой код и сделать так, чтобы каждый класс проверял наличие нулей на одном уровне, в своем собственном контексте знаний.
ПроверьтеЭту статью . Это отличное решение, которое позволяет вам писать такие вещи:
p.With(x => x.OrganisationalUnit) .With(x => x.Parent) .With(x => x.Head) .With(x => x.CurrentAllocation .With(x => x.Person);
Чтобы ответить на вопрос в вашем названии, вы можете избежать, применив "закон Деметры" и создав метод под названием GetHeadOfParentOrganizationalUnit ()
Я не уверен, что решение применимо к вашему конкретному случаю, но стоит посмотреть, можете ли вы устранить все эти пустые проверки.
Смотрите также: Ссылка
Вы также можете использовать базовую обработку исключений, чтобы поймать это. Я не в восторге от этого решения, но это вариант. Если эти вложенные нули являются нормальной операцией, исключения, вероятно, не являются правильным ответом:
public class A { } public class B { public A a; } public class C { public B b; } class Program { static A GetA(C c) { A myA; try { myA = c.b.a; } catch { myA = null; } return myA; } static void Main(string[] args) { C theC = new C(); theC.b = new B(); theC.b.a = new A(); A goodA = GetA(theC); if (goodA != null) { Console.WriteLine("Expected nominal path."); } else { Console.WriteLine("Unexpected nominal path."); } theC.b.a = null; A badA = GetA(theC); if (badA == null) { Console.WriteLine("Expected off-nominal path."); } else { Console.WriteLine("Unexpected off-nominal path."); } } }
Comments