Está sobrecarregando a única maneira de ter padrão de argumentos da função em C#?

StackOverflow https://stackoverflow.com/questions/40090

  •  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)

Foi útil?

Solução

Sim, que ia ser melhor, exceto que você gostaria de omitir o $s sobre o parâmetro de nomes, como outros já apontaram.Para os interessados na justificativa de falta de valores de parâmetro padrão, consulte @Giovanni Galbo explicação.

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:

http://blogs.msdn.com/samng/archive/2009/02/03/named-arguments-optional-arguments-and-default-values.aspx

doe isso não fazer o trabalho?

void foo(int x):this(x, 0){}

void foo(int x, int y){
 // code here
}
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top