.NET 8.0: Interview mit fünf Experten zum nächsten LTS-Release

Was ist an .NET 8.0 bemerkenswert, wie gelingt die Migration und was könnte die Zukunft bringen? Fünf .NET-Experten im Interview.

In Pocket speichern vorlesen Druckansicht 2 Kommentare lesen

(Bild: senk/Shutterstock.com)

Lesezeit: 18 Min.
Von
  • Maika Möbus
Inhaltsverzeichnis

Microsoft will.NET 8.0 am 14. November veröffentlichen und mit drei Jahren Long-Term-Support (LTS) sowie einigen neuen Features zu versehen. Wie sich diese auf die tägliche Arbeit auswirken werden, wie eine Migration auf die neue Version möglichst reibungslos erfolgen kann und welche Funktionen für die Zukunft wünschenswert wären, hat heise Developer im Vorfeld des Release von den .NET-Experten und Speakern der Heise-Konferenz betterCode() .NET 8.0 Thomas Claudius Huber, André Krämer, Holger Schwichtenberg, Rainer Stropek und Christian Wenz erfahren.

heise Developer: .NET 8.0 wird das erste LTS-Release seit .NET 6.0 vor zwei Jahren sein. Was ist darin für dich die wichtigste Neuerung?

Thomas Claudius Huber: Ich entwickle schon seit Jahren Fullstack-Anwendungen. Das heißt, ich verwende als Client üblicherweise eine Desktop- oder Web-App, eine Datenbank und unter Umständen eine API-Schicht zwischen Client und Datenbank. Bei manchen Datenbankzugriffen nutzte ich in der Vergangenheit Dapper, eine Library für objekt-relationales Mapping (ORM), da sie reine SQL-Abfragen direkt auf Entities mappt, was in verschiedenen Szenarien sinnvoll war. Entity Framework Core 8.0 enthält mit Raw SQL Queries ein sehr ähnliches und flexibles Feature, mit dem ich denke, dass ich die meisten, wenn nicht sogar alle meiner Dapper-Datenbank-Zugriffe ersetzen kann. Daher freue ich mich besonders auf dieses Feature.

Doch daneben gibt es viele weitere spannende Dinge, sowohl in den Core Libraries als auch in den verschiedenen Frameworks wie Blazor oder Windows Presentation Foundation (WPF). In WPF hat Microsoft beispielsweise mit .NET 8.0 eine neue OpenFolderDialog-Klasse eingeführt, welche die Auswahl eines Ordners erlaubt. Bisher musste man für einen solchen Dialog die entsprechende Windows Forms Assembly referenzieren, was in Zukunft nicht mehr notwendig ist.

Thomas Claudius Huber

(Bild: Thomas Claudius Huber)

Thomas Claudius Huber ist Microsoft MVP im Bereich Windows Development und Senior Principal Consultant bei der Trivadis AG. Als Trainer, Berater und Entwickler ist er in den Bereichen C#, XAML, TypeScript und Azure unterwegs. Da ihn Benutzeroberflächen schon seit seinem Informatikstudium faszinierten, setzte er sich seit der ersten WPF-Version mit der UI-Programmierung mit XAML auseinander.

André Krämer: Da ich mit meinem Team schwerpunktmäßig Apps mit .NET Multi-platform App UI (.NET MAUI) entwickle, sind die vielen Qualitätsverbesserungen, die dort in der Version 8.0 kommen, die wichtigste Neuerung. Ein Blick auf GitHub zeigt, dass das .NET-MAUI-Team mehrere Hundert Issues schließen und Pull Requests mergen konnte. Diese Verbesserungen betreffen hauptsächlich Fehlerbehebungen, Performancesteigerungen und ein besseres Speichermanagement. Bisher haben wir .NET MAUI überwiegend für Neuentwicklungen eingesetzt und mussten einige Zeit investieren, um Fehler in den Versionen 6.0 und 7.0 zu umgehen. Mit der erreichten Qualität in Version 8.0 werden wir nun auch die Migration bestehender Xamarin.Forms-Apps unserer Kunden vorantreiben, da diese nun sowohl technisch als auch wirtschaftlich sinnvoll ist.

Heise-Konferenz: betterCode() .NET 8.0

Die hier interviewten Experten werden am 21. November 2023 auf der Online-Konferenz betterCode() .NET 8.0 ihr Wissen teilen. Die von Heise und www.IT-Visions.de präsentierte Konferenz bietet das Rüstzeug, sich einen grundlegenden Überblick zu .NET 8.0 zu verschaffen, was die Neuerungen in .NET 8.0, ASP.NET Core 8.0, Blazor 8.0, .NET MAUI, C# 12.0 und mehr betrifft. Daneben stehen vier ganztägige Online-Workshops bereit.

