|
Este artigo apresenta cinco recursos da plataforma .NET que podem facilitar o desenvolvimento do seu código no dia a dia. |

var paises = new Dictionary<string, string> { ["BR"] = "Brasil", ["US"] = "Estados Unidos", ["JP"] = "Japão" }; |
using System.Collections.Frozen; var paises = new Dictionary<string, string> { ["BR"] = "Brasil", ["US"] = "Estados Unidos", ["JP"] = "Japão" }.ToFrozenDictionary(); |
public class ServicoAssinatura { public bool EstaExpirado(DateTime dataExpiracao) { return dataExpiracao < DateTime.UtcNow; } } |
public class ServicoAssinatura { private readonly TimeProvider _provedorTempo; public ServicoAssinatura(TimeProvider provedorTempo) { _provedorTempo = provedorTempo; } public bool EstaExpirado(DateTime dataExpiracao) { return dataExpiracao < _provedorTempo .GetUtcNow() // GetUtcNow() .UtcDateTime; } } |
using Microsoft.Extensions.Time.Testing; // Importante! using Xunit; public class TestesServicoAssinatura { [Fact] public void Deve_Identificar_Assinatura_Expirada() { // 1. Instância do FakeTimeProvider vinda do pacote de testes var tempoFalso = new FakeTimeProvider(); // 2. Define o tempo fictício fixo tempoFalso.SetUtcNow(new DateTimeOffset(new DateTime(2026, 1, 1, 0, 0, 0, DateTimeKind.Utc))); // 3. Injeta a abstração na classe var servico = new ServicoAssinatura(tempoFalso); // 4. Executa a verificação var dataExpiracaoAntiga = new DateTime(2025, 12, 31, 23, 59, 59, DateTimeKind.Utc); bool resultado = servico7.EstaExpirado(dataExpiracaoAntiga); Assert.True(resultado); } } |
while (!cancellationToken.IsCancellationRequested) { await RefreshCacheAsync(); await Task.Delay(TimeSpan.FromMinutes(5),cancellationToken); } |
var timer = new PeriodicTimer(TimeSpan.FromMinutes(5)); while (await timer.WaitForNextTickAsync(cancellationToken)) { await RefreshCacheAsync(); } |
Channel<T> no C# é uma estrutura de dados de
sincronização do namespace
System.Threading.Channels usada para
passar dados de forma assíncrona entre produtores e consumidores. Ele funciona
como uma fila em memória de alto desempenho, ideal para gerenciar tarefas em
segundo plano e cenários com múltiplas threads
public class OrderService { private readonly Channel<Order> _channel; public OrderService(Channel<Order> channel) { _channel = channel; } public async Task CreateOrderAsync(Order order) { // Salvar pedido... await _channel.Writer.WriteAsync(order); } } |
public class EmailWorker : BackgroundService { private readonly Channel<Order> _channel; public EmailWorker(Channel<Order> channel) { _channel = channel; } protected override async Task ExecuteAsync( CancellationToken stoppingToken) { await foreach (var order in _channel.Reader .ReadAllAsync(stoppingToken)) { await SendConfirmationEmail(order); } } } |
ValueTask
é uma estrutura (struct)
criada para melhorar o desempenho de códigos assíncronos, evitando o uso
desnecessário de memória em operações que frequentemente terminam de forma
imediata (síncrona). Ela funciona como uma alternativa mais leve ao tradicional
Task.| public async
Task<User?> GetUserAsync(int id) { return await repository.GetAsync(id); } |
public ValueTask<User?> GetUserAsync(int id) { if (_cache.TryGetValue(id, out var user)) { return ValueTask.FromResult(user); } return new ValueTask<User?>( LoadFromDatabaseAsync(id)); } |
E estamos conversados
..
"Eu me deitei e dormi; acordei, porque o Senhor me
sustentou."
Salmos 3:5
Referências: