Anzeige
Anzeige
Anzeige
Anzeige
Anzeige
Anzeige
Lesedauer 4 Min.

Extension every-thing – endlich?

Seit Preview 3 von .NET 10 kennt C# Extension Members.
© dotnetpro
Kaum ein anderes Feature von C# wird so sehnlich erwartet wie der Ausbau der Erweiterungsmethoden (Exten­sion Methods) hin zu „Extension everything“. Das Feature wurde im letzten Jahr schon für C# 13 und .NET 9 eingeplant, doch dann wieder verschoben. Mit der kommenden C#-Version 14 soll es dann endlich so weit sein: Die „Extension Members“ sollen kommen. Doch nicht ganz in der Form, die .NET-Developer im vergangenen Jahr erwartet hatten.

Die Idee

Was Microsoft hier schon länger verfolgt, ist im Grunde der Ausbau der allseits bekannten und beliebten Erweiterungsmethoden, die es erlauben, beliebige Datentypen mit statischen Methoden zu erweitern. Die Erweiterungen sollen in Zukunft nicht mehr auf Methoden beschränkt bleiben. Damit ließe sich also jeder beliebige .NET-Typ um weitere Dinge ausbauen, sodass wir komfortabel damit arbeiten können.An der Idee wurde bereits seit einigen Jahren gearbeitet. Das zeigen nicht zuletzt die Meetings rund um dieses Feature [1]. Seit 2021 trifft sich das dafür zuständige C#-Team in regel­mäßigen Abständen – zuletzt sogar wöchentlich – und diskutiert über die geplante Syntax. Im vergangenen Jahr konnte man sich noch nicht einigen und hat das Feature kurzerhand verschoben. Seit der Preview 3 sind „Extension Members“, wie sie nun offiziell genannt werden, in .NET 10 enthalten [2] und werden wohl auch ausgeliefert – hoffentlich bleibt das diesmal auch bis zum offiziellen Release so.

Die neue Syntax

Die Syntax hat sich gegenüber dem Entwurf von 2024 etwas geändert. Dieser wurde in den Meetings mehrfach „durchgekaut“, da sich das C#-Team nicht sicher war, welche Variante die Beste ist. Anhand der Preview-Version 3 von .NET 10 ergibt sich aktuell folgende Lage: Mit Extension Members kann jeder beliebige Typ erweitert werden und darf dabei auch generisch sein. Es gelten dieselben Regeln wie bei Extension Methods. Extension Members müssen ebenfalls in einer statischen Klasse definiert werden und können beliebige Members enthalten – gemäß dem aktuellen Stand sind dies Properties, Methoden, Indexer und Operatoren [3]. Wir können nun auch etwas tun, das bisher noch nicht ging, nämlich statische Typen erweitern: Mit Extension Methods konnten wir auf Instanzen immer nur Methoden „dazubauen“ – jetzt ist es möglich, den statischen Typ selbst zu erweitern.

Ein Beispiel

Wie immer in unserer Kolumne schauen wir uns ein praktisches Beispiel an, um das Feature etwas zu durchleuchten. Wer es nachbauen möchte, benötigt neben der aktuellen Preview von .NET 10 auch eine Preview-Version von Visual Studio 2022 mit den aktuellsten Updates. Anschließend kann ein .NET-10-Projekt angelegt werden; wichtig ist dabei insbesondere, den Eintrag LangVersion auf preview zu schalten:

<PropertyGroup>
  <OutputType>Exe</OutputType>>
  <TargetFramework>net10.0</TargetFramework>
  <ImplicitUsings>enable</ImplicitUsings>
  <LangVersion>preview</LangVersion>
</PropertyGroup> 
Mithilfe der (statischen) Klasse extension lässt sich nun jeder Typ erweitern. Im folgenden Beispiel wird der Datentyp String erweitert:

Console.WriteLine("Hello, World!".IsEmpty);
public static class Enumerable {
  extension(string text)
  {
    public bool IsEmpty => !string.IsNullOrEmpty(text);
  }
} 
Das ließ sich zwar bereits mit Extension Methods lösen, aber nun können wir auch Properties verwenden und können innerhalb der Extension den Datentyp erweitern, ganz wie es uns beliebt.

Etwas weitergedacht