Holger Schwichtenberg: Die meiner Meinung nach wichtigste Neuerung in .NET 8.0 ist definitiv "Blazor United"! Nun hat man bei .NET-basierten Browseranwendungen nicht mehr die Qual der Wahl zwischen Pest oder Cholera (Blazor Server und Blazor WebAssembly), sondern kann das Beste aus beiden Welten in einer Anwendung vereinen und sogar einen nahtlosen und für Benutzerinnen und Benutzer unsichtbaren Wechsel zur Laufzeit realisieren.

Rainer Stropek: .NET 8.0 bringt zwei Dinge, die meine Arbeit kurz- und langfristig beeinflussen werden. Die erste Sache betrifft C#. In C# 12.0 kommen zwar keine bahnbrechenden Neuerungen, aber dafür Neuerungen, die "Everyday C#" betreffen. Damit meine ich jene Sprachfeatures, die man nicht nur in Spezialsituationen, sondern jeden Tag verwenden kann. Die zwei wichtigsten Neuerungen in dieser Kategorie sind Primary Constructors und Collection Expressions. Nach einigen Wochen praktischer Arbeit mit .NET 8.0 merke ich schon jetzt, dass sie mir fehlen, wenn ich an älteren Codebasen arbeiten muss.

Das Zweite ist eine eher langfristige Sache. Native AOT wurde im Gegensatz zu .NET 7.0 auf ASP.NET-Core-Web-APIs erweitert. Das ist eine kleine Revolution. Wenn ich bisher in der Cloud flotte, ressourcenschonende APIs brauchte und auf die Systemnähe von Rust verzichten konnte, griff ich zu Go. Die Tatsache, dass der Code direkt in Maschinensprache übersetzt wird, macht Cold-Start-Zeiten möglich, an die .NET bisher nur schwer herangekommen ist. Durch Native AOT ändert sich das. Diese Entwicklung zeichnete sich schon seit Langem ab, mit .NET 8.0 können wir als Entwicklerinnen und Entwickler aber endlich loslegen. Für mich weitet sich der Einsatzbereich von .NET dadurch speziell im Kontext von Serverless Cloud Computing noch weiter aus.

Christian Wenz: Ganz pragmatisch erfordert die neue Version, dass auf .NET 6.0 oder .NET 7.0 basierende Anwendungen dorthin aktualisiert werden; der Support der LTS-Version .NET 6.0 läuft etwa ein Jahr nach Erscheinen von .NET 8.0 aus, der von .NET 7.0 bereits sechs Monate zuvor. Prinzipiell freue ich mich für meinen Themenbereich auf der Online-Konferenz betterCode() .NET 8.0, Webanwendungen, über die vielen großen und kleinen Performance-Verbesserungen. Microsoft hat für die teils arg optimierten Einreichungen beim TechEmpower-Benchmark einiges an Kritik kassiert und kann jetzt zeigen, dass ASP.NET Core ohnehin sehr schnell ist.

Wer an Details interessiert ist: Der ausführliche Blog-Post beantwortet alle Fragen. Wirklich alle. Für ASP.NET Core 8.0 gibt es auch noch einige Erweiterungen in den Bereichen Authentifizierung und Identity, die überfällig sind.

heise Developer: Mit .NET 8.0 wird auch die neue Programmiersprachenversion C#12.0 erscheinen. In welchen Anwendungsfällen dürften die neuen Sprachfeatures hauptsächlich zum Einsatz kommen?

Thomas: Ich denke, die neuen Sprachfeatures werden an verschiedensten Stellen älteren Code ersetzen, insbesondere die neuen Collection Expressions und Primary Constructors. Die Collection Expressions machen das Initialisieren eines Arrays deutlich einfacher.

Bisher konnten wir in C# ein Array mit drei Integer-Werten wie folgt initialisieren:

int[] myArray = new[] { 1, 2, 3 };

Mit den in C# 12.0 eingeführten Collection Expressions lässt sich dies kürzer und auch lesbarer schreiben. Dazu werden die Werte einfach in eckigen Klammern platziert:

int[] myArray = [ 1, 2, 3 ];

Primary Constructors, die bereits aus C# Records bekannt sind, gibt es jetzt für Klassen und Structs. Auch hier könnte es verschiedene Stellen geben, die diese neue Funktionsweise kompakter und somit lesbarer macht. Das folgende Beispiel zeigt eine einfache Person-Klasse, die einen Konstruktor enthält, um darin die zwei Properties FirstName und LastName zu initialisieren:

public class Person
{
    public Person(string firstName, string lastName)
    {
        FirstName = firstName;
        LastName = lastName;
    }

    public string FirstName { get; set; }
    public string LastName{ get; set; }
}

Mit C# 12.0 lässt sich mit einem Primary Constructor die gleiche Klasse wie folgt schreiben:

