Métodos com argumentos indefinidos em C#
Leonel Fraga de Oliveira 28/03/2009 11:03

Você já deu uma olhadinha de leve no método String.Format?

Se você reparar bem, em uma de suas sobrecargas você poderá passar vários argumentos separados por vírgula (parâmetros), sendo que no primeiro é a string a ser formatada e os outros argumentos são o valores que serão colocado na string do primeiro.

Para fazer a mesma coisa nos nossos métodos em que o número de argumentos pode ser um ou vários, podemos fazer isso de duas maneiras, sendo que ambas se equivalem no uso dentro do médodo em si:

1. Declarando um argumento do tipo object[]:

Vamos pegar o método SetById da classe TGenericDAL do Simple PIM?

public virtual void SetByID(object[] pkValues)
{
    //Monta as cláusula Where do SQL, baseando-se na propriedade _DataKeys
    int pkCount = 0;
    string Where = "";
    ClearSQLParams();
    foreach (string s in _DataKeys)
    {
        Where += String.Format(" and ({0} = {1}{2}) ", s, _ParameterDefinedBy, s);
        AddSQLParam(_ParameterDefinedBy + s, pkValues[pkCount], ParameterDirection.Input);
    }
    _SelectSQL = String.Format("select * from {0} where (1 = 1) {1}", _TableName, Where);
    this.Select((CountSQLParams() > 0));
}

Declaramos como argumento do método um array de object que poderá receber em seus elementos qualquer variável com qualquer tipo de dado.

Para utilizá-lo, necessitamos primeiro declarar um array e passá-lo como argumento da função, vejam:

//Declarando o array fora do método
object[] valores = new object[2] {"Uma String",1};
MinhaClasse.SetById(valores);

//Declarando o array dentro do método
MinhaClasse.SetById(new object[2] {"Uma String",1});

2. Declarando um array como argumento e utilizando o modificador params:

Voltando ao método String.Format que mencionei no início do post, note que a sobrecarga que admite argumentos indefinidos é aquela em que o argumento declarado como object[] recebe o modificador params.

Ele é um parâmetro que indica que este argumento possui um número indefinido de valores. O argumento que recebe este modificador deve ser um array e deverá também ser o último da lista de argumentos da função (caso tenha vários). Também só poderemos ter um parâmetro que usa este modificador.

Por exemplo, se tivermos apenas um argumento e este tiver o modificador params, os vários argumentos separados por vírgula serão colocados dentro do array declarado como parâmetro automaticamente e não teremos que declará-lo previamente.

Poderemos reescrever o método SetById da seguinte forma:

public virtual void SetByID(params object[] pkValues)
{
    //Monta as cláusula Where do SQL, baseando-se na propriedade _DataKeys
    int pkCount = 0;
    string Where = "";
    ClearSQLParams();
    foreach (string s in _DataKeys)
    {
        Where += String.Format(" and ({0} = {1}{2}) ", s, _ParameterDefinedBy, s);
        AddSQLParam(_ParameterDefinedBy + s, pkValues[pkCount], ParameterDirection.Input);
    }
    _SelectSQL = String.Format("select * from {0} where (1 = 1) {1}", _TableName, Where);
    this.Select((CountSQLParams() > 0));
}

Note que a forma de utilização do argumento pkValues do mesmo dentro do método permanece a mesma. Veja como usá-lo:

//Usando o modificador params no método SetById
MinhaClasse.SetById("Uma String",1);

Veja que passamos os mesmos valores para o método SetById, porém não declaramos explicitamente um array para passá-los ao método.

Bem simples, não?

Um abraço!

Leonel Fraga de Oliveira Leonel Fraga de Oliveira é formado em Processamento de Dados na Faculdade de Tecnologia de São Paulo (FATEC-SP - 2002) e anteriormente em Técnico em Eletrônica, pela ETE Professor Aprígio Gonzaga (lá em 1999).
Atualmente trabalha como Analista de Sistemas na Prefeitura Municipal de São Caetano do Sul - SP
Tem como hobbies DJing (também trabalha como DJ freelancer) e ciclismo, além da manutenção dos sites NeoMatrix Light e NeoMatrix Tech.
Gosta de música eletrônica, tecnologia, cinema (super fã de Jornada nas Estrelas), gastronomia e outras coisas mais.


Compartilhe nas redes sociais

   

Deixe seu comentário

comments powered by Disqus