Olá! Friday, 19 de April de 2024.



Dicas CódigoFonte.net
Monday, 01 de December de 2008

Diferença entre parâmetros do tipo out e ref no C#

Olá pessoal,

Olhando um código num projeto, encontrei dois métodos que utilizam formas diferentes de passar um valor por referência. Em um deles encontrei o uso de "out" e no outro o uso de "ref".

Quando estamos desenvolvendo um método e precisamos retornar dois ou mais valores, precisamos utilizar a passagem de valor por referência, daí o nosso método altera o valor que foi passado e com isto permita o retorno deles.


Lembre-se que este tipo de implementação - passagem de valor por referência - deve ser usado com cuidado, pois se você tiver vários valores que devem ser retornados em um método, o melhor seria a criação de uma Struct para retorná-los.

Então, voltando ao assunto do out e ref, vou mostrar trechos de código com a implementação de cada um:

Utilizando o out

class OutExample {       // Separa uma string, que contém o primeiro e o último nome, em dois parâmetros que são passados por referência e que vão conter, respectivamente, o primeiro e o último nome.       static void SplitName(string fullName, out string firstName, out string lastName)       {             int spaceIndex = fullName.IndexOf(' ');             firstName = fullName.Substring(0, spaceIndex).Trim();             lastName = fullName.Substring(spaceIndex).Trim();       }       static void Main()       {             string fullName = "Yuan Sha";             string firstName;             string lastName;             // note que o firstName e o lastName não foram iniciados ainda, por que o parâmetro do tipo out nos garante isto.             SplitName(fullName, out firstName, out lastName);             System.Console.WriteLine("First Name '{0}'. Last Name '{1}'", firstName, lastName);       } }

E agora a implementação usando o parâmetro do tipo ref

class RefExample {       static object FindNext(object value, object[] data, ref int index)       {             // veja que é possível acessar o index, pois ele foi instanciado             while (index < data.Length)             {                   if (data[index].Equals(value))                   {                         return data[index];                   }                    index += 1;             }              return null;       }       static void Main()       {             object[] data = new object[] {1,2,3,4,2,3,4,5,3};             int index = 0; // deve ser inicializado antes de ser passado como parâmetro             while (FindNext(3, data, ref index) != null)             {                   System.Console.WriteLine("Found at index {0}", index);                   index += 1;             }             System.Console.WriteLine("Done Find");       } }

Veja que a diferença entre os dois tipos de parâmetros são bem sutis. Na passagem utilizando out, não precisamos inicializar a variável que vamos passar, diferentemente quando implementamos o ref, onde somos obrigados a instancializá-la antes de passar o parâmetro.

Ambas fazem o mesmo papel, mas de acordo com as boas práticas de programação, o recomendado é a utilização do parâmetro por referência do tipo out.

Bom pessoal, vou ficando por aqui.

Até a próxima.


Comentários do artigo [Novo comentário]

David Manck - 17 de March de 2009 - 04:38
Como vemos a RefExamples, a classe foi bolada e pesquisada assim ver em membro, assim claro em matéria, nisso em pesquisa, eu gostei dessa aparição de ótimo, e participe assim, de olhar, e claro em objetivo. Eu perdi nessa aplicação em matéria, e perde em muito, mas sem horário, e assim voltando e persegue mais, e depois de pronta boa, boa sorte, ótimo, e graças.
Para adicionar um comentário você deve efetuar o login


Gostou do CódigoFonte.net? Quer indicar a um amigo?
Preencha os campos a seguir.
Seu Nome:
Seu E-mail:
E-mail de seu Amigo:


CodigoFonte.net » Meu Mural » Competiva - Criação de Sites » Todos os Direitos Reservados © 2002/2010