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.

Lesezeit: 1 Min.
In Pocket speichern
vorlesen Druckansicht Kommentare lesen 10 Beiträge
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 Chief Technology Expert bei MAXIMAGO, die Innovations- und Experience-getriebener Softwareentwicklung, u.a. in hochkritischen sicherheitstechnischen Bereichen, anbietet. Zudem ist er Leiter des Expertennetzwerks www.IT-Visions.de, das mit 38 renommierten Experten zahlreiche mittlere und große Unternehmen durch Beratung und Schulung bei der Entwicklung sowie dem Betrieb von Software unterstützt.

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)