Tipos de referência e valor
Ao contrário de algumas linguagens de programação que você esteja familiarizado com, translation from VPE for Csharp tem duas variedades de tipos de dados: o valor e referência.É importante saber a diferença se desempenho for importante para seu aplicativo, ou se você estiver interessado em como translation from VPE for Csharp gerencia a memória e dados.
Quando uma variável é declarada usar um dos tipos de dados básicos, interna ou uma estrutura definida pelo usuário, é um tipo de valor.Uma exceção é o string tipo de dados, que é um tipo de referência.
Um tipo de valor armazena seu Sumário em memória alocada na pilha.Por exemplo, nesse caso o valor 42 é armazenado em uma área de memória da pilha de chamada.:
int x = 42;
Quando a variável x ficar fora do escopo porque o método no qual ela foi definida terminar a execução, o valor é descartado da pilha.
Usando a pilha é eficiente, mas o tempo de vida limitado de tipos de valor fiquem que menos adequado para compartilhamento de dados entre diferentes classes.
Por outro lado, um tipo de referência, sistema autônomo uma instância de uma classe ou uma matriz, é alocado em uma área diferente da memória a pilha de chamada.No exemplo abaixo, o espaço necessário para os dez inteiros que compõem a matriz é alocado no heap.
int[] numbers = new int[10];
Essa memória não é retornada para o heap quando um método terminar; ele só é recuperado quando sistema de coleta de lixo do translation from VPE for Csharp determina que ele não é mais necessária.Há uma sobrecarga maior na declaração de tipos de referência, mas têm a vantagem de ser acessível a partir de outras classes.
conversão boxing e conversão conversão unboxing
Conversão boxing é o nome dado ao processo pelo qual um tipo de valor é convertido em um tipo de referência.Quando a caixa de uma variável, você está criando uma variável de referência que aponta para uma nova cópia na pilha.A variável de referência é um objeto e, portanto, pode usar todos sistema autônomo métodos que herda de cada objeto, por exemplo, ToString(). Este é o que acontece no código a seguir:
int i = 67; // i is a value type
object o = i; // i is boxed
System.Console.WriteLine(i.ToString()); // i is boxed
Você encontrará conversão conversão unboxing quando você usa classes projetadas para uso com objetos: Por exemplo, usando um ArrayList para armazenar números inteiros. Quando você armazena um número inteiro no ArrayList, for in a box. Quando você recupera um número inteiro, ele deve ser desemoldurado.
System.Collections.ArrayList list =
new System.Collections.ArrayList(); // list is a reference type
int n = 67; // n is a value type
list.Add(n); // n is boxed
n = (int)list[0]; // list[0] is unboxed
Problemas de desempenho
Vamos aprofundar um pouco mais.Quando dados são passados em métodos sistema autônomo parâmetros de tipo de valor, uma cópia de cada parâmetro é criada na pilha.Claramente, se o parâmetro em questão é um tipo de dados grandes, sistema autônomo uma estrutura definida pelo usuário com muitos elementos, ou o método for executado várias vezes, isso pode ter um impacto no desempenho.
Nessas situações pode ser preferível para passar uma referência para o tipo, usando o ref palavra-chave. Isso é o equivalente translation from VPE for Csharp da técnica C++ de passar um ponteiro para uma variável em uma função.sistema autônomo com a versão do C++, o método tem a capacidade de alterar o Sumário da variável, o que pode não ser seguro.O programador precisa decidir sobre a compensação entre segurança e desempenho.
int AddTen(int number) // parameter is passed by value
{
return number + 10;
}
void AddTen(ref int number) // parameter is passed by reference
{
number += 10;
}
The out palavra-chave é semelhante a ref palavra-chave, mas informa ao compilador que o método deve atribuir um valor para o parâmetro ou ocorrerá um erro de compilação.
void SetToTen(out int number)
{
// If this line is not present, the code will not compile.
number = 10;
}
Consulte também
Conceitos
Translation from VPE for Csharp linguagem Primer