Nota: Essa pergunta foi feita no momento em que o C # ainda não suportava parâmetros opcionais (ou seja, antes do C # 4).
Estamos criando uma API da web gerada programaticamente a partir de uma classe C #. A classe possui método GetFooBar(int a, int b)
e a API possui um método GetFooBar
que utiliza parâmetros de consulta como &a=foo &b=bar
.
As classes precisam suportar parâmetros opcionais, que não são suportados em C # no idioma. Qual é a melhor abordagem?
c#
optional-parameters
Kalid
fonte
fonte
Respostas:
Surpreendido, ninguém mencionou parâmetros opcionais do C # 4.0 que funcionam assim:
Edit: Eu sei que no momento em que a pergunta foi feita, o C # 4.0 não existia. Mas essa pergunta ainda ocupa a primeira posição no Google por "argumentos opcionais em C #", então pensei - essa resposta vale a pena estar aqui. Desculpa.
fonte
Outra opção é usar a palavra-chave params
Chamado como ...
fonte
public void log (params object[] args){ StringBuilder sb = new StringBuilder(); for (int i = 0; i < args.Length; i++){ sb.Append("{"); sb.Append(i.ToString()); sb.Append("}"); sb.Append(" "); } String.Format(sb.ToString(),args).Dump(); }
Chamada de exemplo:log("...Done,",(watch.ElapsedMilliseconds/1000).ToString(),"s");
Em C #, normalmente eu usaria várias formas do método:
UPDATE: Isso mencionado acima foi da maneira que eu fiz os valores padrão com o C # 2.0. Os projetos nos quais estou trabalhando agora estão usando o C # 4.0, que agora suporta diretamente parâmetros opcionais. Aqui está um exemplo que acabei de usar no meu próprio código:
fonte
A partir deste site:
http://www.tek-tips.com/viewthread.cfm?qid=1500861&page=1
O C # permite o uso do atributo [Opcional] (do VB, embora não seja funcional no C #). Então você pode ter um método como este:
Em nosso wrapper de API, detectamos parâmetros opcionais (ParameterInfo p.IsOptional) e configuramos um valor padrão. O objetivo é marcar os parâmetros como opcionais, sem recorrer a kludges como ter "opcional" no nome do parâmetro.
fonte
Você pode usar a sobrecarga de método ...
Depende das assinaturas do método, o exemplo que dei foi o único método "int b", porque ele teria a mesma assinatura do método "int a".
Você pode usar tipos anuláveis ...
Você pode verificar, usando a.HasValue, para ver se um parâmetro foi definido.
Outra opção seria usar um parâmetro 'params'.
Se você quiser ir com parâmetros nomeados, precisará criar um tipo para lidar com eles, embora eu ache que já exista algo parecido com isso para aplicativos da web.
fonte
Você pode usar parâmetros opcionais no C # 4.0 sem preocupações. Se tivermos um método como:
Quando você chama o método, pode pular parâmetros como este:
O C # 4.0 implementa um recurso chamado "parâmetros nomeados", você pode realmente passar parâmetros pelos nomes deles e, é claro, pode passar parâmetros na ordem que desejar :)
fonte
Olá Mundo Opcional
Se você deseja que o tempo de execução forneça um valor de parâmetro padrão, é necessário usar a reflexão para fazer a chamada. Não é tão bom quanto as outras sugestões para esta pergunta, mas compatível com o VB.NET.
fonte
Uma maneira fácil que permite omitir qualquer parâmetro em qualquer posição , é aproveitar os tipos anuláveis da seguinte maneira:
As strings já são tipos anuláveis, portanto não precisam do ? .
Depois de usar esse método, as seguintes chamadas serão válidas :
Ao definir um método dessa maneira, você tem a liberdade de definir apenas os parâmetros desejados, nomeando- os. Consulte o link a seguir para obter mais informações sobre parâmetros nomeados e opcionais:
Argumentos nomeados e opcionais (Guia de Programação em C #) @ MSDN
fonte
Eu concordo com stephenbayer. Porém, como é um serviço da web, é mais fácil para o usuário final usar apenas uma forma do método da web, do que usar várias versões do mesmo método. Eu acho que nessa situação os Tipos Nullable são perfeitos para parâmetros opcionais.
fonte
parâmetros opcionais são para métodos. se você precisa de argumentos opcionais para uma classe e você é:
using c # 4.0: use argumentos opcionais no construtor da classe, uma solução que eu prefiro, já que é mais próxima do que é feito com os métodos, mais fácil de lembrar. aqui está um exemplo:
usando versões do c # anteriores ao c # 4.0: você deve usar o encadeamento de construtores (usando a: esta palavra-chave), onde construtores mais simples levam a um "construtor principal". exemplo:
fonte
A maneira típica de lidar com isso em C # como stephen mencionado é sobrecarregar o método. Ao criar várias versões do método com parâmetros diferentes, você efetivamente cria parâmetros opcionais. Nos formulários com menos parâmetros, você normalmente chamaria o formulário do método, com todos os parâmetros configurando seus valores padrão na chamada para esse método.
fonte
Você pode sobrecarregar seu método. Um método contém um parâmetro
GetFooBar(int a)
e o outro contém os dois parâmetros,GetFooBar(int a, int b)
fonte
Usando sobrecargas ou usando C # 4.0 ou superior
fonte
Para um número maior de parâmetros opcionais, um único parâmetro de Dictionary pode ser usado com o método ContainsKey. Eu gosto dessa abordagem porque ela permite que eu passe uma lista ou um T individualmente sem precisar criar outro método (bom se parâmetros forem usados como filtros, por exemplo).
Exemplo (o novo Dicionário <string, Object> () seria passado se nenhum parâmetro opcional fosse desejado):
fonte
Em vez de parâmetros padrão, por que não apenas construir uma classe de dicionário a partir da string de consulta passada .. uma implementação que é quase idêntica à maneira como os formulários do asp.net funcionam com as querystrings.
ie Request.QueryString ["a"]
Isso separará a classe da folha do código de fábrica / padrão.
Você também pode querer verificar Serviços da Web com o ASP.NET . Serviços da Web são uma API da Web gerada automaticamente por atributos em classes C #.
fonte
Um pouco atrasado para a festa, mas eu estava procurando a resposta para essa pergunta e, finalmente, descobri outra maneira de fazer isso. Declare que os tipos de dados para os argumentos opcionais do seu método da web sejam do tipo XmlNode. Se o arg opcional for omitido, ele será definido como nulo e, se estiver presente, você poderá obter o valor da string chamando arg.Value, ou seja,
O que também é decente nessa abordagem é a página inicial gerada pelo .NET para o ws ainda mostra a lista de argumentos (embora você perca as úteis caixas de entrada de texto para teste).
fonte
Eu tenho um serviço web para escrever que leva 7 parâmetros. Cada um é um atributo de consulta opcional para uma instrução sql agrupada por este serviço da web. Portanto, duas soluções alternativas para parâmetros não opcionais vêm à mente ... ambas muito ruins:
method1 (param1, param2, param 3, param 4, param 5, param 6, param7) method1 (param1, param2, param3, param 4, param5, param 6) method1 (param1, param2, param3, param4, param5, param7) ) ... comece a ver a foto. Dessa maneira está a loucura. Maneiras demais.
Agora, para uma maneira mais simples que parece estranha, mas deve funcionar: method1 (param1, bool useParam1, param2, bool useParam2, etc ...)
Essa é uma chamada de método, são necessários valores para todos os parâmetros e ele lidará com cada caso dentro dele. Também está claro como usá-lo na interface.
É um truque, mas vai funcionar.
fonte
Eu tive que fazer isso em um serviço da Web VB.Net 2.0. Acabei especificando os parâmetros como seqüências de caracteres e depois convertendo-os para o que eu precisasse. Um parâmetro opcional foi especificado com uma sequência vazia. Não é a solução mais limpa, mas funcionou. Apenas tome cuidado para capturar todas as exceções que possam ocorrer.
fonte
Por precaução, se alguém quiser passar um retorno de chamada (ou
delegate
) como um parâmetro opcional, poderá fazê-lo dessa maneira.Parâmetro de retorno de chamada opcional:
fonte
parâmetros opcionais nada mais são do que parâmetros padrão! Eu sugiro que você dê os dois parâmetros padrão. GetFooBar (int a = 0, int b = 0) se você não tiver nenhum método sobrecarregado, resultará em a = 0, b = 0 se você não passar nenhum valor, se você passar um valor, resultará em , passou o valor para a, 0 e se você passar 2 valores, o primeiro será atribuído a e o segundo a b.
espero que responda sua pergunta.
fonte
No caso em que os valores padrão não estão disponíveis, a maneira de adicionar um parâmetro opcional é usar a classe .NET OptionalAttribute - https://docs.microsoft.com/en-us/dotnet/api/system.runtime.interopservices.optionalattribute ? view = netframework-4.8
Exemplo do código está abaixo:
fonte
Você pode tentar isso também,
tipo 1
public void YourMethod(int a=0, int b = 0) { //some code }
Tipo 2
public void YourMethod(int? a, int? b) { //some code }
fonte