Sinds enkele jaren hanteert Microsoft een jaarlijks releaseschema voor nieuwe versies van C#. In 2022 zijn we aangekomen bij versie 11 van de programmeertaal, die gepland staat voor een release in de maand november. Op het moment is C# 11 in preview, waarbij je de nieuwe features al uit kan proberen. In dit artikel beschrijf ik de beste, nieuwe features.
Generic attributes
Generics zijn al lange tijd onderdeel van C#, al sinds versie 2 uit 2005. Echter was het niet mogelijk om dit principe toe te passen op attributes. Om dit voor elkaar te krijgen moest een Type-parameter aan de constructor meegegeven worden:
public class TypeAttribute : Attribute
{
public TypeAttribute(Type t) => ParamType = t;
public Type ParamType { get; }
}
Het gebruik van dit attribute zag er dan als volgt uit:
[TypeAttribute(typeof(string))]
public string Method() => default;
Vanaf C# 11 is het mogelijk om een generic attribute te definiëren:
public class GenericAttribute<T> : Attribute { }
Het gebruik hiervan gaat zo:
[GenericAttribute<string>()]
public string Method() => default;
Raw string literals
Bij het gebruik van aanhalingstekens, witruimte en witregels in strings moeten deze altijd gemarkeerd worden met een escape-reeks. Dit kan nogal veel werk worden in tekst met veel van deze elementen, zoals bijvoorbeeld HTML. Hiervoor bieden raw string literals een oplossing. Door de string te definiëren met drie omringende aanhalingstekens in plaats van slechts één:
string html = """
<!DOCTYPE html>
<html>
<body>
<h2>HTML Images</h2>
<p>HTML images are defined with the img tag:</p>
<img src="test.jpg" alt="test image" width="104" height="142">
</body>
</html>
""";
In deze constructie is het ook mogelijk om gebruik te maken van string interpolation. Hierbij geven meerdere $-karakters aan hoeveel opeenvolgende accolades de interpolation beginnen en eindigen:
var location = $$"""
You are at {{{Longitude}}, {{Latitude}}}
""";
Newlines in string interpolations
De tekst tussen accolades voor string interpololation kan nu meerdere regels beslaan, hierdoor kunnen switch statements en LINQ-queries beter leesbaar worden:
string errorText = $"The last 24 hours a total of {
errors
.Where(item => item.OccuredAt >=
DateTime.Now.AddDays(-1))
.Count()
}
errors occured.";
Omdat C# 11 nog in preview is kunnen features nog veranderen voor de uiteindelijke release, ook kunnen features doorgeschoven worden naar een latere versie van C#.
Voor een volledige lijst van de nieuwe features kun je een kijkje nemen in de documentatie van Microsoft.