# BASTA Herbst Workshop Zoom ID: 853 2970 7613 202770 Password: 202770 ## Agenda C# 12 und .NET 8 stehen vor der Tür. Es ist schon eine Tradition, dass wir uns im C#-Workshop auf der BASTA!-Konferenz wichtige neue C#- und .NET-Features anhand vieler praxisorientierter Beispiele ansehen. Wir nehmen uns Zeit und kratzen nicht nur an der Oberfläche, sondern schauen genauer hinter die Kulissen. Der Schwerpunkt des Workshops sind die neuen C#-Funktionen. Da einige jedoch Erweiterungen von Sprachkonstrukten sind, die sich über mehrere Versionen von C# entwickeln, werden wir da oder dort auch Themen wiederholen, die die letzten C#-Versionen hervorgebracht haben. Um die Spracherweiterungen von C# noch besser zu verstehen, werden wir im diesjährigen Workshop auch einen Blick auf die ASP.NET-Core-Minimal-Web-API werfen. Es ist nicht das Ziel, eine vollständige Einführung in das neue Programmiermodell für Web-APIs zu bieten. Wir werden jedoch das Programmiermodell von Minimal APIs als Beispiel verwenden, um einige der neuen Sprachfunktionen in ihrer praktischen Anwendung zu sehen. Wer Lust auf einen ganzen Tag voller C#-Neuigkeiten, viel Beispielcode und wenig Slides hat, der ist beim C#-Workshop genau richtig. ## Workshopformat Workshops auf der BASTA sind anders als Session-Vorträge. Wir nehmen uns Zeit, Dinge gemeinsam auszuprobieren und natürlich sind Workshops auch eine Gelegenheit, um individuelle Fragen zu stelle. > Alle TeilnehmerInnen sind daher eingeladen, bei den Beispielen mitzumachen und/oder Fragen zu stellen. Je interaktiver der Workshop ist, desto interessanter für alle. Bei einer Frage oder Wortmeldung einfach (digital) Hand heben oder eine Nachricht in den Chat schreiben. ## Zeiten | Zeit | Inhalt (Änderungen möglich) | |---------------|-----------------------------| | 9:00 - 10:30 | C# 12 | | 11:00 - 12:30 | C# 12 | | 13:30 - 15:00 | ASP.NET Core mit .NET 8 | | 15:30 - 17:00 | ASP.NET Core mit .NET 8 | ## Kontakt * [LinkedIn](https://www.linkedin.com/in/rainerstropek/) * [YouTube](https://youtube.com/@rstropek) * [Digital CV](https://rainerstropek.me) ## Systemvoraussetzungen für Beispiele * Neueste C#/.NET-Version * Visual Studio oder Visual Studio Code ## Ressourcen * [C# 12 Samples](https://github.com/rstropek/Samples/tree/master/CSharp12) * [.NET 8 und ASP.NET Core Samples](https://github.com/rstropek/Samples/tree/master/CSharpBasta23) * [Documentation about Native AOT compatibility](https://learn.microsoft.com/en-us/aspnet/core/fundamentals/native-aot) * [Todo-Sample David Fowler](https://github.com/davidfowl/TodoApi/tree/davidfowl/net8) ## Interceptor ```cs using System.Diagnostics; using System.Reflection.PortableExecutable; using System.Text.Json; using System.Text.Json.Serialization; using InterceptorsDemo; #region JSON demo data const string HeroesJsonReflection = """ [ { "Name": "Batman", "RealName": "Bruce Wayne", "CanFly": false }, { "Name": "Cat Woman", "RealName": "Selina Kyle", "CanFly": false } ] """; const string HeroesJsonSourceGen = """ [ { "Name": "Storm", "RealName": "Ororo Munroe", "CanFly": true }, { "Name": "Magneto", "RealName": "Max Eisenhardt", "CanFly": true } ] """; #endregion var hm = new HeroManager(); Console.WriteLine(string.Join(',', hm.GetHeroes(HeroesJsonReflection).Select(h => h.Name))); namespace InterceptorsDemo { using System.Runtime.CompilerServices; record class Hero(string Name, string RealName, bool CanFly); class HeroManager { public Hero[] GetHeroes(string json) { // REFLECTION!! var heroes = JsonSerializer.Deserialize<Hero[]>(json); Debug.Assert(heroes is not null); return heroes; } } static class HeroManagerCool { [InterceptsLocation("/home/rainer/live/basta23/Interceptors/Program.cs", line: 23, character: 39)] public static Hero[] GetHeroesCool(this HeroManager hm, string json) { var heroes = JsonSerializer.Deserialize(json, SourceGenerationContext.Default.HeroArray); Debug.Assert(heroes is not null); return heroes; } } [JsonSerializable(typeof(Hero[]))] partial class SourceGenerationContext : JsonSerializerContext { } } namespace System.Runtime.CompilerServices { [AttributeUsage(AttributeTargets.Method, AllowMultiple = true, Inherited = false)] public sealed class InterceptsLocationAttribute(string filePath, int line, int character) : Attribute { } } ```