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.
![]() |
CodigoFonte.net » Meu Mural » Competiva - Criação de Sites » Todos os Direitos Reservados © 2002/2010 |