Start Debugging
2025-01-02 Atualizado 2025-01-07 csharp-13csharpdotnetdotnet-9 Edit on GitHub

C# 13: Use coleções params com qualquer tipo de coleção reconhecido

C# 13 estende o modificador params para além de arrays e suporta Span, ReadOnlySpan, IEnumerable e outros tipos de coleção, reduzindo boilerplate e melhorando a flexibilidade.

O modificador params no C# foi tradicionalmente associado a tipos array, permitindo que métodos aceitassem um número variável de argumentos. No entanto, a partir do C# 13, você pode usar coleções params com uma variedade de tipos de coleção, ampliando sua aplicabilidade e tornando seu código ainda mais versátil.

Tipos de coleção suportados

O modificador params agora funciona com diversos tipos de coleção reconhecidos, incluindo:

Além disso, você pode usar params com as seguintes interfaces do sistema:

Um exemplo prático: usando Spans com params

Uma das possibilidades empolgantes com este aprimoramento é a capacidade de usar spans como parâmetros params. Aqui está um exemplo:

public void Concat<T>(params ReadOnlySpan<T> items)
{
    for (int i = 0; i < items.Length; i++)
    {
        Console.Write(items[i]);
        Console.Write(" ");
    }

    Console.WriteLine();
}

Neste método, params permite passar um número variável de spans para o método Concat. O método processa cada span em sequência, demonstrando a flexibilidade aprimorada do modificador params.

Comparação com o C# 12.0

Em versões anteriores do C#, a palavra-chave params só suportava arrays, exigindo que os desenvolvedores convertessem manualmente outros tipos de coleção em arrays antes de passá-los para um método que usasse params. Esse processo adicionava boilerplate desnecessário, como criar arrays temporários ou chamar métodos de conversão explicitamente.

Exemplo sem o novo recurso (Pré-C# 13)

void PrintValues(params int[] values)
{
    foreach (var value in values)
    {
        Console.WriteLine(value);
    }
}

var list = new List<int> { 1, 2, 3 };

// Manual conversion to array
PrintValues(list.ToArray());

Exemplo com o novo recurso (C# 13)

void PrintValues(params IEnumerable<int> values)
{
    foreach (var value in values)
    {
        Console.WriteLine(value);
    }
}

var list = new List<int> { 1, 2, 3 };

// No conversion needed
PrintValues(list);

O novo recurso reduz boilerplate ao:

  1. Eliminar a conversão manual – não é necessário converter explicitamente coleções como List<T> ou IEnumerable<T> em arrays.
  2. Tornar o código mais simples – chamadas de método ficam mais limpas e legíveis, aceitando diretamente tipos de coleção compatíveis.
  3. Melhorar a manutenibilidade – reduz código repetitivo e propenso a erros, focando apenas na lógica em vez de lidar com conversões.

Comportamento do compilador e resolução de sobrecarga

A introdução de coleções params significa ajustes no comportamento do compilador, particularmente no que diz respeito à resolução de sobrecarga. Quando um método inclui um parâmetro params de um tipo de coleção não-array, o compilador avalia a aplicabilidade tanto da forma normal quanto da forma expandida do método.

Tratamento de erros e melhores práticas

Sempre que usar params, é importante seguir as melhores práticas para evitar erros comuns:

Para mais detalhes, você pode consultar a especificação do recurso.

Comments

Sign in with GitHub to comment. Reactions and replies thread back to the comments repo.

< Voltar