Neu in .NET 9.0 [11]: Neue Möglichkeiten für ref struct in C# 13.0
In C# 13.0 hat Microsoft den Einsatzbereich von ref struct unter anderem zum Implementieren von Schnittstellen erweitert.
(Bild: Pincasso/Shutterstock)
- Dr. Holger Schwichtenberg
Seit C# 7.2 gibt es Strukturen, die immer auf dem Stack leben und niemals auf den Heap wandern können: ref struct. In C# 13.0 hat Microsoft den Einsatz von ref struct erweitert.
Videos by heise
Solche Typen können nun:
- Schnittstellen implementieren. Allerdings gilt die Einschränkung, dass die Struktur nicht in den Schnittstellentyp konvertiert werden kann, da der Compiler intern dafür ein Boxing machen müsste.
- als Typargument genutzt werden. Allerdings muss man dazu den generischen Typ beziehungsweise die generische Methode
where T : allows ref structverwenden. - in Iteratoren mit
yieldverwendet werden. Allerdings darf die Struktur nicht länger leben als der aktuelle Durchlauf des Iterator. - in asynchronen Methoden, die
TaskoderTask<T>liefern, genutzt werden.
Weiterhin gilt aber: Wenn man einen Typ als ref struct deklariert, ist ein Boxing nicht mehr möglich. Der Einsatz von ref struct ist daher begrenzt. So kann man beispielsweise kein Array und keine List<T> daraus erzeugen.
Folgender Code zeigt einen eigenen Typ mit ref struct, der eine Schnittstelle implementiert:
internal interface IPerson
{
int ID { get; set; }
int Name { get; set; }
}
// NEU seit C# 13.0: ref struct kann Schnittstelle implementieren
ref struct Person : IPerson
{
public int ID { get; set; }
public int Name { get; set; }
// ToString()
public override string ToString()
{
return "Person #" + ID + " " + Name;
}
}
}
class Client
{
public void Run()
{
Person p = new Person();
p.ID = 1;
p.Name = 2;
Console.WriteLine(p.ID);
Console.WriteLine(p.Name);
// Das ist alles nicht erlaubt!
// IPerson i = p; // Casting auf Schnittstelle
// List<Person> PersonList = new(); // List<T>
// PersonList[] PersonArray = new Person[10]; // Array
}
}
(rme)