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 stringfirstName, 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, outlastName);
- 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()
- {
- 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.
Nenhum comentário:
Postar um comentário