如果对象为空,我想防止对其进行进一步处理。

在下面的代码中,我检查对象是否为空:

if (!data.Equals(null))

and

if (data != null)

然而,我在datlist . 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)?


当前回答

Jeffrey L Whitledge是对的。你的' dataList ' -Object本身是空的。

您的代码还有另一个问题:您使用了ref-关键字,这意味着参数数据不能为空!MSDN说:

传递给ref形参的参数必须首先初始化。这与out不同,后者的参数在传递之前不必显式初始化

在“Object”类型中使用泛型也不是一个好主意。泛型应该避免装箱/拆箱,并确保类型安全。如果你想要一个公共类型,让你的方法泛型。最后,你的代码应该是这样的:

public class Foo<T> where T : MyTypeOrInterface {

      public List<T> dataList = new List<T>();

      public bool AddData(ref T data) {
        bool success = false;
        try {
          dataList.Add(data);                   
          success = doOtherStuff(data);
        } catch (Exception e) {
          throw new Exception(e.ToString());
        }
        return success;
      }

      private bool doOtherStuff(T data) {
        //...
      }
    }

其他回答

c# 6有单值空检查:)

之前:

if (points != null) {
    var next = points.FirstOrDefault();
    if (next != null && next.X != null) return next.X;
}   
return -1;

后:

var bestValue = points?.FirstOrDefault()?.X ?? -1;

不,你应该用!=。如果数据实际上是空的,那么你的程序将会因为试图在null上调用Equals方法而导致NullReferenceException崩溃。还要意识到,如果你特别想检查引用是否相等,你应该使用Object。方法,因为你永远不知道Equals是如何实现的。

你的程序崩溃是因为dataList是空的,因为你从来没有初始化它。

使用c#9(2020),您现在可以使用以下代码检查参数为空:

if (name is null) { }

if (name is not null) { }

你可以在这里获得更多信息

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

本例中的问题不在于数据为空。那就是dataList本身是空的。

在声明dataList的地方,应该创建一个新的List对象并将其赋值给变量。

List<object> dataList = new List<object>();