StaticDotNet.ArgumentValidation
1.0.0
dotnet add package StaticDotNet.ArgumentValidation --version 1.0.0
NuGet\Install-Package StaticDotNet.ArgumentValidation -Version 1.0.0
<PackageReference Include="StaticDotNet.ArgumentValidation" Version="1.0.0" />
paket add StaticDotNet.ArgumentValidation --version 1.0.0
#r "nuget: StaticDotNet.ArgumentValidation, 1.0.0"
// Install StaticDotNet.ArgumentValidation as a Cake Addin #addin nuget:?package=StaticDotNet.ArgumentValidation&version=1.0.0 // Install StaticDotNet.ArgumentValidation as a Cake Tool #tool nuget:?package=StaticDotNet.ArgumentValidation&version=1.0.0
StaticDotNet.ArgumentValiation is a nullability annotation supported fluent guard library with performance and ease of use in mind.
Supports:
- Nullability
- CallerArgumentExpressionAttribute
- Span/ReadOnlySpan
- Trimming
Installation
Package can install via NuGet and can be found at https://www.nuget.org/packages/StaticDotNet.ArgumentValidation.
Nullability annotations makes guard clauses pointless
While nullability annontations is a huge step forward in helping us developers write better applications (which we don't need as we get it right 100% of the time), it doesn't replace the need for guard clauses. And most of the guard libraries aren't able to fully support nullability annotations, which means you have to constantly ignore those warnings which really makes nullability annotations less helpful. And without them you have a bigger chance of getting the fun "Object not set to an instance of an object" error. If you haven't had to look at the stack trace, open a method of over 500 lines of code and tried to figure out what could possible be null in some random situation, you haven't lived.
If you are writing libraries that other developers/applications are using, your code has no way of knowing if nullability annontations are turned on. Or worse case those warnings are just ignored anyway. Not you of course, you are one of the good developers, hence why you are here.
Lastly nullability annotations only help with checking for null. It doesn't help with the other requirements that parameters have.
This is what validation is for
Validation is focused on the end user, guard clauses are focused on developers. This is a big difference and why guard clauses are still important. The point of a guard clause is to prevent a developer from doing something that will always result in an issue with the application. Validation is focused on helping the end user accomplish a specific work flow based on the business requirements while adhering to the limitations of the application. Both are important, but serve completely different purposes.
Performance
Since the point of guard clauses are to ensure the developer doesn't write bad code, ideally they should never throw an exception. This library is built around the idea that it should be just as fast as possible and avoid allocating any memory with the idea that the exception will not happen.
It also uses a readonly ref struct so as much as possible stays on the stack without copying the struct on every call.
Trimming
The library includes the specific attributes and analyzers to ensure it can be trimmed. This allows you to only include the validations that are used within you application when you enable trimming.
Writing guard clauses are ugly
Yes, writing guard clauses are ugly and they take up a lot of space. We all agree they are important but they take up too many lines of code and are ugly. Ok, maybe you don't agree, yet, but drink the Kool-Aid and I promise no space ships are involved.
The library is built using fluent syntax as that allows the developer a lot of flexibility with how they want to combine different argument validation. It is also built to only show the available validation methods for the specific argument type.
Documentation
All documentation can be found at here.
Release Notes
0.5.1
- Performance improvements for Array and String validation checks.
0.5.2
- Moved exception messages to resource file.
- Replaced Writable/Readable with CanWrite/CanRead and marked existing obsolete.
- Added CanSeek.
0.5.3
- Updated exception messages to include more information.
0.6.0
- Added ASCII digit and letter checks for char and string (.NET 7.0).
0.6.1
- Update Arg.Is to only accept structs since it is always best to still check for null with reference types.
0.6.2
- Added checks for validating the scale of decimal types (.NET 7.0).
0.6.3
- Added checks for upper case/lower case strings.
0.6.4
- Added checks for upper case/lower case ASCII strings (.NET 7.0).
0.6.5
- Added check for not same.
1.0.0
- Added support for .NET 8.0
- Used CompositeFormat to increase performance for formatting exception messages
- Removed support for .NET 5.0 since it is no longer supported.
Product | Versions Compatible and additional computed target framework versions. |
---|---|
.NET | net5.0 was computed. net5.0-windows was computed. net6.0 is compatible. net6.0-android was computed. net6.0-ios was computed. net6.0-maccatalyst was computed. net6.0-macos was computed. net6.0-tvos was computed. net6.0-windows was computed. net7.0 is compatible. net7.0-android was computed. net7.0-ios was computed. net7.0-maccatalyst was computed. net7.0-macos was computed. net7.0-tvos was computed. net7.0-windows was computed. net8.0 is compatible. net8.0-android was computed. net8.0-browser was computed. net8.0-ios was computed. net8.0-maccatalyst was computed. net8.0-macos was computed. net8.0-tvos was computed. net8.0-windows was computed. |
.NET Core | netcoreapp2.0 was computed. netcoreapp2.1 was computed. netcoreapp2.2 was computed. netcoreapp3.0 was computed. netcoreapp3.1 was computed. |
.NET Standard | netstandard2.0 is compatible. netstandard2.1 is compatible. |
.NET Framework | net461 was computed. net462 was computed. net463 was computed. net47 was computed. net471 was computed. net472 was computed. net48 was computed. net481 was computed. |
MonoAndroid | monoandroid was computed. |
MonoMac | monomac was computed. |
MonoTouch | monotouch was computed. |
Tizen | tizen40 was computed. tizen60 was computed. |
Xamarin.iOS | xamarinios was computed. |
Xamarin.Mac | xamarinmac was computed. |
Xamarin.TVOS | xamarintvos was computed. |
Xamarin.WatchOS | xamarinwatchos was computed. |
-
.NETStandard 2.0
- No dependencies.
-
.NETStandard 2.1
- No dependencies.
-
net6.0
- No dependencies.
-
net7.0
- No dependencies.
-
net8.0
- No dependencies.
NuGet packages
This package is not used by any NuGet packages.
GitHub repositories
This package is not used by any popular GitHub repositories.
Version | Downloads | Last updated |
---|---|---|
1.0.0 | 529 | 11/16/2023 |
0.6.5 | 691 | 7/31/2023 |
0.6.4 | 692 | 5/30/2023 |
0.6.3 | 694 | 5/29/2023 |
0.6.2 | 641 | 5/25/2023 |
0.6.1 | 679 | 5/19/2023 |
0.6.0 | 675 | 5/2/2023 |
0.5.3 | 696 | 4/7/2023 |
0.5.2 | 831 | 1/6/2023 |
0.5.1 | 822 | 12/22/2022 |
0.5.0 | 801 | 12/21/2022 |
0.4.0 | 821 | 12/20/2022 |
0.3.0 | 820 | 12/16/2022 |
0.2.0 | 802 | 12/16/2022 |
0.1.0 | 826 | 12/8/2022 |
See README for release notes.