Métodos com argumentos indefinidos em C#
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?
1: public virtual void SetByID(object[] pkValues)
2: {
3: //Monta as cláusula Where do SQL, baseando-se na propriedade _DataKeys
4: int pkCount = 0;
5: string Where = "";
6: ClearSQLParams();
7: foreach (string s in _DataKeys)
8: {
9: Where += String.Format(" and ({0} = {1}{2}) ", s, _ParameterDefinedBy, s);
10: AddSQLParam(_ParameterDefinedBy + s, pkValues[pkCount], ParameterDirection.Input);
11: }
12: _SelectSQL = String.Format("select * from {0} where (1 = 1) {1}", _TableName, Where);
13: this.Select((CountSQLParams() > 0));
14: }
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:
1: //Declarando o array fora do método
2: object[] valores = new object[2] {"Uma String",1};
3: MinhaClasse.SetById(valores);
4:
5: //Declarando o array dentro do método
6: 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:
1: public virtual void SetByID(params object[] pkValues)
2: {
3: //Monta as cláusula Where do SQL, baseando-se na propriedade _DataKeys
4: int pkCount = 0;
5: string Where = "";
6: ClearSQLParams();
7: foreach (string s in _DataKeys)
8: {
9: Where += String.Format(" and ({0} = {1}{2}) ", s, _ParameterDefinedBy, s);
10: AddSQLParam(_ParameterDefinedBy + s, pkValues[pkCount], ParameterDirection.Input);
11: }
12: _SelectSQL = String.Format("select * from {0} where (1 = 1) {1}", _TableName, Where);
13: this.Select((CountSQLParams() > 0));
14: }
Note que a forma de utilização do argumento pkValues do mesmo dentro do método permanece a mesma. Veja como usá-lo:
1: //Usando o modificador params no método SetById
2: 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!
0 comentários:
Postar um comentário