在C#中检查对象是否为空

315

如果一个对象为空,我希望阻止进一步的处理。

在下面的代码中,我通过以下方式检查对象是否为空:

if (!data.Equals(null))

并且

if (data != null)

然而,在 dataList.Add(data) 处我收到了一个 NullReferenceException。如果对象为空,它甚至不应该进入 if 语句!因此,我想问这种检查对象是否为空的方式是否正确:
public List<Object> dataList;
public  bool AddData(ref Object data)
    bool success = false;
    try
    {
        // I've also used "if (data != null)" which hasn't worked either
        if (!data.Equals(null))
        {
           //NullReferenceException occurs here ...
           dataList.Add(data);
           success = doOtherStuff(data);
        }
    }
    catch (Exception e)
    {
        throw new Exception(e.ToString());
    }
    return success;
}

如果这是检查对象是否为空的正确方式,那我做错了什么(如何防止在对象上进行进一步处理以避免 NullReferenceException)?


15
在抛出异常时应使用 throw e; 而不是 throw new Exception(e.ToString()); - Nix
23
在C#中,您应该始终在空值检查中使用 != null。如果对象为空,.Equals 将始终引发异常。 - Kyle Trauberman
58
@Nix:throw e; 没有太大的改善作用。另一方面,throw;... - Jon
4
@developer:e.ToString()会生成一个包含错误消息、所有InnerExceptions及堆栈跟踪的字符串,因此这是一个非常沉重的异常消息。如果您(正确地!)想要保留此信息,并且将其放在它应该的位置上,请使用简单地throw; - Jon
24
目前 try/catch 块没有任何作用。大家都在说只需使用“throw”,但是如果您对异常没有做任何处理而只是重新抛出它,那么为什么还要有 try/catch 块呢?通常情况下,您捕获异常以优雅地处理它们、清理资源(最好使用 "finally" 子句)或在重新抛出异常之前进行某种记录。但这些在此代码中都没有发生,因此根本不需要 try/catch。 - David Peterson
显示剩余5条评论
21个回答

-1
public bool IsVisible(object ClaimCount)
    {
        bool flag = true;
        #region || HIDE COLUMNS ON CONDITION BASIS
        if (!String.IsNullOrEmpty(Convert.ToString(ClaimCount)))
        {
            Int32 ClaimCnt = Convert.ToInt32(ClaimCount);
            if (ClaimCnt == 1)
            {
                flag = false;
            }
        }
        #endregion
        return flag;
    }

1
这似乎并没有回答问题,问题是关于检查引用是否为空。 - Wai Ha Lee

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接