C # 4: как in-line обнаружить нули? - PullRequest
6 голосов
/ 08 июня 2010

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

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

Значение вернет ноль и не выдаст исключение.

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

Ответы [ 5 ]

9 голосов
/ 08 июня 2010

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

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

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

4 голосов
/ 08 июня 2010

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

2 голосов
/ 08 июня 2010

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

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

2 голосов
/ 08 июня 2010

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

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

Но это всего лишь подтверждение концепции, я не проверил ее полностью, и это довольно медленно ...

1 голос
/ 08 июня 2010

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

if ((myobject! = Null? (Myobject.myproperty! = Null? (Myobject.myproperty.myotherproperty! = Null? Myobject.myproperty.myotherproperty.value: null): null): null )! = ноль)

class MyOtherProperty
{
    public string value;
}

class MyProperty
{
    public MyOtherProperty myotherproperty;
}

class MyObject
{
    public MyProperty myproperty;
}

Тестовый код My Unit:

    [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;
    }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...