Checking if an object is null in C#

前端 未结 18 1768
情深已故
情深已故 2020-11-28 02:12

I would like to prevent further processing on an object if it is null.

In the following code I check if the object is null by either:

if (!data.Equal         


        
相关标签:
18条回答
  • 2020-11-28 02:38

    [Edited to reflect hint by @kelton52]

    Simplest way is to do object.ReferenceEquals(null, data)

    Since (null==data) is NOT guaranteed to work:

    class Nully
    {
        public static bool operator ==(Nully n, object o)
        {
            Console.WriteLine("Comparing '" + n + "' with '" + o + "'");
            return true;
        }
        public static bool operator !=(Nully n, object o) { return !(n==o); }
    }
    void Main()
    {
        var data = new Nully();
        Console.WriteLine(null == data);
        Console.WriteLine(object.ReferenceEquals(null, data));
    }
    

    Produces:

    Comparing '' with 'Nully'

    True

    False

    0 讨论(0)
  • 2020-11-28 02:41

    As others have already pointed out, it's not data but rather likely dataList that is null. In addition to that...

    catch-throw is an antipattern that almost always makes me want to throw up every time that I see it. Imagine that something goes wrong deep in something that doOtherStuff() calls. All you get back is an Exception object, thrown at the throw in AddData(). No stack trace, no call information, no state, nothing at all to indicate the real source of the problem, unless you go in and switch your debugger to break on exception thrown rather than exception unhandled. If you are catching an exception and just re-throwing it in any way, particularly if the code in the try block is in any way nontrivial, do yourself (and your colleagues, present and future) a favor and throw out the entire try-catch block. Granted, throw; is better than the alternatives, but you are still giving yourself (or whoever else is trying to fix a bug in the code) completely unnecessary headaches. This is not to say that try-catch-throw is necessarily evil per se, as long as you do something relevant with the exception object that was thrown inside the catch block.

    Then there's the potential problems of catching Exception in the first place, but that's another matter, particularly since in this particular case you throw an exception.

    Another thing that strikes me as more than a little dangerous is that data could potentially change value during the execution of the function, since you are passing by reference. So the null check might pass but before the code gets to doing anything with the value, it's changed - perhaps to null. I'm not positive if this is a concern or not (it might not be), but it seems worth watching out for.

    0 讨论(0)
  • 2020-11-28 02:42

    With c#9 (2020) you can now check a parameter is null with this code:

    if (name is null) { }
    
    if (name is not null) { }
    

    You can have more information here

    0 讨论(0)
  • 2020-11-28 02:43

    I just followed a method that we would usually follow in java script. To convert object to string and then check whether they are null.

    var obj = new Object();
    var objStr = obj.ToString();
    if (!string.IsNullOrEmpty(objStr)){
      // code as per your needs
    }
    
    0 讨论(0)
  • 2020-11-28 02:44

    You can try like below

    public List<Object> dataList;
    public  bool AddData(ref Object data)
    bool success = false;
    try
    {
        if (data != null)
        {
           dataList.Add(data);
           success = doOtherStuff(data);
        }
    }
    catch (Exception e)
    {
        throw new Exception(e.ToString());
    }
    return success;
    

    }

    0 讨论(0)
  • 2020-11-28 02:47

    Jeffrey L Whitledge is right. Your `dataList´-Object itself is null.

    There is also another problem with your code: You are using the ref-keyword, which means the argument data cannot be null! The MSDN says:

    An argument passed to a ref parameter must first be initialized. This differs from out, whose arguments do not have to be explicitly initialized before they are passed

    It's also not a good idea to use generics with the type `Object´. Generics should avoid boxing/unboxing and also ensure type safety. If you want a common type make your method generic. Finally your code should look like this:

    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) {
            //...
          }
        }
    
    0 讨论(0)
提交回复
热议问题