Tipo de variável de Valor e Referência no C#

postado em: Programação | 0

Os tipos de variável Valor e Referência são fáceis de se aplicar e bem aplicados ao modelo de domínio, facilitam o processo de desenvolvimento.

Para dismistificar essa quantidade de “tipo de valor”, irei comentar como isso é tratado na plataforma .NET, mais especificamente no C# (cSharp), quando chamamos APIS e ao enviar parâmetros por valor, por referência, em nossos métodos e funções internas e como efetuar o tratamento correto das passagens destes valores.

Tipos de variável Primitive Type e Class Type

Ao criar uma variável do tipo integer ou int no C# (cSharp), você cria uma variável do tipo Primitive Type, porém, quando você cria a com a palavra reservada new um objeto ou classe, você cria uma Class Type.

A principal diferença é que a Primitive Type contém o valor e outra, Class Type, possui uma referência ao objeto que contém o valor. Com isso começamos a entender a base do significado das variáveis por valor e por referência.

Veja um exemplo de como alocar duas áreas de memória contendo o mesmo valor 1982 referentes as variáveis MeuInteiro e MeuInteiroCopia:

Exemplo 1: Declaração de variável tipo Primitive Type

int MeuInteiro = 1982;
int MeuInteiroCopia = MeuInteiro;

No código abaixo, é declarado um objeto da classe “Cliente” e o comportamento é diferente pois, ambas variáveis fazem referência ao mesmo objeto em memória que por sua vez foram igualadas. Como são do mesmo tipo (objeto) o CLR (Common Language Runtime) não alocada duas áreas da memória para conter o mesmo valor:

Exemplo 2: Declaração de variável tipo Class Type

Cliente cliente = new Cliente("Marcelo Pereira Cavalini");
Cliente clienteCopia = cliente;

Isso ocorre porque no exemplo 1 estamos trabalhando com Primitive Type onde cada nova criação deste tipo, é armazenado uma nova área de memória para alocação da mesma. No exemplo 2, o código apresentado é declarado um tipo Class Type onde se trabalha com a mesma área de memória apenas referenciando o nome da variável ou o novo objeto declarado.

Exemplo prático

Segue abaixo a declaração de um trecho de código para auxiliar o entendimento de tipos de valor:

Exemplo 3: Declaração de classe com os dois tipos Primitive Type e Class Type

namespace TipoValor {
class Calculadora {
public static int MeuNumero(int n1, int n2){n1+=++n2;return n1; }
public static void MeuNumeroRef(CalculadoraRef n1){n1.MeuNumeroRef+=2;}
}
class CalculadoraRef { public int MeuNumeroRef; }
}

Analise o seguinte código e veja as duas situações contempladas, passagem de uma variável do Tipo Primitive Type e do tipo Class Type.

Exemplo 4: Código com implementação da classe do exemplo 3

private void testeButton_Click(object sender, System.EventArgs e){
int n1, n2;
CalculadoraRef nRef = new CalculadoraRef();

n1 = n2 = 1;
TipoValor.Calculadora.MeuNumero(n1, n2);
MessageBox.Show(n1.ToString() + " - " + n2.ToString());

nRef.MeuNumeroRef = 0;
TipoValor.Calculadora.MeuNumeroRef(nRef);
MessageBox.Show(nRef.MeuNumeroRef.ToString());
}

Observe que sem percebermos trabalhamos com tipos de valores por valor e por referência.

Na execução teremos as seguintes saídas em formato de caixa de mensagem (MessageBox)

  • No primeiro MessageBox “1-1”;
  • No segundo MessageBox “2”.

Isso indica que na primeira chamada os valores das variáveis permaneceram inalteráveis e o valor da segunda chamada com um Class Type, sofreu alteração, entra com o valor 0 (zero) e sai como valor 2.

Observe que estamos no primeiro método de nossa classe passando uma variável “tipada”, um int normal e corrente, porém na segunda interação estamos passando um objeto da classe como parâmetro da função e sem nenhuma indicação explicita, o comportamento é diferenciado. Na primeira se comporta como passagem por valor e na segunda como passagem por referencia.

Passagem de parâmetro explícito C# (cSharp)

Existem diversas maneiras de conseguir o mesmo resultado dos exemplos anteriores, na função (método), declare de forma explícita quando será por valor ou por referência. A palavra reservada ref indica ao compilador que a função receberá valores por referência e que qualquer “trabalho” realizado com os parâmetros devem ser alterados. Portanto, adicione a palavra reservada ref na declaração do método MeuNumero e na chamada do método:

Exemplo 5: Passagem de parâmetro explícito

public static int MeuNumero(ref int n1, int n2)

TipoValor.Calculadora.MeuNumero(ref n1,n2);

Observe que a palavra reservada ref deve ser utilizada tanto na chamada como na declaração do método e seus parâmetros. Existe uma condição a ser seguida quando se utiliza a palavra reservada ref no programa, que é a inicialização prévia das variáveis.

Conclusão

Mostrei neste artigo um dos potenciais da plataforma.Net que, quando bem aplicada, facilita a manipulação de strings e proporciona um ganho de produtividade, velocidade e segurança no desenvolvimento.

Estas dicas são básicas para manipular variáveis dos tipos Primitive Type e Class Type. Dedique alguns minutos do seu dia para descobrir e surpreende-se com o que a platalforma.Net pode fazer por você.

Deixe uma resposta