# Segindo o enunciado
Implementei 3 assinaturas diferêntes para o método Somar.
**Calculadora.cs**
internal class Calculadora
{
public static int Somar(int n1, int n2)
=> n1 + n2;
public static int Somar(int n1, int n2, int n3)
=> n1 + n2 + n3;
public static double Somar(double n1, double n2)
=> n1 + n2;
}
Percebi a importância das sobrecargas dos métodos, pois podem nos proporcionar mais flexibilidade em diversos cenários.
# Nova implementação 1
Aqui tenho apenas 2 métodos, um para calcular a soma de inteiros e um para calcular a soma de números do tipo double.
Isso já me dá uma grande vantagem, pois posso passar 2,3,8... números inteiros para serem somados com apenas um método(o mesmo vale para o uso com doubles).
O valores.Sum() irá retornar a soma de todos os números passados como parâmetro, sem a necessidade de iterar manualmente pela coleção.
**Calculadora.cs**
internal class Calculadora
{
public static int Somar(params int[] valores)
=> valores.Sum();
public static double Somar(params double[] valores)
=> valores.Sum();
}
# Nova implementação 2
Se a calculadora fosse trabalhar apenas com somas, seria possível ter uma classe genérica, que receberia o tipo durante a instanciação.
**Calculadora.cs**
internal class Calculadora2 where T : INumber
{
public static T Somar(params ReadOnlySpan numeros)
{
T total = T.Zero;
foreach (var numero in numeros)
total += numero;
return total;
}
}
O uso da interface **INumber** garante que só sejam instanciados objetos com tipos numéricos(int, double, decimal...)
**ReadOnlySpan<T>** isso garante que os dados sejam apenas lidos (read only) e também garante um ganho muito bom em termos de performance, pois os valores são lidos diretamente da Stack e eliminados quando a execução do método termina, sem precisar chamar o Garbage Collector, que também consome processamento.
**T.Zero é** um valor inicial neutro, meio que serve para ajudar o compilador a atribuir um formato correto, pois ele não sabe o que o T é incialmente.
Assim:
Se T for int, T.Zero é 0.
Se T for double, T.Zero é 0.0.
Se T for decimal, T.Zero é 0.0m.
**OBS:** Criei todos os métodos como estáticos, pois nenhum deles acessa membros de instância.