Nota
O acesso a esta página requer autorização. Pode tentar iniciar sessão ou alterar os diretórios.
O acesso a esta página requer autorização. Pode tentar alterar os diretórios.
Este artigo descreve novas funcionalidades nas bibliotecas .NET para .NET 11. Foi atualizado pela última vez para o Preview 3.
Melhorias de cadeias e caracteres
.NET 11 introduz melhorias significativas nas APIs de manipulação de strings e caracteres, facilitando o trabalho com caracteres e runas Unicode.
Suporte a Runas em métodos de string
A String classe inclui agora métodos que aceitam Rune parâmetros, permitindo-lhe pesquisar, substituir e manipular cadeias usando valores escalares Unicode diretamente. Estes novos métodos incluem:
-
Contains- Verificar se uma cadeia contém uma runa específica: String.Contains(Rune) e String.Contains(Rune, StringComparison). -
StartsWitheEndsWith- Verifique se uma cadeia começa ou termina com uma runa específica: String.StartsWith(Rune), String.StartsWith(Rune, StringComparison), String.EndsWith(Rune), e String.EndsWith(Rune, StringComparison). -
IndexOfeLastIndexOf- Encontrar a posição de uma runa numa corda: String.IndexOf(Rune), String.IndexOf(Rune, StringComparison), String.LastIndexOf(Rune), e String.LastIndexOf(Rune, StringComparison). -
Replace- Substituir ocorrências de uma runa por outra: String.Replace(Rune, Rune). -
Split- Dividir uma corda usando uma runa como separador: String.Split(Rune, StringSplitOptions) e String.Split(Rune, Int32, StringSplitOptions). -
Trim,TrimStart, eTrimEnd- Cortar runas das cordas: String.Trim(Rune), String.TrimStart(Rune), e String.TrimEnd(Rune).
Muitos destes métodos incluem sobrecargas que aceitam um parâmetro StringComparison para comparações que respeitam as diferenças culturais.
Char.É igual a StringComparison
A Char estrutura inclui agora um Char.Equals(Char, StringComparison) método que aceita um StringComparison parâmetro, permitindo comparar personagens usando comparações culturais ou ordinais.
Suporte a runas no TextInfo
A classe TextInfo agora fornece métodos TextInfo.ToLower(Rune) e TextInfo.ToUpper(Rune) que aceitam parâmetros Rune, permitindo-lhe efetuar as conversões de casos em valores escalares Unicode individuais.
Melhorias na codificação Base64
O .NET 11 adiciona novas APIs e sobrecarrega o tipo existente Base64, fornecendo suporte abrangente para codificação e descodificação em Base64. Estas adições oferecem melhor desempenho e flexibilidade em comparação com os métodos existentes.
Novas APIs Base64
As novas APIs suportam operações de codificação e descodificação com vários formatos de entrada e saída:
- Codificação para caracteres: EncodeToChars e EncodeToString
- Codificação para UTF-8: EncodeToUtf8
- Descodificação a partir de caracteres: DecodeFromChars
- Descodificação a partir do UTF-8: DecodeFromUtf8
Estes métodos fornecem tanto métodos convenientes de alto nível (que alocam e retornam arrays ou strings) como métodos baseados em span de baixo nível (para cenários de alocação zero).
Melhorias de compressão
.NET 11 inclui várias melhorias nas APIs de compressão.
Modos de acesso às entradas do ficheiro ZIP
A ZipArchiveEntry classe agora suporta a abertura de entradas com modos específicos de acesso a ficheiros através de novas sobrecargas: ZipArchiveEntry.Open(FileAccess) e ZipArchiveEntry.OpenAsync(FileAccess, CancellationToken). Estas sobrecargas aceitam um FileAccess parâmetro e permitem-lhe abrir entradas ZIP para acesso de leitura, escrita ou leitura-escrita.
Adicionalmente, uma nova CompressionMethod propriedade expõe o método de compressão usado para uma entrada através do ZipCompressionMethod enum, que inclui valores para Stored, Deflate, e Deflate64.
Validação ZIP CRC32
Na Preview 3, ZipArchive valida o checksum CRC32 ao ler entradas ZIP. Arquivos corrompidos ou truncados que antes passavam sem erro agora geram InvalidDataException, ajudando-o a detetar problemas de integridade dos dados cedo.
Mudança de comportamento entre DeflateStream e GZipStream
A partir de .NET 11, DeflateStream e GZipStream escrevem sempre cabeçalhos e rodapés de formato no fluxo de saída, mesmo quando não há dados gravados. Isto garante que a saída é um fluxo comprimido válido de acordo com as especificações Deflate e GZip.
Anteriormente, estes fluxos não produziam qualquer saída se nenhum dado fosse escrito, resultando num fluxo de saída vazio. Esta alteração garante compatibilidade com ferramentas que esperam fluxos comprimidos devidamente formatados.
Para mais informações, consulte DeflateStream e GZipStream que escrevem cabeçalhos e rodapés para payloads vazios.
Suporte a BFloat16 no BitConverter
A BitConverter classe inclui agora métodos para converter entre BFloat16 valores e arrays de bytes ou representações de bits. Estes novos métodos incluem:
- BitConverter.GetBytes(BFloat16) - Converter um valor BFloat16 num array de bytes.
- BitConverter.ToBFloat16(Byte[], Int32) e BitConverter.ToBFloat16(ReadOnlySpan<Byte>) - Converte um array de bytes num valor BFloat16.
-
BitConverter.BFloat16ToInt16Bits(BFloat16), BitConverter.BFloat16ToUInt16Bits(BFloat16), BitConverter.Int16BitsToBFloat16(Int16) e BitConverter.UInt16BitsToBFloat16(UInt16) - Métodos para converter entre BFloat16 e a sua representação em bits como
shortouushort.
BFloat16 (Brain Floating Point) é um formato de ponto flutuante de 16 bits que é comumente usado em aprendizagem automática e computação científica.
Melhorias nas coleções
BitArray.PopCount
A BitArray classe inclui agora um BitArray.PopCount() método que devolve o número de bits definidos para true no array. Isto proporciona uma forma eficiente de contar os bits do conjunto sem ter de iterar manualmente pelo array.
Suporte IReadOnlySet em serialização JSON
A JsonMetadataServices classe inclui agora um JsonMetadataServices.CreateIReadOnlySetInfo método, permitindo suporte de serialização JSON para IReadOnlySet<T> coleções.
Constante do esquema de dados de URI
Foi adicionada uma nova Uri.UriSchemeData constante, representando o data: esquema URI. Esta constante fornece uma forma padronizada de referenciar URIs de dados.
Melhorias de atributos StringSyntax
A StringSyntaxAttribute classe inclui agora constantes para linguagens de programação comuns:
- CSharp - Indica a sintaxe C#.
- FSharp - Indica a sintaxe F#.
- VisualBasic - Indica Visual Basic sintaxe.
Estas constantes podem ser usadas com o StringSyntax atributo para fornecer melhor suporte de ferramentas para literais de strings que contêm código nestas linguagens.
Melhorias no System.Text.Json
Recuperação de informação por tipo genérico
Um padrão comum quando se trabalha com metadados de tipo System.Text.Json é recuperar um JsonTypeInfo<T> de JsonSerializerOptions.
Antes, tinha de realizar um downcast manualmente a partir do método não genérico GetTypeInfo(Type).
Novos métodos genéricos JsonSerializerOptions.GetTypeInfo<T>() e JsonSerializerOptions.TryGetTypeInfo<T>(JsonTypeInfo<T>) métodos retornam metadados fortemente tipados diretamente, eliminando o cast.
JsonSerializerOptions options = new(JsonSerializerDefaults.Web);
options.MakeReadOnly();
// Before: manual downcast required
JsonTypeInfo<MyRecord> info1 = (JsonTypeInfo<MyRecord>)options.GetTypeInfo(typeof(MyRecord));
// After: generic method returns the right type directly
JsonTypeInfo<MyRecord> info2 = options.GetTypeInfo<MyRecord>();
// TryGetTypeInfo variant for cases where the type may not be registered
if (options.TryGetTypeInfo<MyRecord>(out JsonTypeInfo<MyRecord>? typeInfo))
{
// Use typeInfo
_ = typeInfo;
}
Isto é particularmente útil ao trabalhar com geração de código-fonte, NativeAOT e cenários de serialização polimórfica onde o acesso a metadados de tipo é comum.
Nomear e ignorar as predefinições
O Preview 3 expande as opções de nomeação e ignorar disponíveis em System.Text.Json:
-
JsonNamingPolicy.PascalCase: Uma nova política incorporada de nomenclatura que converte os nomes das propriedades para PascalCase. Junta-se às políticas existentes camelCase, snake_case e kebab-case. -
Política de nomenclatura por membro: O novo
[JsonNamingPolicy]atributo permite-lhe substituir a política de nomes em propriedades ou campos individuais, dando-lhe controlo granular sem necessidade de um conversor personalizado. -
Condições de ignorar ao nível do tipo: Aplicar
[JsonIgnore(Condition = ...)]ao nível da classe ou struct define o comportamento de ignorar por defeito para todos os membros, pelo que não há necessidade de repetir o atributo em todas as propriedades anuláveis.
// Type-level JsonIgnore: all members use WhenWritingNull by default
// Per-member JsonNamingPolicy: EventName uses camelCase even though the
// serializer options use PascalCase
var options = new JsonSerializerOptions
{
PropertyNamingPolicy = JsonNamingPolicy.PascalCase
};
var data = new EventData { EventName = "Launch", Notes = null };
string json = JsonSerializer.Serialize(data, options);
Console.WriteLine(json);
// {"eventName":"Launch"} -- Notes omitted (null), EventName camel-cased
Compressão Zstandard
As APIs de compressão Zstandard fazem agora parte do System.IO.Compression namespace, juntamente com DeflateStream, GZipStream, e BrotliStream. Se referenciaste o pacote de pré-visualização anterior, remove a referência separada do pacote:
-<PackageReference Include="System.IO.Compression.Zstandard" />
A superfície da API mantém-se inalterada.
Seleção do formato do arquivo Tar
Novas sobrecargas em CreateFromDirectory e CreateFromDirectoryAsync aceitam um parâmetro TarEntryFormat, dando-te controlo direto sobre o formato do ficheiro. Anteriormente, CreateFromDirectory produzia sempre arquivos Pax. Os novos overloads suportam os quatro formatos tar — Pax, Ustar, GNU e V7 — para compatibilidade com ferramentas e ambientes específicos.
// Create a GNU format tar archive for Linux compatibility
TarFile.CreateFromDirectory("/source/dir", "/dest/archive.tar",
includeBaseDirectory: true, format: TarEntryFormat.Gnu);
// Create a Ustar format archive for broader compatibility
using Stream outputStream = File.OpenWrite("/dest/ustar.tar");
TarFile.CreateFromDirectory("/source/dir", outputStream,
includeBaseDirectory: false, format: TarEntryFormat.Ustar);
// Async version
CancellationToken cancellationToken = CancellationToken.None;
await TarFile.CreateFromDirectoryAsync("/source/dir", "/dest/archive.tar",
includeBaseDirectory: true, format: TarEntryFormat.Pax,
cancellationToken: cancellationToken);
Aperfeiçoamentos em cálculos numéricos
Desempenho Matrix4x4
Matrix4x4.GetDeterminant() agora utiliza uma implementação vetorizada por SSE, melhorando o desempenho em aproximadamente 15%.
Melhorias de I/O de baixo nível
Suporte para pipes SafeFileHandle
SafeFileHandle ganha dois novos membros no Preview 3:
-
Typepropriedade: Reporta se um handle representa um ficheiro, pipeline, socket, diretório ou outro objeto do sistema operativo, sem exigir código específico da plataforma. -
CreateAnonymousPipemétodo: Cria um par de handles de tubo anonimamente conectados com comportamento assíncrono independente para cada extremidade.
SafeFileHandle.CreateAnonymousPipe(
out SafeFileHandle readEnd,
out SafeFileHandle writeEnd,
asyncRead: true,
asyncWrite: false);
using (readEnd)
using (writeEnd)
{
// SafeFileHandle.Type reports the kind of OS object the handle refers to
Console.WriteLine(readEnd.Type); // Pipe
Console.WriteLine(writeEnd.Type); // Pipe
}
Suporte a tubos RandomAccess
RandomAccess.Read e RandomAccess.Write agora trabalham com alças não procuráveis, como pipes, além das alças regulares de ficheiros.
No Windows, o Process agora usa I/O sobreposta para stdout/stderr redirecionado, o que reduz o bloqueio do pool de threads em aplicações com muitos processos.
Melhorias em expressões regulares
Opção AnyNewLine
Uma nova flag, RegexOptions, faz com que AnyNewLine, ^ e $ tratem o conjunto completo de caracteres de nova linha Unicode como terminadores de linha—não apenas .. Isto ajuda ao analisar textos que misturam terminações de linha Windows (\r\n), Unix (\n) e específicas de Unicode (\u0085, \u2028, \u2029).
string text = "line1\r\nline2\u0085line3\u2028line4";
// RegexOptions.AnyNewLine makes ^, $, and . treat all Unicode newline
// sequences as line terminators, not just \n.
MatchCollection matches = Regex.Matches(
text,
@"^line\d$",
RegexOptions.Multiline | RegexOptions.AnyNewLine);
Console.WriteLine(matches.Count); // 4