Está sobrecarregando a única maneira de ter padrão de argumentos da função em C#?
-
09-06-2019 - |
Pergunta
É verdade que a única maneira de lidar com padrão de argumentos da função é através da função de sobrecarga?
Por exemplo, em PHP eu posso fazer isso:
function foo($x, $y=0)
{
}
Seria a melhor maneira de lidar com isso em C# ser isso?
void foo(int x)
{
foo(x, 0);
}
void foo(int x, int y)
{
}
Exemplo levantada a partir daqui
Editar
Feita a C# exemplo em C# (Graças Blair Conrad)
Solução
Sim, que ia ser melhor, exceto que você gostaria de omitir o , como outros já apontaram.Para os interessados na justificativa de falta de valores de parâmetro padrão, consulte @Giovanni Galbo explicação.$
s sobre o parâmetro de nomes
Outras dicas
Apenas para satisfazer a uma curiosidade:
A partir de Por que não C# suporte parâmetros padrão?:
Em linguagens como C++, um valor padrão pode ser incluído como parte da declaração do método:
Processo de anulação(Empregado, empregado, bool bônus = false)
Este método pode ser chamado com:
um.Processo(empregado, true);
ou
um.Processo(empregado);
no segundo caso, o parâmetro de bônus é definida como false.
C# não tem esse recurso.
Uma razão que não têm esta característica está relacionada a uma implementação específica do recurso.Em C++ mundo, quando o usuário escreve:
um.Processo(empregado);
o compilador gera
um.processo(empregado, false);
Em outras palavras, o compilador assume o valor padrão especificado no método de protótipo e coloca-lo na chamada de método - é como se o usuário escreveu, 'false' como o segundo parâmetro.Não há nenhuma maneira para alterar o valor padrão, sem forçar o usuário da classe de recompilar, o que é lamentável.
A sobrecarga modelo funciona melhor em relação a isso.O quadro de autor apenas define dois métodos separados, e o único parâmetro de uma chama os dois parâmetros do método.Isso mantém o valor padrão do framework, onde poderá ser modificado, se necessário.
Seria possível para um compilador para tomar algo como o C++ definição e produzir as sobrecargas, mas existem alguns problemas com essa abordagem.
A primeira é que a correlação entre o código que o usuário escreve e o código que o compilador gera é menos óbvio.Em geral, tentamos limitar magia quando possível, uma vez que torna mais difícil para os programadores.O segundo problema tem a ver com coisas como XML doc comentários e intellisense.O compilador teria que ter regras especiais como ela gera doc comentários de métodos sobrecarregados, e intellisense precisa ter inteligência para recolher os métodos sobrecarregados em um único método.
Escrito sobrecargas de si mesmo é um pouco menos conveniente, mas acho que é uma solução aceitável.
Sobre o trecho do c# faq:
A maioria dos problemas listados foram resolvidas por VB.Net (especificamente o intellisense e comentários xml problemas), o que significa que eles estão realmente vermelho arenques-- há um código disponível para a equipe do C# que vai resolver o problema.
Outra razão tem a ver com a forçar um usuário de uma classe para a re-compilar, mas isso é um pouco de um arenque vermelho, muito.Se você mudança um valor padrão na sua estrutura de classe e o usuário faz não tem que recompilar, você corre o risco de usuário não sabendo que o valor padrão alterado. Agora você tem um potencial erro no código que não comparecer até o tempo de execução.Em outras palavras, a alternativa de sobrecarregar a função é, pelo menos tão mau.Claro, isso também pressupõe uma implementação específica do recurso, mas é a implementação sugerida no faq.
Portanto, você tem que pesar o restante razão ("tente limitar a magia") vs o fato de que ele reconhece) que escrever as sobrecargas "é um pouco menos conveniente".Pessoalmente, eu digo colocar o recurso, e permitir que o programador decidir se quer ou não usá-lo.
Padrão argumentos são parte do C++, mas a partir do C# 3.5 padrão argumentos ainda não há suporte-- você terá a sobrecarga.Eles já estão disponíveis no VB.Net desde a 1.0.
Sim.
Ou pelaria.
Ou abstraindo-se em uma classe e usando os valores padrão lá.
Não, AFAIK C# não oferece suporte a substituir, e sim, que é o modo recomendado de realizar o mesmo efeito.
Como apontado, este não está disponível em C#, porém eles vão estar presentes dentro do C# 4.0 como Sam Ng discute em seu blog:
doe isso não fazer o trabalho?
void foo(int x):this(x, 0){}
void foo(int x, int y){
// code here
}