ReSharper 2018.1 Help

Null Checking

ReSharper | Options | Code Editing | C# | Null Checking

Use this page to customize generating null-checking routines for exceptions and assertions.

Null checks for exceptions and assertions

There are situations when encountering an object that is a null reference is critical in your program and should be either logged or signalled by throwing an exception. A typical example here is throwing an ArgumentNullException in a function that is not designed to accept null objects.

Generating null checks for exceptions and assertions

You can generate these kinds of null checks in the following ways:

Press Alt+Enter on a parameter or expression and choose the corresponding context action:

If a parameter is marked with the [NotNull] attribute, you can set the caret directly after the parameter name or parameter type and press !:

To generate an assertion for null for any nullable expression, ReSharper provides the Assert expression for null action on Alt+Enter. Depending on the nullability analysis settings, it appears as a quick-fix or a context action. This action becomes unavailable if ReSharper infers that the expression can never be null.

If you use code annotations in your project, ReSharper will decorate parameters, which you check for null, with the [NotNull] attribute. This will let ReSharper notify you when null objects are passed to the decorated parameters. You can disable adding [NotNull] by clearing the Automatically propagate annotations check box on the Code Inspection | Code Annotations page of ReSharper options.

Configuring null checks for exceptions and assertions

This kind of null checks can be written in different ways, so they are configurable on the Code Editing | C# | Null checking page of ReSharper options, which is also accessible from the Alt+Enter menu on the corresponding actions:

This options page lists all predefined null-checking patterns in the priority order with higher priority patterns shown on the top. When ReSharper generates a null check, it will take the highest-priority pattern which semantically suits the context, taking into account the current C# version. By default, ReSharper automatically detects C# version based on the associated compiler. However, you can specify the target C# version explicitly — right-click on the project in the Solution Explorer, choose Edit project item properties from the context menu and use the C# Language Level selector..

For example, with the default configuration the 'throw expression' pattern ($EXPR$ ?? new System.ArgumentNullException($NAME$);) has higher priority than the 'classic' throw statement (if ($EXPR$ == null) throw new System.ArgumentNullException($NAME$);). But if expressions are not allowed in the current context, ReSharper will skip the first and use the second pattern:

// Press Alt+Enter on 'arg' and choose 'Check parameter for null'privatevoidFoo(objectarg){// as expression is not allowed here, the statement is generated:if(arg==null)thrownewArgumentNullException(nameof(arg));}// However, in the following case the expression is already thereprivateobjectmyField;privatevoidFoo(objectarg){myField=arg;}// so ReSharper will use the first pattern:privateobjectmyField;privatevoidFoo(objectarg){myField=arg??thrownewArgumentNullException(nameof(arg));}

The same applies to generating assertions: ReSharper will use the first pattern that is marked with Can use for assertion.

If you have any preferences for generating null checks, use the Move up (Alt+U)/ Move down (Alt+D) buttons on the options page to raise the priority of patterns that you prefer.

Creating custom null checks for exceptions and assertions

If your codebase provides dedicated helper methods for handling null checks, you may want to create your own null-checking patterns by editing the two custom patterns that are highlighted in bold on the options page — Custom (statement) and Custom (expression):

By default, these two patterns have the lowest priority, meaning that they will never be used for generation. So if you are going to use them, move them up to raise their priority.

When a custom pattern is selected in the list, you can edit it in the text field on the bottom of the page using the $EXPR$, $NAME$, $MESSAGE$ placeholders. As long as the pattern is valid, ReSharper will display the corresponding icon below the text field. You can also tick the Can use for assertion check box to make the pattern work with the Assert expression for null action.