public class Person(string firstName, string lastName)
{
    public string FirstName { get; set; } = firstName;
    public string LastName { get; set; } = lastName;
}

Das ist deutlich kompakter. Sobald sich Entwicklerinnen und Entwickler an die Primary Constructors gewöhnt haben, wird der Code lesbarer.

André: Die Einführung von Primary Constructors in C# 12.0 ist besonders spannend. Sie ermöglichen den Zugriff auf ihre Konstruktorparameter innerhalb der gesamten Klassendefinition, was den Code kürzer, übersichtlicher und somit wartbarer macht. Das setzt den Trend der letzten C#-Versionen zu einer kompakteren C#-Sprachsyntax fort.

Holger: Die Primärkonstruktoren für Klassen, die es schon einmal 2014 als Prototyp gab, werden nun endlich in die Sprachsyntax von C# 12.0 eingebaut. Bisher gab es das nur für Record-Typen. Primärkonstruktoren werden meine Fingerkuppen schonen. Leider gibt es auch einen Wermutstropfen: Anders als bei den in C# 9.0 eingeführten Record-Typen erstellt der Primärkonstruktor nämlich keine öffentlichen Properties in der Klasse, sondern nur private Fields :(

Auch die Aliase für beliebige Typen sind eine tolle Verschlankung des zu erfassenden Codes, insbesondere für Tupel:

global using Author = (int ID, string Name, string Website);
…
      Author hs = (42, "Dr. Holger Schwichtenberg", "www.IT-Visions.de");
Dr. Holger Schwichtenberg

(Bild: Dr. Holger Schwichtenberg)

Dr. Holger Schwichtenberg ist einer der bekanntesten Experten für .NET in Deutschland. Zusammen mit rund 50 weiteren Experten unterstützt er im Rahmen der Firma IT-Visions.de mittlere und große Unternehmen durch Beratung und Schulungen beim Erstellen von Software. Zudem ist er Chief Technology Expert bei der Softwareschmiede MAXIMAGO.

Rainer: Ich habe Primary Constructors und Collection Expressions schon als meine zwei Highlights von C# 12.0 hervorgehoben. Beide sorgen dafür, dass sich unnötiger Boilerplate-Code vermeiden lässt. So viele Klassen, die ich erstelle, brauchen Konstruktorparameter. Den Konstruktor manuell erstellen zu müssen, war bisher lästig – speziell, wenn man aus Sprachen wie TypeScript weiß, dass es auch ohne ginge. Man hätte zwar schon bisher auf Record Classes zurückgreifen können. Dann muss man aber Immutability akzeptieren. Das passt für manche Szenarien, aber bei Weitem nicht für alle. Mutable Classes sind in vielen Situationen ein Muss und Primary Constructors daher sehr hilfreich.

Collection Expressions machen den C#-Code einheitlicher. Es gab bisher unzählige verschiedene Möglichkeiten, Listen zu initialisieren. Jede funktionierte etwas anders. Dann kamen List Patterns im Bereich Pattern Matching dazu, die wieder eine andere Syntax hatten. Collection Expressions sind ein wichtiger Schritt zur Vereinfachung. Für mich als C#-"Opa", der seit 20 Jahren C# programmiert, sind die verschiedenen Syntaxvarianten kein Problem. Ich habe mich daran gewöhnt. Anfängerinnen und Anfänger kämpfen aber damit, ich merke das in meiner Arbeit als Trainer und Teilzeitlehrer an einer Informatik-Schule. Alles, was C# leichter zu lernen macht, finde ich gut, denn es sorgt dafür, dass uns der Nachwuchs im Bereich C# nicht ausgeht. Das ist für mich als IT-Unternehmer wichtig.

Rainer Stropek

(Bild: Rainer Stropek)

Rainer Stropek ist seit 2008 Mitbegründer und CEO der Firma software architects. Zudem leitet Rainer die österreichische Niederlassung des Beratung- und Schulungsunternehmens IT-Visions. Er ist Experte für .NET- und Webentwicklung, Softwarearchitektur, Datenbanken und Cloud Computing.

Christian: Ich halte bei gereiften Sprachen wie C# neue Sprachfeatures in der Regel nicht für entscheidend; häufig handelt es sich zudem um Syntaxzucker, aber nichts Weltbewegendes. Von den neuen Möglichkeiten in C# 12.0 finde ich eine recht interessant, die allerdings – zu Recht – als "experimentell" markiert worden ist. Daran wird also noch gearbeitet und Feedback eingeholt. Die Rede ist von Interceptors. Vereinfacht gesagt, kann ein Interceptor Aufrufe zu manchen Methoden zur Compile-Zeit auf sich selbst umleiten. Das ist insbesondere für Codegeneratoren interessant. Spezifiziert ist dieses Feature schon, doch die API kann sich jederzeit ändern, bis hin zur Entfernung.