Home » c# » What is the difference between “x is null” and “x == null”?

What is the difference between “x is null” and “x == null”?

Posted by: admin November 30, 2017 Leave a comment

Questions:

In C# 7 we can use

if (x is null) return;

instead of

if (x == null) return;

Is there any advantages to use the new way (former example) than old syntax?

Semantics is any different?

Is just a matter of taste? If not, when to use one or another.

Reference.

Answers:

For null there isn’t a difference with what we are used to with C# 6. However, things become interesting when you change null to another constant.

Take this for example:

Test(1);

public void Test(object o)
{
    if (o is 1) Console.WriteLine("a");
    else Console.WriteLine("b");
}

The test yields a. If you compare that to o == (object)1 what you would have written normally, it does make a hell of a difference. is takes in consideration the type on the other site of the comparison. That is cool!

I think the == null vs. is null constant pattern is just something that is very familiar ‘by accident’, where the syntax of the is operator and the equals operator yield the same result.


As svick commented, is null calls System.Object::Equals(object, object) where == calls ceq.

IL for is:

IL_0000: ldarg.1              // Load argument 1 onto the stack
IL_0001: ldnull               // Push a null reference on the stack
IL_0002: call bool [mscorlib]System.Object::Equals(object, object) // Call method indicated on the stack with arguments
IL_0007: ret                  // Return from method, possibly with a value

IL for ==:

IL_0000: ldarg.1              // Load argument 1 onto the stack
IL_0001: ldnull               // Push a null reference on the stack
IL_0002: ceq                  // Push 1 (of type int32) if value1 equals value2, else push 0
IL_0004: ret                  // Return from method, possibly with a value

Since we are talking about null, there is no difference since this only makes a difference on instances.