Existem três formas principais de passar parâmetros para métodos em C#.
Modo comum
O modo mais utilizado e também o mais comum, é sem usar nenhum tipo de palavra-chave que modifique os parâmetros:
void MyMethod(Aluno objAluno, int num)
{
num += 5;
objAluno.Nome = "João";
}
No exemplo acima, o método tem dois parâmetros, um objeto Aluno e um inteiro. Observe que não existe diferente entre a passagem de valor, o inteiro, e a referencia, o objeto. Mas quaisquer operações realizadas em um tipo de valor não serão refletidas na variável original, mas no tipo de referencia sim.
int myInt = 8;
Aluno oAluno = new Aluno();
oAluno.Nome = "Mike";
MyMethod(oAluno, myInt);
No exemplo acima, o valor de oAluno será modificado, mas da variável myInt não.
Passagem por referência
Por padrão, todos os parâmetros são passados por valor (como vimos acima isto não se aplica a tipos de referência). Assim, as operações dentro do método não podem modificar a variável original.
Alternativamente, os parâmetros podem ser passados por referência, usando a palavra-chave ref:
void MyMethod(ref int num)
{
num += 5;
}
E seus valores serão alterados pelo método:
int myInt = 8;
MyMethod(ref myInt);
Note que além de utilizar a palavra-chave ref no método, temos que utiliza-la, quando chamamos o método.
Agora o valor de myInt é alterado no método.
Usando palavra-chave out
A palavra-chave out tem um efeito semelhante à palavra-chave ref, com os parâmetros que são passados para o método, em ambos os casos, seus valores são alterados.
A principal diferença é que ao usar a palavra-chave out em objetos, eles não necessitam ser inicializados. No exemplo acima, ocorria um erro de compilação se o valor do inteiro não tivesse sido inicializado como no exemplo abaixo:
void MyMethod(ref int num)
{
num += 5;
}
private void Form2_Load(object sender, EventArgs e)
{
int myInt;
MyMethod(ref myInt);
}
Se substituirmos a palavra-chave ref por out este problema seria resolvido.
void MyMethod(out int num)
{
num = 8;
num += 5;
}
private void Form2_Load(object sender, EventArgs e)
{
int myInt;
MyMethod(out myInt);
}
Note que o inteiro é inicializado dentro do método.
A principal função da palavra-chave out é quando você precisa executar um método que retorna vários valores, desta forma você retorna os valores diretamente nas variáveis do parâmetro.
Autor/Fonte: C# Help