Neu in .NET 7 [8]: Statische abstrakte Properties & Methoden in Interfaces in C#

In der neuen Version von Microsofts Programmiersprache C# dürfen Schnittstellendeklarationen von Properties und Methoden als static abstract deklariert sein.

In Pocket speichern vorlesen Druckansicht 10 Kommentare lesen
Lesezeit: 1 Min.
Von
  • Dr. Holger Schwichtenberg

C# 11.0 erlaubt Schnittstellendeklarationen von Properties und Methoden mit static abstract und static virtual. In C# 10.0 war das schon experimentell möglich.

Der Dotnet-Doktor – Holger Schwichtenberg

Dr. Holger Schwichtenberg ist technischer Leiter des Expertennetzwerks www.IT-Visions.de, das mit 53 renommierten Experten zahlreiche mittlere und große Unternehmen durch Beratungen und Schulungen sowie bei der Softwareentwicklung unterstützt. Durch seine Auftritte auf zahlreichen nationalen und internationalen Fachkonferenzen sowie mehr als 90 Fachbücher und mehr als 1500 Fachartikel gehört Holger Schwichtenberg zu den bekanntesten Experten für .NET und Webtechniken in Deutschland.

Beispiel: Es gibt zwei Schnittstellen. IObjectWithID gibt eine statische Property vom Typ Integer mit Namen ID vor. Die darauf aufbauende Schnittstelle IAbc gibt drei weitere Mitglieder vor:

  • Eine formale abstrakte Instanzmethode GetA(),
  • eine statische Methode GetB() mit Implementierung und
  • eine statische abstrakte Methode GetC():
interface IObjectWithID
{
 static abstract int ID { get; set; } // NEU
}
 
interface IAbc : IObjectWithID
{
 string GetA();
 static string GetB() => "B";
 static abstract string GetC(); // NEU
}

Dazu zeigt folgende Implementierung der Klasse Abc auf Basis von Schnittstelle IAbc, dass man die als static abstract deklarierten Mitglieder nun als statische Mitglieder implementieren muss:

class Abc : IAbc
{
 public string GetA() => "A"; 
   // muss nicht-statische Implementierung für GetA() liefern
 public static string GetC() => "C"; 
   // muss statische Implementierung für GetC() liefern 
 public static int ID { get; set; } = 1; 
   // muss statische Implementierung für ID liefern 
}

Dann sind folgende Verwendungen möglich:

var obj = new Abc();
// Instanzmitglied:
Console.WriteLine(obj.GetA()); 
// statisches Mitglied direkt im Interface: 
Console.WriteLine(IAbc.GetB()); 
// statisches Mitglied - Nutzung via Klassenname:
Console.WriteLine(Abc.ID); 
// statisches Mitglied - Nutzung via Klassenname:
Console.WriteLine(Abc.GetC()); 

An diesem Sprachfeature hat Microsoft laut Aussage von Program Manager Mads Torgersen mehr als zehn Jahre gearbeitet. Erst die Möglichkeit, die Runtime von .NET zu verändern, hat die Umsetzung zur Produktreife gebracht (Quelle: .NET Conf 2022, 9.11.2022). Veränderungen der Runtime wurden im klassischen .NET Framework wegen möglicher Breaking Changes nicht oder nur in kleinen Dosen umgesetzt.

(rme)