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.

Here’s a table describing the various mechanisms 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.
  • πŸ™ Doesn’t produce a warning even when comparing against a non-nullable value type making the code to check pointless.
  • 😐 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.
Is Not Null if(variable is object) return false
  • πŸ™‚ Triggers a warning when comparing a non-nullable value type which 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 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 prior to 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 prior to C# 7.0.
  • 😐 Since the not-equal operator can be overridden, this has the (remote) possibility of failing or introducing a performance issue.

Here’s the test source code for the first three rows:

#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

Leave a comment

Your email address will not be published. Required fields are marked *