Ubiquity.NET.Extensions
20.1.8-rc
See the version list below for details.
Requires NuGet 4.9.0 or higher.
dotnet add package Ubiquity.NET.Extensions --version 20.1.8-rc
NuGet\Install-Package Ubiquity.NET.Extensions -Version 20.1.8-rc
<PackageReference Include="Ubiquity.NET.Extensions" Version="20.1.8-rc" />
<PackageVersion Include="Ubiquity.NET.Extensions" Version="20.1.8-rc" />
<PackageReference Include="Ubiquity.NET.Extensions" />
paket add Ubiquity.NET.Extensions --version 20.1.8-rc
#r "nuget: Ubiquity.NET.Extensions, 20.1.8-rc"
#:package Ubiquity.NET.Extensions@20.1.8-rc
#addin nuget:?package=Ubiquity.NET.Extensions&version=20.1.8-rc&prerelease
#tool nuget:?package=Ubiquity.NET.Extensions&version=20.1.8-rc&prerelease
About
Ubiquity.NET.Extensions contains general extensions for .NET. This is a bit of a "grab bag" of functionality used by but not actually part of multiple other Ubiquity.NET projects. A core principal is that this library has NO dependencies beyond the runtime itself. That is, this library should remain at the bottom of any dependency chain.
Key support
- Computing a hash code for a ReadOnlySpan of bytes using System.IO.System.IO.Hashing.XxHash3
- DisposableAction for building actions that must occur on Dispose
- This is useful for implementing the RAII pattern in .NET.
- MustUseReturnValueAttribute that is compatible with the MustUseRetVal package.
- StringNormalizer extensions to support converting line endings of strings for interoperability across OS platforms and compatibility with "on disk" representations.
- A custom ValidatedNotNullAttribute to allow compiler to assume a parameter value is validated as not null.
- DictionaryBuilder to enable dictionary initializer style initialization of
ImmutableDictionary<TKey, TValue>with significantly reduced overhead.- This leverages an
ImmutableDictionary<TKey, TValue>.Builderunder the hood to build the dictionary. When theToImmutable()method is called the builder is converted to the immutable state without any overhead of a copy or re-construction of hash tables etc...
- This leverages an
- KvpArrayBuilder to enable initializer style initialization of
ImmutableArray<KeyValuePair<TKey, TValue>>with significantly reduced overhead.- This leverages an
ImmutableArray<T>.Builderunder the hood to build the array directly. When theToImmutable()method is called the builder is converted to the immutable state without any overhead of a copy. - Since this is an array and not a dictionary there is no overhead for allocating, initializing or copying any hash mapping for the keys.
- This leverages an
Fluent Validation
The library includes extensions that support fluent validation to allow use in property accessors and constructors that forward values to a base or another constructor. This is normally used when the value itself isn't passed on but some transformed value is.
| Method | Description |
|---|---|
ThrowIfNull() |
Thows an exception if the argument is null or returns it as-is |
ThrowIfOutOfRange() |
Thorws an exception if a value is out of the specified range |
ThrowIfNotDefined() |
Throws an exception if an enum value is undefined |
Why not PolyFill?
While it isn't impossible to make polyfill for this to work on .NET standard 2.0 it is a HUGE amount of effort to do so and there's no compelling reason to do so. Roslyn extensions/VSIX extensions are the most likely candidates left. VS extensions are shifting to external processes for extensions for this reason, leaving Roslyn generators. The bottom line is that too much of MODERN .NET and C# is incompatible with .NET Standard 2.0 that a distinct PolyFill library can only cover some of it. (Even the PolySharp generator covers only some of the missing functionality)
Runtime Dependencies
None
There are dependencies on various compile time analyzers but no runtime dependencies are allowed.
| Product | Versions Compatible and additional computed target framework versions. |
|---|---|
| .NET | 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. net9.0 was computed. net9.0-android was computed. net9.0-browser was computed. net9.0-ios was computed. net9.0-maccatalyst was computed. net9.0-macos was computed. net9.0-tvos was computed. net9.0-windows was computed. net10.0 was computed. net10.0-android was computed. net10.0-browser was computed. net10.0-ios was computed. net10.0-maccatalyst was computed. net10.0-macos was computed. net10.0-tvos was computed. net10.0-windows was computed. |
-
net8.0
- No dependencies.
NuGet packages (6)
Showing the top 5 NuGet packages that depend on Ubiquity.NET.Extensions:
| Package | Downloads |
|---|---|
|
Ubiquity.NET.Llvm.Interop
.NET Low Level Interop Bindings for Ubiquity.LibLLVM []. Direct use of this low level API is **STRONGLY** discouraged, instead you should use the Ubiquity.NET.Llvm package, which provides a full C# object model projection of the LLVM APIs on top of this library. |
|
|
Ubiquity.NET.InteropHelpers
.NET Low Level Interop support library to aid in native code interop scenarios |
|
|
Ubiquity.NET.Runtime.Utils
General use Support for interpreters/runtimes |
|
|
Ubiquity.NET.CommandLine
General use Support for Command line parsing based on System.CommandLine |
|
|
Ubiquity.NET.SrcGeneration
General use Support for Source Generators |
GitHub repositories
This package is not used by any popular GitHub repositories.
| Version | Downloads | Last Updated |
|---|---|---|
| 20.1.8 | 548 | 11/17/2025 |
| 20.1.8-rc.3 | 228 | 11/16/2025 |
| 20.1.8-rc.2 | 166 | 11/14/2025 |
| 20.1.8-rc.1 | 215 | 11/13/2025 |
| 20.1.8-rc | 271 | 11/2/2025 |
| 20.1.8-epsilon | 183 | 10/11/2025 |
| 20.1.8-delta | 257 | 9/7/2025 |
| 20.1.8-beta | 258 | 9/4/2025 |
| 20.1.8-alpha.0.2 | 536 | 7/22/2025 |
| 20.1.8-alpha.0.1 | 54 | 7/18/2025 |
| 20.1.8-alpha | 165 | 7/16/2025 |