Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

What is the difference between "x is null" and "x == null"?

In C# 7, we can use

if (x is null) return; 

instead of

if (x == null) return; 

Are there any advantages to using the new way (former example) over the old way?

Are the semantics any different?

Is it just a matter of taste? If not, when should I use one over the other?

Reference: What’s New in C# 7.0.

like image 331
Maniero Avatar asked Nov 18 '16 11:11

Maniero


People also ask

Is x and x == NULL the same?

No, absolutely no performance difference.

Is NULL vs == NULL mysql?

ColumnName IS NOT Null can also be used to make sure a value is non-NULL. Show activity on this post. = NULL is used for assignment to a NULL value whereas IS NULL is used to determine whether a variable is NULL-valued.

What is difference between is NULL and NULL?

NULL is not a value, and therefore cannot be compared to another value. where x is null checks whether x is a null value. Null is a value, it's just unknown value. Like in programming languages variable can have value null.

Is NULL or equal NULL SQL?

SQL Server IS NULL / IS NOT NULL Because the NULL value cannot be equal or unequal to any value, you cannot perform any comparison on this value by using operators such as '=' or '<>'.


1 Answers

Update: The Roslyn compiler has been updated to make the behavior of the two operators the same when there is no overloaded equality operator. Please see the code in the current compiler results (M1 and M2 in the code) that shows what happens when there is no overloaded equality comparer. They both now have the better-performing == behavior. If there is an overloaded equality comparer, the code still differs.

See for older versions of the Roslyn compiler the below analysis.


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 side 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. This could change when you have overloaded the equality operator.

like image 83
Patrick Hofman Avatar answered Oct 12 '22 03:10

Patrick Hofman