Rotomeca.Core.Optionals
1.0.1
Prefix Reserved
dotnet add package Rotomeca.Core.Optionals --version 1.0.1
NuGet\Install-Package Rotomeca.Core.Optionals -Version 1.0.1
<PackageReference Include="Rotomeca.Core.Optionals" Version="1.0.1" />
<PackageVersion Include="Rotomeca.Core.Optionals" Version="1.0.1" />
<PackageReference Include="Rotomeca.Core.Optionals" />
paket add Rotomeca.Core.Optionals --version 1.0.1
#r "nuget: Rotomeca.Core.Optionals, 1.0.1"
#:package Rotomeca.Core.Optionals@1.0.1
#addin nuget:?package=Rotomeca.Core.Optionals&version=1.0.1
#tool nuget:?package=Rotomeca.Core.Optionals&version=1.0.1
Rotomeca.Core.Optionals
Type optionnel MayBe<T> pour C# qui représente une valeur qui peut être présente ou absente, uniformément pour tous les types, y compris dans les contextes génériques sans contrainte où T? ne permet pas de tester l'absence.
Une valeur null est toujours traitée comme absente : MayBe<T> se comporte comme Nullable<T>, mais pour n'importe quel T.
Conçu pour s'aligner avec son équivalent TypeScript MayBe<T> dans @rotomeca/utils.
Installation
dotnet add package Rotomeca.Core.Optionals
Compatibilité
| Environnement | Support |
|---|---|
| .NET Standard | 2.0, 2.1 |
| .NET | 8.0, 9.0 (10.0 si SDK disponible) |
| Source Link | ✅ (navigation vers le code depuis le débogueur) |
| Symbols | ✅ (.snupkg) |
| Nullable | ✅ (activé) |
Pourquoi MayBe<T> ?
Dans un contexte générique sans contrainte, il est impossible de tester l'absence de valeur via null :
// ❌ Ne compile pas sans contrainte where T : class
T? Find<T>(int id) { ... }
if (result == null) { ... }
// ✅ Sémantique claire, fonctionne pour tout T
MayBe<T> Find<T>(int id) { ... }
if (result.IsEmpty) { ... }
Démarrage rapide
using Rotomeca.Core.Optionals;
// Créer une instance présente
MayBe<string> some = MayBe<string>.Some("hello"); // HasValue = true
MayBe<string> fromT = "hello"; // conversion implicite
// null → toujours absent
MayBe<string> empty = MayBe<string>.Some(null); // HasValue = false
MayBe<string> empty = (string?)null; // HasValue = false
MayBe<string> empty = MayBe<string>.Null; // HasValue = false
// Vérifier la présence
if (some.HasValue)
Console.WriteLine(some.Value); // → hello
// Extraire avec fallback
string result = empty.GetValueOrDefault("fallback"); // → fallback
string lazy = empty.GetValueOrElse(() => Compute()); // évaluation différée
// Déconstruction
var (hasValue, value) = some;
Référence de l'API publique
// Factories
MayBe<T>.Some(value) // présent si value != null, absent sinon
MayBe<T>.Null // absent (= default)
// Propriétés
.HasValue // true si une valeur non nulle est présente
.IsEmpty // true si absent (!HasValue)
.Value // valeur encapsulée (default si absent)
// Extraction
.GetValueOrDefault(defaultValue?) // valeur ou fallback statique
.GetValueOrElse(Func<T?> fallback) // valeur ou résultat du délégué (lazy)
.Deconstruct(out bool, out T?) // var (has, val) = maybe;
// Conversions implicites
(MayBe<T>) ← T? // null → absent, sinon présent
(T?) ← MayBe<T> // extrait la valeur (default si absent)
// Égalité
IEquatable<MayBe<T>> // ==, !=, Equals, GetHashCode
Structure du dépôt
Rotomeca.Core.Optionals/
├── src/
│ └── Rotomeca.Core.Optionals/ # Librairie principale (MayBe<T>)
└── tests/
└── Rotomeca.Core.Tests/ # Suite de tests xUnit
Ecosystème Rotomeca
Voir la liste complète sur rotomeca-libs et les packages C# sur github ou sur nuget
Contribuer
git clone https://github.com/rotomeca-libs/core-optionals-csharp.git
cd core-optionals-csharp
dotnet restore
dotnet test
Les contributions sont les bienvenues via Pull Request sur la branche dev.
Note sur l'utilisation de l'IA
L'intégralité du code de ce projet a d'abord été écrite à la main en essayant d'avoir le C# le plus propre possible. L'IA a ensuite été utilisée pour :
- Proposer des axes d'amélioration et de refactorisation si besoin, après relecture de ses modifications par mes soins
- La documentation et les README → j'ai toujours été une bille en documentation, je trouve celle de l'IA lisible et explicite ; elle a toujours été relue et validée par mes soins
- Les tests unitaires → tester, c'est facile, mais présenter des tests unitaires, c'est complexe (de mon point de vue) ; l'IA a dans un premier temps généré les tests, je les ai parcourus pour les comprendre et les corriger au besoin
- La CI/CD → vu que ce n'est pas mon domaine, mais ça permet d'apprendre beaucoup 👍
Sa principale contribution a donc été de m'accompagner sur les points qui me sont lacunaires.
Licence
ISC © Rotomeca
| Product | Versions Compatible and additional computed target framework versions. |
|---|---|
| .NET | net5.0 was computed. net5.0-windows was computed. net6.0 was computed. 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 was computed. 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. net9.0 is compatible. 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 is compatible. 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. |
| .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.
-
net10.0
- No dependencies.
-
net8.0
- No dependencies.
-
net9.0
- No dependencies.
NuGet packages (1)
Showing the top 1 NuGet packages that depend on Rotomeca.Core.Optionals:
| Package | Downloads |
|---|---|
|
Rotomeca.Core
Méta-package Rotomeca.Core, il regroupe Collections et Optionals. |
GitHub repositories
This package is not used by any popular GitHub repositories.