Custom null checking for dependencies

Answered

In a constructor with several dependencies I typically use the context action "Introduce read only field '_dependecyName'", and then "Check parameter for null" which results in a constructor that looks like:

public Constructor(Type dependecy)
{
    _dependency = dependency ?? throw ArgumentNullException(nameof(dependency));
}

However, in my team the standard way of checking arguments for null is the following:

public Constructor(Type dependecy)
{
    _dependency = dependency.CheckForNull(nameof(dependency));
}

I have set a custom statement for Null Checking:
$EXPR$.CheckForNull($NAME$);

 

When I use the "Introduce read only field" and "Check parameter for null" context actions the resulting code looks like:

public Constructor(Type dependecy)
{
    dependency.CheckForNull(nameof(dependency));
    _dependecy = dependency;
}

Is there something I can do so that ReSharper does the check and the assignment on the same line?

7 comments
Comment actions Permalink

Hello Mccloy,

 

Thank you for contacting us.

I'd suggest you try Structural Search and Replace feature - https://www.jetbrains.com/help/resharper/Navigation_and_Search__Structural_Search_and_Replace.html.

E.g. you can search with a pattern for

 _dependecy = dependency;

string and replace it with

  _dependency = dependency.CheckForNull(nameof(dependency));

Please let me know if you have any more questions. 

Thank you.

1
Comment actions Permalink

Thanks Angelina, this works great.

One addition however, my search pattern is:

$a$ = $b$;


Where a and b are both identifiers, and the regex for a is _.+ (so that a is any variable starting with an underscore).

Is it possible to apply regex so that b matches the name of a without the underscore?

Eg.
_foo = foo; Should match, but
_foo = bar; should not match

Thanks,
Alex

0
Comment actions Permalink

Hello Alex,

 

Unfortunately, there's no way to create such pattern.

It could be possibly done if macros are implemented in Structural Search and Replace, please refer to the following request - http://youtrack.jetbrains.com/issue/RSRP-166388.

Thank you.

0
Comment actions Permalink

Hi all!

I ended up on this page, as I was looking for an option to change/extend the "Introduce read-only field 'variable'", which I suspect it is an Context Action.

As I'm dealing with a lot of new classes at the moment, it would save me a great deal of time to extend this feature, that it continues with the null check as well " ?? throw new ArgumentNullException(nameof('varialbe'));"


How is this accomplished? I have searched and looked everywhere but I cannot find this info how one change/extend this option (context action)

0
Comment actions Permalink

Hello Johan,

 

Please refer to the following help article - https://www.jetbrains.com/help/resharper/Reference__Options__Languages__CSharp__Null_Checking.html#exception_checks.

You may use predefined null-check pattern or create your own.

Thank you.

0
Comment actions Permalink

Hello Angelina,

I see what you mean, and I'm aware of this feature/function. 

But I'm interested to extend the "Introduce read-only field 'variable'". So instead of the existing result:

private readonly DbContext _context;
public TempRepository(DbContext context)
{
_context = context;
...


I would like to extend that one to this one:

private readonly DbContext _context;
public TempRepository(DbContext context)
{
_context = context ?? throw new ArgumentNullException(nameof(context));

I found very old guidelines regarding this, but it's not giving me the complete picture how I change this on my own and extend this context action.

Could you please provide me with some info regarding this?

Thank you!

0
Comment actions Permalink

Hello Johan Wilson,

Unfortunately, there is no such functionality in ReSharper. I see the following options for improving your workflow:

- If you are using C#8 and your project has nullable context enabled, then you can set the caret directly after the parameter name or parameter type and press "!";

- Or you can generate a constructor using ReSharper with the "Check parameters for null" option enabled: https://www.jetbrains.com/help/resharper/Code_Generation__Type_Constructors.html#492ce 

Hope this helps! Please let me know if you have any questions.

 

0

Please sign in to leave a comment.