csharp / expert
Snippet
Algebraische Datentypen via generische Structs
Obwohl C# noch keine nativen Discriminated Unions besitzt, können generische Readonly-Structs diese emulieren, um eine typsichere Fehlerbehandlung zu ermöglichen. Dieses 'Result'-Muster zwingt den Aufrufer, potenzielle Fehlerpfade zu berücksichtigen, wodurch die Abhängigkeit von Ausnahmen für den Kontrollfluss verringert wird. Die Verwendung eines Structs vermeidet Heap-Allokationen und macht es extrem effizient für Hochdurchsatz-Logik.
snippet.cs
csharp
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
public readonly struct Result<T, TError>{private readonly T? _value;private readonly TError? _error;public bool IsSuccess { get; }private Result(T value) => (IsSuccess, _value, _error) = (true, value, default);private Result(TError error) => (IsSuccess, _value, _error) = (false, default, error);public static Result<T, TError> Success(T value) => new(value);public static Result<T, TError> Failure(TError error) => new(error);public TResult Match<TResult>(Func<T, TResult> onSuccess, Func<TError, TResult> onFailure) =>IsSuccess ? onSuccess(_value!) : onFailure(_error!);}
Erklärung
1
public readonly struct Result<T, TError>
Garantiert Unveränderlichkeit und Null-Allokation auf dem Heap bei der Übergabe als Wert.
2
public TResult Match<TResult>(...)
Implementiert funktionales Pattern Matching und stellt sicher, dass sowohl Erfolgs- als auch Fehlerfälle behandelt werden.