Annotations - prodot/ReCommended-Extension GitHub Wiki
The analyzer enforces the following rules:
- Disposable* classes and (class) records should be annotated with
[MustDisposeResource]or[MustDisposeResource(false)](to indicate explicitly that objects should not be disposed). - The
[MustDisposeResource]annotation is inherited by derived types. - Constructors inherit the
[MustDisposeResource]annotation from their types. - The
[MustDisposeResource(false)]annotation is not inherited by derived types, which should be applied again. - Constructors do not inherit the
[MustDisposeResource(false)]annotation, which should be applied explicitly. - Disposable structs and (struct) records should have a constructor annotated with
[MustDisposeResource]or[MustDisposeResource(false)]. - Disposable ref structs** should also have a constructor annotated with
[MustDisposeResource]or[MustDisposeResource(false)].
* Disposable types means that the type implements the IDisposable or the IAsyncDisposable interface.
** Disposable ref structs means that the ref struct has a non-private void Dispose(), or a ValueTask DisposeAsync(), or any other non-static method annotated with [HandlesResourceDisposal]
- Pure methods and local functions should be annotated with
[Pure]. - Methods and local functions, which return values must be consumed, should be annotated with
[MustUseReturnValue]. - Methods and local functions with disposable return types* should be annotated with
[MustDisposeResource]or[MustDisposeResource(false)]. - Non-input parameters of disposable types should be annotated with
[MustUseReturnValue]or[MustUseReturnValue(false)]. - The
[MustDisposeResource]and the[HandlesResourceDisposal]annotation is inherited by overridden methods. - The
[MustDisposeResource(false)]annotation is not inherited by overridden methods, which should be applied again.
* Disposable types means that the type implements the IDisposable or the IAsyncDisposable interface, or the type is a disposable ref struct. The Task and Task<T> types are not considered disposable, however, the Task<T> and ValueTask<T> types are considered disposable when T is disposable.
Tip
A quick-fix is available to remove the invalid, redundant, and conflicting annotations.
Tip
A context action is available to apply missing annotations.
Detects redundant nullable mark applied to return types of iterator or async methods or local functions.
Tip
A quick-fix is available to remove the nullable mark.
when entity doesn't have explicit [NotNull] attribute
| Member | No annotation | Annotated with [NotNull]
|
Annotated with [CanBeNull]
|
|---|---|---|---|
| Inherited members* | not allowed 💡 | not allowed 💡 | |
| Iterator methods (not inherited*) |
[NotNull] is missing |
not allowed 💡 | |
| Async methods (not inherited*) | redundant 💡 | not allowed 💡 | |
| Other members (not inherited*, reference-type declaration) and reference-type parameters | redundant 💡 |
when explicitly marked with [CanBeNull] attribute, or checked for 'null'
| Member | No annotation | Annotated with [NotNull]
|
Annotated with [CanBeNull]
|
|---|---|---|---|
| Inherited members* | not allowed 💡 | not allowed 💡 | |
| Iterator methods (not inherited*) |
[NotNull] is missing |
not allowed 💡 | |
| Async methods (not inherited*) | redundant 💡 | not allowed 💡 | |
| Other members (not inherited*, reference-type declaration) and reference-type parameters |
[NotNull] or [CanBeNull] is missing |
* overriding or implementing interface member
Tip
A quick-fix is available to remove the annotation.
The [ItemNotNull] annotation is not allowed, if:
- the member overrides a virtual member or implements an interface member
- the type is not an
IEnumerable<T>(or any type, which implements it), aTask<T>, aValueTask<T>, or aLazy<T> - the element type
Tis not a reference type
Tip
A quick-fix is available to remove the annotation.
Shows a warning when the Justification property is missing (or empty) in the [SuppressMessage] or in the [ExcludeFromCodeCoverage] attribute.
The warning is not displayed for the unit test projects.
Note
Currently only MS-Test, NUnit, and xUnit projects are identified as unit test projects.
Shows a warning when the ReSharper inspection is suppressed within a member body (as a code comment). A method- or type-level suppression should be used instead. This also enforces to write a justification.
- Shows a warning if the
[NonNegativeValue]annotation is applied to a non-intergral numeric type. - Highlights the
[NonNegativeValue]annotation as redundant when it's applied to an unsigned numeric type or to a constant.
Tip
A quick-fix is available to remove the annotation.
- Shows a warning if the
[ValueRange(...)]annotation is applied to a non-intergral numeric type. - Shows a warning when the
fromvalue is greater than thetovalue. - Shows a warning when the
[ValueRange(...)]represents an interval, which is not compatible to the numeric type. - Highlights the
[ValueRange(...)]annotation as redundant when its range fully includes the type's range or it's applied to a constant.
Tip
A quick-fix is available to remove the annotation.
- Shows a warning when the
fromortovalue is out of the valid range for the numeric type.
Tip
A quick-fix is available to fix the invalid boundary.
- Shows a warning if the
[AttributeUsage(...)]annotation is missing.
- Shows a warning if the
[EditorBrowsable(EditorBrowsableState.Never)]annotation is missing for deconstruction methods with at least twooutparameters.
Tip
A context action is available to add the annotation.
Note
The analyzer can be configured or deactivated in the ReSharper Options or Rider Settings dialog.