C# 4: как встроить, обнаруживают для пустых указателей?

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

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

Значение возвратило бы пустой указатель и не выдало бы исключение.

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

6
задан Zachary Scott 7 June 2010 в 21:25
поделиться

5 ответов

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

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

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

9
ответ дан 8 December 2019 в 12:57
поделиться

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

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

2
ответ дан 8 December 2019 в 12:57
поделиться

Неа, извините, ничего подобного. Они рассматривали этот вариант, но он не попал в список.

4
ответ дан 8 December 2019 в 12:57
поделиться

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

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

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

2
ответ дан 8 December 2019 в 12:57
поделиться

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

if ((myobject! = Null? (Myobject.myproperty! = Null? (Myobject.myproperty.myotherproperty! = Null? Myobject.myproperty.myotherproperty.value: 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;
    }
1
ответ дан 8 December 2019 в 12:57
поделиться
Другие вопросы по тегам:

Похожие вопросы: