C# 4: как встроенное обнаружение нулей?

В C# 4 не было короткого пути для проверки нулевых значений, например:

if( myobject?.myproperty?.myotherproperty?.value != null )

значение возвращает null и не создает исключение.

у кого-нибудь есть ссылка на то, как использовать его или, по крайней мере синтаксис?

5 ответов


этот оператор называется безопасный оператор навигации в Groovy.

Он еще не доступен на C#, даже на C# 4.

Если достаточное количество людей покажет свою поддержку, возможно, он попадет в гипотетическую будущую версию c#...


нет, извините, ничего подобного. Они думали об этом, но это ... --1-->не.


В C# есть ?? оператор, который используется для тестирования против null. Это немного лучше, чем ? оператор.

(x ?? -1) эквивалентно (x!= null ? x: -1)


Как говорили другие, нет встроенного способа сделать это на C#. Несколько месяцев назад я написал блоге о способе сделать это с помощью выражений, с NullSafeEval метод расширения :

if (myobject.NullSafeEval(o => o.myproperty.myotherproperty.value) != null)
...

но это просто доказательство концепции, я не проверял ее тщательно, и это довольно медленно...


В C# / C++ я могу достичь этого, используя тернарный оператор, хотя код был бы отвратительным. Ты уверен, что хочешь это использовать?

if ((myobject != null ? (мой_объект.свойства myproperty != null ? (мой_объект.свойство myProperty.myotherproperty != null ? мой_объект.свойство myProperty.myotherproperty.значение: null): null): null)!= null)

class MyOtherProperty
{
    public string value;
}

class MyProperty
{
    public MyOtherProperty myotherproperty;
}

class MyObject
{
    public MyProperty myproperty;
}

мой код модульного теста:

    [TestMethod()]
    public void TestTernaryOperator()
    {
        MyObject myobject = new MyObject();
        Debug.WriteLine (string.Format ("{0}, {1}", myobject != null, myobject.myproperty != null));
        Debug.WriteLine(string.Format("IsNotNull = {0}", IsNotNull(myobject)));
        myobject.myproperty = new MyProperty();
        Debug.WriteLine (string.Format ("{0}, {1}, {2}", myobject != null, myobject.myproperty != null, myobject.myproperty.myotherproperty != null));
        Debug.WriteLine(string.Format("IsNotNull = {0}", IsNotNull(myobject)));
        myobject.myproperty.myotherproperty = new MyOtherProperty ();
        Debug.WriteLine (string.Format ("{0}, {1}, {2}, {3}", myobject != null, myobject.myproperty != null, myobject.myproperty.myotherproperty != null, myobject.myproperty.myotherproperty.value != null));
        Debug.WriteLine(string.Format("IsNotNull = {0}", IsNotNull(myobject)));
        myobject.myproperty.myotherproperty.value = "Hello world";
        Debug.WriteLine(string.Format("{0}, {1}, {2}, {3}", myobject != null, myobject.myproperty != null, myobject.myproperty.myotherproperty != null, myobject.myproperty.myotherproperty.value != null));
        Debug.WriteLine(string.Format("IsNotNull = {0}", IsNotNull(myobject)));

    }

    bool IsNotNull(MyObject myobject)
    {
        bool isNotNull = (myobject != null ? (myobject.myproperty != null ? (myobject.myproperty.myotherproperty != null ? myobject.myproperty.myotherproperty.value : null) : null) : null) != null;
        return isNotNull;
    }