Как избежать множественных проверок 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 . . .     
623   5  

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

    Ничего не найдено.