.NET 6 dovršuje sjednocení s mobilním a desktopovým vývojem. Zavádí takzvaný Target framework moniker (TFM), který určuje, že projekt cílí na konkrétní SDK. Například cílení pro iOS se zapisuje jako net6.0-ios
. Dříve TFM popisoval určitou verzi .NETu, případně jeho klon upravený pro konkrétní platformu. To se ale teď mění. Všechny platformy sdílí jeden .NET a specifické API konkrétních platforem, které je přístupné přes SDK, se uvádí za pomlčkou.
HTTP/3
Webové vývojáře určitě potěší experimentální podpora HTTP/3, protože .NET má v sobě zahrnutou implementaci protokolu QUIC. Ten přináší rychlejší navazování spojení, které se nepřeruší, pokud se zařízení klienta zrovna přepojilo z Wi-Fi sítě na mobilní síť (nebo naopak).
CLI trimming
Common Intermediate Language trimming je věc známá programátorům, kteří znají Xamarin. Používá se celkem běžně ke zmenšení velikosti výsledné aplikace. Její součástí je totiž celý .NET framework, což činí určité obtíže, když se má vaše aplikace pravidelně aktualizovat přes mobilní data. Nepoužívané části frameworku (jednotlivé .dll soubory) se proto v sestavení vynechaly. Teď se jde až na úroveň jednotlivých tříd. Pokud kompilujete pro konkrétní instrukční sadu a používáte tuto funkci, nezapomeňte si pročíst dokumentaci o tom, jak označit kusy kódu tak, aby je kompilátor nevynechal.
Prioritní fronta
Je to trochu zvláštní, ale prioritní fronty jsou součástí .NET až od verze 6. Najdete ji ve známém jmenném prostoru:
using System.Collections.Generic;
var queue = new PriorityQueue<TElement,TPriority>();
Periodic timer
V ASP.NET Core aplikacích existují úlohy na pozadí, které často v určitém intervalu provádějí určitou rutinu. Časovač, který rutinu periodicky spouštěl, se musel nějakým způsobem navázat na CancellationToken
. Dříve jste pro tento účel museli použít nějaký NuGet balíček, nebo si naprogramovat vlastní jednoduchý časovač. Nyní je však k dispozici třída PeriodicTimer
, která s ním umí pracovat:
public class TimedHostedService : BackgroundService {
private readonly ILogger<TimedHostedService> logger;
public TimedHostedService(ILogger<TimedHostedService> logger) {
this.logger = logger;
}
protected override async Task ExecuteAsync(CancellationToken stoppingToken) {
logger.LogInformation("Timed Hosted Service running.");
using var timer = new PeriodicTimer(TimeSpan.FromSeconds(1));
try {
do {
...
} while (await timer.WaitForNextTickAsync(stoppingToken));
} catch (OperationCanceledException) {
logger.LogInformation("Timed Hosted Service is stopping.");
}
}
}
Co je nového v C# 10?
Interpolated strings
Vezměme si například sestavování chybové hlášky:
var error = "stack overflow"
var message = string.Format("Error: {0}", error);
Stejnou věc nyní můžeme zapsat jednodušeji:
var error = "stack overflow"
var message = $"Error: {error}";
Ještě si uveďme, jak v takovém řetězci zapsat složené závorky:
var str = $"function showMessage(message) {{ window.alert(message); }}";
Top level statements
Dosud byl každý program v .NETu spouštěn metodou Main
ve třídě Program
(která ani nemusela být statická). To se teď mění a soubor Program.cs
teď nemusí obsahovat ani metodu, ani třídu, ani jmenný soubor. Může vypadat více jako skript:
Console.WriteLine("Hello World!");
Global usings
Program na svém začátku už nemusí uvádět using System;
, protože C# má teď novou deklaraci global using
. Ta říká, že jmenný prostor neplatí jen pro konkrétní soubor, ale pro celý projekt. Důležitou vlastností je, že se tato deklarace přejímá i z SDK, které projekt používá. Takže například Microsoft.NETCore.App
vám ke každému souboru v projektu přidá:
using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Net.Http;
using System.Threading;
using System.Threading.Tasks;
Které global usings váš projekt používá se ve Visual Studio dozvíte ve vlastnostech projektu v sekci Global Usings. Můžete si tam další jmenné prostory i přidat. V tom případě se uloží do souboru projektu (.csproj
).
Nezapomeňte si také přečíst tradiční souhrn výkonnostních vylepšení.