Determine Which Mechanism Is Most Effective to Check for Null
It turns out there are numerous ways to check for null or not null, which begs the question, which should you use?
Not surprisingly, it depends.
Null/Not Null Mechanisms Table
Here’s a table describing the various mechanisms to check for null and their advantages and disadvantages.
Check For | Code Checks For Null | Description |
---|---|---|
Is Null | if(variable is null) return true; | This syntax supports static analysis such that later code will know whether variable is null or not. Requires C# 7.0 because it leverages type pattern matching. |
Is Not Null | if(variable is { }) return false | This syntax supports static analysis such that later code will know whether variable is null or not. Requires C# 8.0 since this is the method for checking for not null using property pattern matching. Doesn’t produce a warning even when comparing against a non-nullable value type making the code to check pointless. |
Is Not Null | if(variable is object) return false | Triggers a warning when comparing a non-nullable value type that could never be null This syntax works with C# 8.0’s static analysis, so later code will know that variable has been checked for null. Checks if the value is not null by testing whether it is of type object. (Relies on the fact that null values are not of type object.) |
Is Null | if(variable == null) return true | The only way to check for null before C# 7.0. However, because the equality operator can be overridden, this has the (remote) possibility of failing or introducing a performance issue. |
Is Not Null | if(variable != null) return false | The only way to check for not null before C# 7.0. Since the not-equal operator can be overridden, this has the (remote) possibility of failing or introducing a performance issue. |
Test Source Code
#nullable enable
string ? nullableText = "Inigo";
Assert.IsTrue(nullableText is object && nullableText is {});
nullableText = null;
Assert.IsFalse(nullableText is object || nullableText is {});
string notNullableText = "Inigo";
Assert.IsTrue(notNullableText is object && notNullableText is {});
notNullableText = null!; // Initentionally ignore the null assignment
Assert.IsFalse(notNullableText is object || notNullableText is {});
int ? nullableNumber = 42;
Assert.IsTrue(nullableNumber is object && nullableNumber is {});
nullableNumber = null;
Assert.IsFalse(nullableNumber is object || nullableNumber is {});
int notNullableNumber = 42;
Assert.IsTrue(
// CS0183 - The given expression is always of the provided('object') type
#pragma warning disable 0183 notNullableNumber is object #pragma warning restore 0183 &&
notNullableNumber is {});
// notNullableNumber = null;
// Error: Can't assing null to non-nullable value type
Code language: PHP (php)
Ready for More?
Check out this video on the improvements and new features released in C# 9.0!
Does Your Organization Need a Custom Solution?
Let’s chat about how we can help you achieve excellence on your next project!
Comments are closed.