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ê.