Entwicklung & Code
Neu in .NET 10.0 [6]: Generische Erweiterungsblöcke in C# 14.0
Erweiterungsblöcke mit dem Schlüsselwort extension habe ich in der vorherigen Folge der Serie zu .NET 10.0 vorgestellt. Ein Erweiterungsblock darf einen oder mehrere generische Typparameter (optional inklusive Einschränkung mit where) besitzen:
Weiterlesen nach der Anzeige
extension(List source) { … }
oder
extension(List source) where T : INumber { … }
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.
Folgender Code zeigt eine Klasse mit Erweiterungsblocken für List, wobei T auf Zahlen beschränkt ist, durch where T : INumber:
public static class MyExtensions
{
extension(List source) where T : INumber // <-- Receiver Ein Erweiterungsblock darf eine oder mehrere generische Typparameter (optional inklusive Constraint) besitzen!!!
{
public List WhereGreaterThan(T threshold)
=> source.Where(x => x > threshold).ToList();
public bool IsEmpty
=> !source.Any();
///
public int Size
{
get { return source.Count; }
set
{
while (value < source.Count) source.RemoveAt(source.Count - 1);
if (value > source.Count) source.AddRange(Enumerable.Repeat(default(T)!, value - source.Count).ToList());
}
}
// NEU: Operatorüberladung als Extension und neu ist auch, dass man += überladen kann
public void operator +=(int count)
{
source.Size = source.Count + count;
}
// NEU: Operatorüberladung als Extension und neu ist auch, dass man -= überladen kann
public void operator -=(int count)
{
source.Size = source.Count - count;
}
// NEU: Operatorüberladung als Extension und neu ist auch, dass man ++ überladen kann
public void operator ++()
{
source.Size += 1;
}
}
}
Folgender Code ruft die Erweiterungsmethoden für List auf:
Weiterlesen nach der Anzeige
public void Run()
{
CUI.Demo(nameof(CS14_ExtensionDemo) + ": Collection");
var list = new List { 1, 2, 3, 4, 5 };
var large = list.WhereGreaterThan(3);
Console.WriteLine(large.IsEmpty);
if (large.IsEmpty)
{
Console.WriteLine("Keine Zahlen größer als 3!");
}
else
{
Console.WriteLine(large.Count + " Zahlen sind größer als 3!");
}
CUI.H2("list.Size = 10");
// Das klappt: Die Liste wird auf 10 Elemente mit Nullen aufgefüllt
list.Size = 10;
foreach (var x in list)
{
CUI.OL(x, separator: " = ");
}
CUI.H2("list.Size -= 2");
list.Size -= 2;
bool restart = true;
foreach (var x in list)
{
CUI.OL(x, separator: " = ", restartCounter: restart);
restart = false;
}
CUI.H2("list.Size++");
list.Size++;
restart = true;
foreach (var x in list)
{
CUI.OL(x, separator: " = ", restartCounter: restart);
restart = false;
}
}
Der Code erzeugt folgende Ausgabe:
Ausgabe des Beispielcodes
(rme)