cs11dotnet7/docs/previews
2022-08-25 11:00:42 +01:00
..
README.md Initial commit 2022-08-25 11:00:42 +01:00

Previews

Preliminary drafts of C# 11 and .NET 7 - Modern Cross-Platform Development Fundamentals were written and tested with .NET 7 Preview 1. Microsoft will release monthly previews until August, then two release candidates in September and October with Go Live licenses, before the general availablility (GA) release on 8 November 2022. Each month I will add new content to this page that will then be added to the final drafts in September.

Chapter 1 - Hello, C#! Welcome, .NET!

Command Line Interface commands

In .NET 7 Preview 2 and later, dotnet commands do not need to be prefixed with hyphens.

For example, to list the currently installed templates before:

dotnet new --list

After:

dotnet new list

Note: Since I want to ensure that .NET 6 developers can follow the examples in the book, and Microsoft will support the use of hyphenated commands for a while, the book will continue to use the hyphenated commands but with a note that they are optional in .NET 7 and later.

Line breaks in interpolated strings

One of my favorite new language features because it helps with printed code!

Before C# 11, breaking an interpolated string in the middle of the double-quotes or in the middle of a curly-brace expression gives compile errors, as shown in the following code:

string message1 = $"Total number of 
    fruit is {apples.Count}.";

string message2 =
  $"Total number of fruit is {apples.Count 
    + oranges.Count}";

With C# 11, the above will compile. Finally!

Chapter 5 - Building Your Own Types with Object-Oriented Programming

List pattern matching

Any type that has an indexer, and Length and Count properties (like arrays and any type that implements ICollection) can use list pattern matches.

int[] numbers = { 1, 2, 3, 5, 7, 11 };

string message = numbers switch
{
  [ 1, 2, 3, 5, 7, 11 ] => "This is an exact match.",
  [ 1, 2, _, _, 7, _ ]  => "This is a wildcard match.",
  [1, 2, .., 11]        => "This is a slice match.",
  _                     => "This is NOT a match." 
};

To use slice matches, the type must have an indexer that accepts a Range parameter, or implements a Slice(int, int) method.

Chapter 8 - Working with Common .NET Types

More efficient regular expressions

In .NET 7 Preview 2 and later, you can use a more efficient Regex source generator.

Before:

public class Foo
{
  public Regex regex = new Regex(@"abc|def", RegexOptions.IgnoreCase);

  public bool Bar(string input)
  {
    bool isMatch = regex.IsMatch(input);
    // ..
  }
}

After:

public partial class Foo  // <-- Make the class a partial class
{
  [RegexGenerator(@"abc|def", RegexOptions.IgnoreCase)] // <-- Add the RegexGenerator attribute and pass in your pattern and options
  public static partial Regex MyRegex(); //  <-- Declare the partial method, which will be implemented by the source generator

  public bool Bar(string input)
  {
    bool isMatch = MyRegex().IsMatch(input); // <-- Use the generated engine by invoking the partial method.
    // ..
  }
}