Seien wir ehrlich: Statt Methoden kann ich jetzt Properties schreiben. Das ist zwar nett, aber letztendlich stellt sich die Frage: Was bringt das? Nun, durchaus mehr, als auf den ersten Blick zu erkennen ist.So lassen sich im Zusammenspiel mit Entity Framework Core damit sehr nette APIs schreiben. Hat man exemplarisch eine Entität User, kann man mithilfe der Klasse extension nun das zugrunde liegende IQueryable<T> sehr einfach erweitern und somit die Datenbankabfragen lesbarer gestalten:

public static class UserQueryExtensions 
{
  extension(IQueryable<User> users)
  {
    public IQueryable<User> Active
      => users.Where(u => u.IsActive);
    public IQueryable<User> Admins
      => users.Where(u => u.Role == "Admin");
    public IQueryable<User> RecentlyActive
      => users.Where(u => 
      u.LastLogin >= DateTime.UtcNow.AddDays(-30));
  }
} 
Das führt zu nachfolgender Abfragesyntax, die sich schon sehr flüssig liest:

IQueryable<User> db = null;
var allRecentlyActiveAdmins = db
  .Admins
  .Active
  .RecentlyActive; 
Und ja, mit Methoden wäre das auch gegangen, aber allein die Klammersetzung macht Letzteres eben uneleganter.

Fazit

Wir warten schon lange auf Extension Members, manch einer geradezu sehnsüchtig. Hat sich das Warten gelohnt? Na ja. Fakt ist: Wir werden damit definitiv eine neue Art von Erweiterungen im Sinne der Schreibweise erhalten. Gerade wenn die ersten Frameworks und Libraries Extension Members einsetzen, könnten durchaus spannende Dinge auf uns zukommen. Doch ein wirklich weltbewegendes neues Feature wird es innerhalb des .NET-Ökosystems sicher nicht sein.

Fussnoten

  1. Planungssitzungen des C#-Teams, http://www.dotnetpro.de/SL2506-07NETirol1
  2. Extension Members in .NET 10, http://www.dotnetpro.de/SL2506-07NETirol2
  3. Syntax von Extension Members, http://www.dotnetpro.de/SL2506-07NETirol3
Miscellaneous

Neueste Beiträge

KI: Vorteile nutzen, technische Souveränität bewahren
KI-Agenten bieten nicht nur Vorteile, mit ihrer Nutzung können auch neue, gravierende Risiken für Unternehmen entstehen. Diese lassen sich jedoch mit entsprechenden Maßnahmen beherrschen – wodurch Unternehmen letztlich ihre technische Souveränität sicherstellen.
5 Minuten
14. Sep 2026
Offen, aber nicht leicht - Kimi K3 – das Modell hinter dem Agenten, Teil 6
Ein offenes Modell lässt sich herunterladen, aber noch lange nicht beiläufig betreiben. Zwischen technischer Kontrolle und praktischem Nutzen zeigt sich, ob Kimi K3 den Sprung vom Benchmark in produktive Anwendungen schafft.
8 Minuten
Connected Apps mit .NET - Graph API als Integrationsplattform
Microsoft Graph bietet .NET-Entwicklern einheitlichen Zugang zu den Daten und Diensten von Microsoft 365 – für moderne, sichere und kontextbezogene Business-Anwendungen.
17 Minuten

Das könnte Dich auch interessieren

.NET-Anbindung für die Llama-KI - LLamaSharp
Open-Source-KI auf dem lokalen Gerät nutzen – mit handhabbarem Speicherbedarf und optionalem Zugriff auf externe Datenquellen.
8 Minuten
13. Jan 2025
Das Firmata-Protokoll für einfache Mess- und Steuerungsaufgaben - Best of NuGet, Teil 8
Wer kleinere Mess-, Steuerungs- und Regeltechnik-Aufgaben aus .NET heraus abwickeln möchte, kommt mit einem preiswerten und mit Firmata-Software ausgestatteten Arduino meist problemlos ans Ziel.
7 Minuten
27. Jul 2026
MessagePack: JSON als Binär-Image - Best of NuGet, Teil 10
Das Serialisierungsformat MessagePack wurde – anders als JSON – konsequent auf die Bedürfnisse von Maschinen und damit auch auf höchstmögliche Kompaktheit optimiert. Der Vorteil: Ein geringeres zu übertragendes Datenvolumen führt vor allem in IoT-nahen Anwendungen direkt zu geringeren Kosten.
6 Minuten
17. Aug 2026
Anzeige
Anzeige
Anzeige
Anzeige
Anzeige