Olá! Sexta Feira, 10 de Fevereiro de 2012.



Dicas CódigoFonte.net
Segunda Feira, 01 de Dezembro 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 Março 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 » CodigoFonte.eti.br » Compre De Tudo » Meu Mural » Competiva - Criação de Sites » Todos os Direitos Reservados © 2002/2010

Procurando Notebooks, Câmeras Digitais, iPhones?

CompreDeTudo.com