Spickzettel

.NET 7.0 und C# 11.0

.NET 7.0 und C# 11.0

Spickzettel

.NET 7.0 und C# 11.0


.NET 7 im Überblick

schwichtenberg_cheatSheet_1.tif_fmt1.jpg

Neue .NET-SDK-CLI-Befehle in .NET 7.0

Online-Suche auf NuGet.org nach Projektvorlagen:

Bisher: dotnet new blazor --search --language C# --author xy

Nun auch: dotnet new search blazor --language C# --author xy

Installieren einer Projektvorlage von NuGet.org:

Bisher: dotnet new --install PACKAGE_ID

Nun auch: dotnet new install PACKAGE_ID

Liste aller installierten Projektvorlagen:

Bisher: dotnet new --list

Nun auch: dotnet new list

Deployment direkt in Container ohne Dockerfile:

dotnet add package Microsoft.NET.Build.Containers
dotnet publish --os linux --arch x64 -c Release -p:PublishProfile=DefaultContainer

.NET 7.0: Generische Mathematik mit INumber<T> u. a.

T Calc<T>(T x, T y) where T : INumber<T> {
  Trace.WriteLine($"Calc {x.GetType().ToString()}/{y.GetType().ToString()}");
  if (x == T.Zero || y <= T.Zero) return T.One;
  return (x + y) * T.CreateChecked(42.24);
}

Diese generische Funktion kann mit beliebigen numerischen Typen aufgerufen werden:

Console.WriteLine(Calc(1, 2)); // Byte -> 126
Console.WriteLine(Calc((Int128)1, (Int128)2)); // -> 126
Console.WriteLine(Calc(1.0d, 2.0d)); // Double -> 126,72
Console.WriteLine(Calc(1.0m, 2.0m)); // Decimal -> 126,720

Native Ahead-of-Time-Compilation (AOT)

In .csproj-Datei, leider nur für Konsolenanwendungen und DLLs!

<PropertyGroup>
  <PublishAot>true</PublishAot>
</PropertyGroup>

Kompilierung:

dotnet publish -r win-x64 -c Release

.NET 7.0: Microseconds und Nanoseconds

Neue Eigenschaften Microseconds und Nanoseconds bei den Klassen TimeStamp, DateTime, DateTimeOffset und TimeOnly:

TimeSpan ts = endeZeitunkt - startZeitunkt;
Console.WriteLine(ts.TotalMilliseconds + " ms"); // 1sek = 1000 ms
Console.WriteLine(ts.TotalMicroseconds + " µs"); // 1ms = 1000 µs
Console.WriteLine(ts.TotalNanoseconds + " ns"); // 1µs = 1000 ns
Console.WriteLine(ts.Ticks + " ticks"); // 1ns = 100 Ticks

.NET 7.0: Platform Invoke Source Code Generator

public static partial class Win32API {
  [LibraryImport("User32.dll")]
  [return: MarshalAs(UnmanagedType.Bool)]
  public static partial bool MessageBeep(UInt32 beepType);
}

Aufruf dann:

Win32API.MessageBeep(10);

.NET 7.0: Tarball-Archive (TAR)

TAR-Archiv mit GZip-Komprimierung aus dem Verzeichnis erstellen:

string folder = @"T:\Dokumente";
string tar = @"T:\ArchivKomprimiert.tar.gz";
using (MemoryStream ms = new()) {
  using (TarWriter writer = new(ms, TarEntryFormat.Pax, leaveOpen: true))  {
    foreach (var file in new System.IO.DirectoryInfo(folder).GetFiles())  {
      writer.WriteEntry(fileName: file.FullName, entryName: file.Name);
    }
  }
  using FileStream tarstream = File.Create(tar);
  using GZipStream compressor = new(tarstream, CompressionMode.Compress);
  ms.Seek(0, SeekOrigin.Begin);
  ms.CopyTo(compressor);
  ms.Close();
}

Komprimiertes TAR in ein Verzeichnis extrahieren:

using (FileStream fs = File.OpenRead(tar)) {
  using GZipStream decompressor = new(fs, CompressionMode.Decompress);
  using TarReader reader = new(decompressor, leaveOpen: false);
  TarEntry? entry;
  while ((entry = reader.GetNextEntry(copyData: true)) != null)  {
    string destFileName = Path.Join(folder, entry.Name);
    entry.ExtractToFile(destinationFileName, overwrite: true);
  }
}

.NET 7.0 LINQ: Order() und OrderDescending()

var data = new List<int>() { 2, 1, 3 };
var sortedAlt = data.OrderBy(e => e); 
var sortedDescAlt = data.OrderByDescending...