代码之家  ›  专栏  ›  技术社区  ›  Zachary Scott

C 4:如何在线检测空值?

  •  6
  • Zachary Scott  · 技术社区  · 15 年前

    在C 4中,是否没有像这样检查空值的捷径:

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

    该值将返回空值,不会引发异常。

    任何人都有一个如何使用它的链接,或者至少有一个语法链接?

    5 回复  |  直到 10 年前
        1
  •  9
  •   Mark Byers    15 年前

    这个接线员叫 safe navigation operator 在Groovy。

    它在C中还不可用,甚至在C 4中也不可用。

    如果有足够多的人对它表示支持,也许它会进入一个假设的未来版本的C…

        2
  •  4
  •   Community CDub    8 年前

    不,对不起,没有这样的事。他们确实考虑过,但是 didn't make the cut .

        3
  •  2
  •   kubal5003    15 年前

    在C里还有??用于对空值进行测试的运算符。这比?操作员。

    (X)??-1)等于(x!= NULL?X:- 1)

        4
  •  2
  •   Thomas Levesque    10 年前

    正如其他人所说,在C中没有内置的方式来实现它。几个月前,我写了一篇 blog post 关于使用表达式执行此操作的方法, NullSafeEval 扩展方法:

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

    但这只是一个概念的证明,我没有彻底测试它,而且非常慢…

        5
  •  1
  •   Syd    15 年前

    在C/C/C++中,我可以使用三元算子来实现这一点,尽管代码是可怕的。你确定要用这个吗?

    如果((MyObjor)!= NULL?(myObject.myProperty!= NULL?(myobject.myproperty.myotherproperty!= NULL?myobject.myproperty.myotherproperty.value:空:空):空)!=空)

    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;
        }