English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية
No C#, os tipos de dados são classificados com base na maneira como eles armazenam valores na memória. O C# inclui as seguintes categorias de tipos de dados:
Tipos de valor
Tipos de referência
Tipos de ponteiros
Se o tipo de dados armazena valores de dados em seu próprio espaço de memória, é um tipo de valor. Isso significa que as variáveis desses tipos de dados contêm diretamente valores.
Todos os tipos de valor derivam deSystem.ValueTypeDerivado, enquantoSystem.ValueTypeE, em seguida, deSystem.ObjectDerivado.
Por exemplo, a variável inteira int i = 100;
O sistema armazenará100 é armazenado no espaço de memória alocado para a variável i. A figura a seguir ilustra como100 é armazenado na memória de "i" (0x239110Um ponto de suposição dentro de ):
Os seguintes tipos de dados são de valor:
bool
byte
char
decimal
double
enum
float
int
long
sbyte
short
struct
uint
ulong
ushort
Quando você passa uma variável de tipo de valor de um método para outro, o sistema cria uma cópia separada da variável no outro método. Se alterar o valor em um método, não afetará a variável no outro método.
static void ChangeValue(int x) { x = 200; Console.WriteLine(x); } static void Main(string[] args) { int i = 100; Console.WriteLine(i); ChangeValue(i); Console.WriteLine(i); }
100
200
100
No exemplo acima, mesmo após passar a variável i do método Main() para o método ChangeValue() e alterar seu valor, ela ainda permanece inalterada.
Diferente dos tipos de valor, os tipos de referência não armazenam diretamente seu valor. Em vez disso, eles armazenam o endereço da posição onde o valor está armazenado. Em outras palavras, os tipos de referência contêm um ponteiro para outro local de armazenamento que guarda dados.
Por exemplo, a seguinte variável de string:
string s = "Hello World!!";
A figura a seguir mostra como o sistema aloca memória para a variável de string acima.
Como mostrado na figura acima, o sistema escolheu uma posição aleatória na memória para a variável s (0x803200). O valor da variável s é 0x600000, que é o endereço na memória do valor real. Portanto, os tipos de referência armazenam o endereço da posição onde o valor real está armazenado, não o valor em si.
A seguir estão os tipos de dados de referência:
String
Array (mesmo que seus elementos sejam de tipo de valor)
Classe
Delegação
Quando você passa uma variável de tipo de referência de um método para outro, ele não cria uma nova cópia; em vez disso, ele passa o endereço da variável. Portanto, se alterarmos o valor da variável no método, ele também refletirá na chamada do método.
static void ChangeReferenceType(Student std2) { std2.StudentName = "Steve"; } static void Main(string[] args) { Student std1 = new Student(); std1.StudentName = "Bill"; ChangeReferenceType(std1); Console.WriteLine(std1.StudentName); }
Steve
No exemplo acima, passamos o objeto Student std1 Passado para o método ChangeReferenceType(). Aqui, ele realmente passa std1do endereço de memória. Portanto, quando o método ChangeReferenceType() altera StudentName, ele realmente está alterando std1do atributo StudentName, porque std1e std2Todos eles apontam para o mesmo endereço de memória.
O valor padrão null de um tipo de referência é quando ele não está inicializado. Null representa não referenciar nenhum objeto.
As variáveis de tipo valor não podem ser null, pois elas armazenam valores em vez de endereços de memória. C#2A versão .0 introduziu tipos nulos, que permitem atribuir null a variáveis de tipo valor ou declarar variáveis de tipo valor sem atribuir-lhes um valor.