Pergunta

É possível declarar parâmetros opcionais nos métodos?

Em Delphi, por exemplo, eu posso fazer algo como:

procedure Test(p1:integer;p2:integer;p3:integer = 2;p4:integer = 4)

Quando eu chamo essa função, posso chamá -la com quatro parâmetros ou com dois parâmetros:

Test(2,3); //p3 = 2,p4 = 4.
Test(2,3,4,5); //p3 = 4,p4 = 5;

Como isso é possível em C#?

Foi útil?

Solução

Receio que isso não seja possível em C# 1 a 3. No entanto, a boa notícia é que, porque tem sido um recurso muito demandado (embora certamente haja alguns que preferem não vê-lo), a Microsoft finalmente decidiu adicionar para C# 4.

A sintaxe C# 4 é a seguinte:

public static void SayHello(string s = "Hello World!")
{
    Console.WriteLine(s);
}

Uso:

SayHello(); // Prints "Hello World!"
SayHello("Hello."); // Prints "Hello."
SayHello(s: "Hello."); // Prints "Hello."

(O último exemplo usa um argumento nomeado, que realmente não é necessário neste caso, mas ajuda quando você tem vários parâmetros opcionais.)

Você pode ler mais sobre esse assunto em esta postagem do blog.

Outras dicas

Você terá que esperar por C# 4.0, que suporta parâmetros opcionais ou usa mecanismos de sobrecarga padrão:

void Test(int p1, int p2, int p3, int p4)
{ }

void Test(int p1, int p2)
{
    Test(p1, p2, 2, 4);
}

Será possível no C# 4.0, mas, até que seja lançado, você pode contorná -lo criando versões sobrecarregadas do seu método:

public void MyMethod( int a, int b, int c )
{
    ...
}

public void MyMethod( int a, int b)
{
   MyMethod(a, b, 4);
}

Você pode usar argumentos variáveis

Use a palavra -chave params.

void paramsExample(params int[] argsRest)
{

 if(argsRest.Length == 2) then...
 else if(argsRest.Length == 4) then...
 else error...

}
using System;
using System.Runtime.InteropServices;

   public static void SayHello([Optional][DefaultParameterValue("Hello Universe!")] string s)
   {
      Console.WriteLine(s);
   }

Feito! :)

Você não pode fazer isso ainda. Eu acho que é um Recurso do C# 4.0.

Você pode usar os params como uma contornar, mas isso só pode ser usado sequencialmente, não a maneira como alguns idiomas tratam os parâmetros padrão.

Você usa sobrecargas como esta

Test(int p1, int p2)
Test(int p1, int p2, int p3)

Você pode fazer com que eles chamem um método privado como este

Test(int[] ps)

e depois processe os dados.

Outra maneira de lidar com isso é não usar sobrecargas/parâmetros opcionais e, em vez disso, nomear os métodos de acordo com o que eles devem fazer - pode parecer uma troca ruim, mas seu código provavelmente ficará mais fácil de ler.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top