The main difference between e != null
and e is not null
is the way the the compiler executes the comparison.
Microsoft: "The compiler guarantees that no user-overloaded equality operator == is invoked when expression x is null is evaluated."
Bottom Line: If you are writing code that you don't want to depend on someone's implementation of the !=
and ==
operators, use is null
and is not null
because it is safer.
See the following example:
public class TestObject
{
public string Test { get; set; }
// attempt to allow TestObject to be testable against a string
public static bool operator ==(TestObject a, object b)
{
if(b == null)
return false;
if(b is string)
return a.Test == (string)b;
if(b is TestObject)
return a.Test == ((TestObject)b).Test;
return false;
}
public static bool operator !=(TestObject a, object b)
{
if(b == null)
return false;
if(b is string)
return a.Test != (string)b;
if(b is TestObject)
return a.Test != ((TestObject)b).Test;
return false;
}
}
If you have code that needs to ensure that an object isn't null, using is not null
will give you better results with TestObject
than using != null
because the overload of the ==
/!=
operators is a little odd.
Console example 1:
TestObject e = null;
if(e == null)
Console.WriteLine("e == null");
if(e is null)
Console.WriteLine("e is null");
Output: e is null
Console example 2:
TestObject e = new TestObject();
if(e != null)
Console.WriteLine("e != null");
if(e is not null)
Console.WriteLine("e is not null");
Output: e is not null
Neither overloaded operator is implemented "correctly" so the Console never outputs e == null
or e != null
.