Sammlungen filtern mit LINQ
LINQ (Language Integrated Query) bietet eine leistungsstarke, deklarative Möglichkeit, Sammlungen zu bearbeiten. Auf mittlerem Niveau werden mehrere Operatoren verkettet, um Daten effizient zu tran…
Snippet öffnen →Lies diese C#-Snippets für Fortgeschrittene Zeile für Zeile — jedes kommt mit einer Erklärung, was der Code tut und warum.
LINQ (Language Integrated Query) bietet eine leistungsstarke, deklarative Möglichkeit, Sammlungen zu bearbeiten. Auf mittlerem Niveau werden mehrere Operatoren verkettet, um Daten effizient zu tran…
Snippet öffnen →Die Verwendung von async/await ermöglicht es der Anwendung, während I/O-gebundener Operationen reaktionsfähig zu bleiben, indem die Kontrolle an den Aufrufer zurückgegeben wird, während auf den Abs…
Snippet öffnen →Exception-Filter ermöglichen es, eine Ausnahme nur dann abzufangen, wenn eine bestimmte Bedingung erfüllt ist. Dies ist sauberer als Abfangen und erneutes Werfen, da der Stack nicht unnötig abgebau…
Snippet öffnen →Records sind Referenztypen, die integrierte Funktionen zur Kapselung von Daten bieten. Sie verwenden wertebasierte Gleichheit und unterstützen zerstörungsfreie Mutation über den 'with'-Ausdruck.
Snippet öffnen →Switch-Ausdrücke bieten eine prägnantere Syntax für Pattern Matching. Sie ermöglichen es, Objekteigenschaften direkt zu prüfen und einen Wert basierend auf dem ersten Treffer zurückzugeben.
Snippet öffnen →Indexer ermöglichen es, Instanzen einer Klasse oder Struktur wie Arrays zu indizieren. Dies ist nützlich für Klassen, die eine Datensammlung darstellen oder Zugriff auf interne Puffer bieten.
Snippet öffnen →Das IDisposable-Interface wird verwendet, um einen Mechanismus zum Freigeben nicht verwalteter Ressourcen bereitzustellen, wie z. B. Datei-Handles oder Datenbankverbindungen, die der Garbage Collec…
Snippet öffnen →Erweiterungsmethoden ermöglichen es, Methoden zu bestehenden Typen 'hinzuzufügen', ohne einen neuen abgeleiteten Typ zu erstellen oder den Originaltyp zu ändern. Sie werden als statische Methoden i…
Snippet öffnen →Die 'yield return'-Anweisung gibt an, dass die Methode ein Iterator ist. Sie liefert einen Wert an den Enumerator, ohne die gesamte Sammlung sofort im Speicher zu erstellen, was eine effiziente Ver…
Snippet öffnen →Generic Constraints ermöglichen es, die Typen einzuschränken, die als Argumente für einen Typparameter verwendet werden können. Durch 'where T : class, new()' stellen wir sicher, dass T ein Referen…
Snippet öffnen →Lokale Funktionen ermöglichen es, Methoden innerhalb des Gültigkeitsbereichs einer anderen Methode zu definieren. Dies ist nützlich für Hilfslogik, die für andere Klassenmitglieder nicht zugänglich…
Snippet öffnen →Middleware-Muster ermöglichen es, Verhaltensweisen um eine Kernlogik zu verketten. Diese Implementierung verwendet Delegaten und Funktionen höherer Ordnung, um einen Handler zu umschließen – ein gä…
Snippet öffnen →Die Verwendung von Schnittstellen ermöglicht Dependency Injection, was für Unit-Tests entscheidend ist. Durch die Abhängigkeit von IEmailService anstelle einer konkreten Klasse können Sie in Tests…
Snippet öffnen →PBKDF2 ist ein Standard für sicheres Passwort-Hashing. Es wendet eine Pseudozufallsfunktion viele Male auf das Passwort zusammen mit einem Salt an, was Brute-Force-Angriffe erheblich erschwert.
Snippet öffnen →Switch-Ausdrücke bieten eine prägnante Möglichkeit, Werte basierend auf Pattern Matching zurückzugeben. Im Gegensatz zu herkömmlichen Switch-Anweisungen sind sie Ausdrücke, die ein Ergebnis liefern…
Snippet öffnen →Span<T> stellt einen zusammenhängenden Speicherbereich dar. Es ermöglicht Hochleistungsoperationen wie das Slicing von Arrays, ohne teure Kopien zu erstellen. Dies ist besonders nützlich in leistun…
Snippet öffnen →In Sicherheitskontexten wie dem Passwort-Hashing muss der Vergleich von Bytes immer die gleiche Zeit in Anspruch nehmen, unabhängig davon, ob die Arrays übereinstimmen. Eine Standard-'Equals'-Metho…
Snippet öffnen →Indem Sie im Konstruktor ein Interface anstelle einer konkreten Klasse verlangen, entkoppeln Sie die Geschäftslogik von der Infrastruktur. Dies ermöglicht Unit-Tests, da Sie eine 'Mock'-Implementie…
Snippet öffnen →Dieses Snippet zeigt die Verwendung von lokalen Funktionen innerhalb einer Methode, um Operationen auf einem mehrdimensionalen Array durchzuführen. Lokale Funktionen sind nützlich für die Kapselung…
Snippet öffnen →Positionale Muster ermöglichen den Abgleich von Objekten basierend auf ihren dekonstruierten Komponenten. Dies funktioniert automatisch mit Records oder Klassen, die eine Deconstruct-Methode implem…
Snippet öffnen →Durch die Übergabe eines Delegaten wie Func<string, bool> in eine Methode können Sie die Validierungslogik von der Ausführungslogik entkoppeln. Dieses Muster erleichtert Unit-Tests, da Sie 'Mock'-V…
Snippet öffnen →Das IDisposable-Muster ist ein grundlegendes Muster zur Verwaltung von Speicher und nicht verwalteten Ressourcen. Es stellt sicher, dass Ressourcen deterministisch freigegeben werden, anstatt auf d…
Snippet öffnen →Das Verständnis der manuellen Implementierung generischer Transformationen auf Arrays hilft beim Meistern von Generika und Funktionsdelegaten. Dieser Ansatz vermeidet Overhead durch externe Bibliot…
Snippet öffnen →Property-Muster ermöglichen es, die Eigenschaften eines Objekts gegen spezifische Werte oder Bereiche zu prüfen. Dies ist sehr lesbar und ersetzt komplexe verschachtelte If-Anweisungen.
Snippet öffnen →Indizes (^-Operator) und Bereiche (..-Operator) bieten eine prägnante Syntax, um auf Elemente vom Ende eines Arrays zuzugreifen oder Teilstücke zu extrahieren.
Snippet öffnen →Die Verwendung von Delegaten wie Func und Action ermöglicht es, Logik als Argumente zu übergeben, was Methoden flexibel und wiederverwendbar macht, ohne Verhalten fest zu kodieren.
Snippet öffnen →In reinem C# ohne externe Frameworks können Sie Verifikationsmethoden implementieren, um die Korrektheit des Codes mithilfe von Standard-Exceptions und Vergleichen zu validieren.
Snippet öffnen →Verzweigte Arrays (Jagged Arrays) sind Arrays von Arrays, bei denen jede Zeile eine unterschiedliche Länge haben kann. Dies ist speichereffizienter als ein mehrdimensionales (rechteckiges) Array, w…
Snippet öffnen →Positionsmuster ermöglichen es, ein Objekt zu dekonstruieren und dessen Teile abzugleichen. Dies ist äußerst effektiv für zustandsbasierte Logik und ersetzt lange if-else-Ketten durch lesbare Switc…
Snippet öffnen →Guard-Klauseln sind ein Muster, das zu Beginn einer Funktion auf ungültige Bedingungen prüft. Dies gewährleistet Sicherheit durch Eingabevalidierung und macht die Hauptlogik leichter testbar und wa…
Snippet öffnen →