代码之家  ›  专栏  ›  技术社区  ›  Nick Allen

在C中检查空值对象的最佳语法是什么#

c#
  •  4
  • Nick Allen  · 技术社区  · 17 年前

    我总是觉得写信是不对的

    if (MyObject)
        // do something
    

    或者反过来

    if (!MyObject)
        // do something
    

    if (MyObject != null)
        // do something
    
    if (MyObject == null)
        // do something
    

    有吗 非主观

    6 回复  |  直到 17 年前
        1
  •  37
  •   Community Mohan Dere    6 年前

    在C#中,你不能这样做

    if (MyObject) 
    

    查证 null s这是一个编译时错误(如果类没有隐式布尔转换运算符)。

    if (!MyObject)
    

    如果类没有重载,则也无效 operator !

    obj == null obj != null .

    总而言之,非主观原因是能够编译代码!

    更新(故事):

    很久以前,在古希腊,没有 bool 类型零被考虑 false true

    while(1) { }
    

    创建一个无限循环。

    int n  = 10;
    while (n--) { }
    

    有一个执行的循环 n

    int x = 10;
    if (x = 0) { // bug: meant to be x == 0
    }
    

    您遗漏了一个字符,并创建了一个bug(大多数现代C编译器都会在该语句上发出警告,但它仍然是有效的C)。

    这就是为什么您会看到这样的代码

    if (5 == variable) 
    
    if (NULL == pObj)
    

    在很多地方,因为它不容易出现上述错误。

    设计师们决定 要求 布尔值 表达式作为 if while ,并且不允许将类型强制转换为布尔类型(除非它们显式声明重载运算符,这是不鼓励的),以减少出错的机会。比如:

    object x = null;
    if (x) { }
    
    int y = 10;
    if (y) { }
    while (y--) { }
    

    在C中是有效的, 根本不要用C语言编译 .

        2
  •  5
  •   Daniel Daranas    17 年前

    是否有任何非主观原因

    (1)和(2)不编译的事实是一个非主观原因,足以不使用它们。

    我们剩下(3)和(4):

    if (MyObject != null)
        // do something
    
    if (MyObject == null)
        // do something
    

    这里,它取决于当MyObject为null(4)或不为null(3)时,您是否要执行某些操作。 显然,这不是一种风格选择。 总是采用同样的“风格”是荒谬的,因为如果你想要 另外

        if (MyObject == null) // style policy
        {
            // nothing here
        }
        else
        {
            // do something
        }
    

        3
  •  2
  •   Winston Smith    17 年前

    在C#中,if语句需要布尔表达式。

    因此,在上面的示例中,使用 if(myObject) if(myObject==null) .

        4
  •  2
  •   Noldorin    17 年前

    在我看来,在这种情况下,有点罗嗦是一个错误 if (MyObject) )甚至不用C语言编译。

    if (MyObject == null)
        // do something
    

    C#,除非我弄错了)是:

    if (myInt)
        // do something
    

    if (myInt > 0)
        // do something
    

    这里我总是选择第二个选项,纯粹是为了清楚(不能误认为是bool!),尽管您经常会看到前一个“隐式”签入代码。

        5
  •  1
  •   SWeko    17 年前

    如果您只想在对象为null时设置一个默认值,那么可以使用c#3.0??操作人员

    MyType _myObject
    if (SomeObject==null)
      _myObject = defaultObjectValue
    else
      _myObject = SomeObject
    

    可以写成

    _myObject = SomeObject ?? defaultObjectValue;
    

    这基本上意味着如果某个对象存在,使用它,如果它不存在,则使用默认值。

        6
  •  1
  •   Kirtan    17 年前

    null ,使用以下语法-

    if (MyObject != null)
        //Do Something.