Novidades do .NET 9: melhorias no tipo TimeSpan
O tipo TimeSpan é empregado comumente na plataforma .NET para definir intervalos de tempo, contando com diversas opções de métodos (iniciados por From) para produzir essas representações. Implementações como FromDays, FromHours, FromMinutes, FromSeconds, FromMilliseconds e FromMicroseconds recebem como parâmetro um valor do tipo double, gerando assim uma representação de tempo correspondente.
A utilização de valores double pode, no entanto, resultar em problemas de precisão ao trabalharmos com intervalos de tempo. Devemos lembrar que double é um tipo numérico de ponto flutuante, com a execução do código a seguir produzindo alguns resultados imprecisos:
Intervalos de tempo em segundos como 71.716, 71.829 e 71.832 exemplificam bem isso - conforme observamos em Tempo em segundos (TimeSpan):
Tempo em segundos = 71.715
Tempo em segundos (double) = 71,715
Tempo em segundos (TimeSpan) = 00:01:11.7150000 | TimeSpan.FromSeconds(value)
Tempo em segundos = 71.716
Tempo em segundos (double) = 71,716
Tempo em segundos (TimeSpan) = 00:01:11.7159999 | TimeSpan.FromSeconds(value)
Tempo em segundos = 71.829
Tempo em segundos (double) = 71,829
Tempo em segundos (TimeSpan) = 00:01:11.8289999 | TimeSpan.FromSeconds(value)
Tempo em segundos = 71.830
Tempo em segundos (double) = 71,83
Tempo em segundos (TimeSpan) = 00:01:11.8300000 | TimeSpan.FromSeconds(value)
Tempo em segundos = 71.832
Tempo em segundos (double) = 71,832
Tempo em segundos (TimeSpan) = 00:01:11.8319999 | TimeSpan.FromSeconds(value)
Buscando evitar inconsistências decorrentes do uso de double, o .NET 9 traz novas sobrecargas com parâmetros baseados em tipos inteiros para os métodos FromDays, FromHours, FromMinutes, FromSeconds, FromMilliseconds e FromMicroseconds.
Na próxima listagem temos a geração de instâncias de TimeSpan utilizando a nova sobrecarga de FromSeconds, que conta com parâmetros do tipo long para gerar uma nova representação de intervalo (linhas 25 e 26):
Ao executar esta aplicação de testes:
Podemos notar que as inconsistências não mais ocorreram ao invocar a nova sobrecarga do método FromSeconds em TimeSpan:
Essa aplicação foi disponibilizada no GitHub:
https://github.com/renatogroffe/DotNet9-ConsoleApp-TimeSpan
Caso achem útil esta solução, peço por favor um ⭐️ no repositório apoiando. Fica também o convite para que vocês me sigam lá no GitHub!