This page shows the source for this entry, with WebCore formatting language tags and attributes highlighted.


C# 10 Features


The article <a href="" author="Ken Bonny">Introducing C# 10</a> discloses some incremental but very welcome changes to the C# language in the iteration that will be released with .NET 6 in November. In no particular order: <ul> <c>field</c> in property accesses to manipulate the backing property without having to define it. This is a welcome improvement that will clean up useless boilerplate for properties that need to do something with the value before storing it (e.g. <c>field.Trim()</c>) The <c>required</c> keyword for properties in any of the supported types (e.g. <c>records</c>, <c>classes</c>, <c>structs</c>, or <c>struct records</c>). This lets types enforce initialization without forcing a constructor parameter. The compiler will force callers to initialize the property in the object initializer instead. <c>record struct</c> for records that are value instead of reference types <c>operator</c> overloads in <c>records</c> The <c>with</c> operator will work with anonymous classes as well as declared types. <c>global usings</c> for commonly used namespaces (e.g. <c>System</c>) to cut down on clutter in files <c>namespace</c> without braces will put all types in that file into that namespace. This cuts down on an indenting level in all files. Improvements to lambdas: attributes on parameters and return types, explicit return types Static methods on <c>interfaces</c> (to round out the default-implementation feature introduced in C# 9) Constant interpolated <c>strings</c> <hl>Update from <a href="" source="Medium" author="Matthew MacDonald">A Closer Look at 5 New Features in C# 10</a>:</hl> Introduce <c>!!</c> suffix for method arguments that instructs the compiler to generated a null-check for that argument. So, <c>string</c> is not nullable, but not checked (i.e.g the developer is responsible for including a check to avoid a <c>NullReferenceException</c> if one slips past the compiler), <c>string?</c> is nullable, and <c>string!!</c> is not nullable <i>and</i> checked. This will avoid a ton of boilerplate argument-checks. Can't wait. </ul> I really appreciate how the changes build on changes that came in previous versions. There's a very noticeable direction that they're pulling in with these languages changes: <ul> Being able to write performant code (records, refs, etc.) Cutting down on boilerplate for common use cases (records, field, pattern-matching. etc.) Being able to write maintainable, backwards-compatible code (interface default methods, etc.) Improving type system (covariant returns, etc.) Turning runtime issues into compile-time issues (nullability, etc.) </ul> For more information, see the <a href="" source="GitHub">csharplang/proposals/</a> folder. Some of the C# 10 features are in the main folder rather in the <c>csharp-10.0/</c> folder.