Referência de Tipos de Dados
A Referência de Tipos de Dados em C# é um conceito fundamental para o desenvolvimento eficiente de software, pois define como os dados são armazenados, acessados e manipulados na memória durante a execução de um programa. Diferentemente dos tipos de valor, que armazenam dados diretamente na stack, os tipos de referência armazenam a referência ao local de memória onde o objeto reside na heap. Isso inclui tipos como string, arrays, List
No desenvolvimento em C#, tipos de referência são utilizados quando se deseja manipular coleções de dados dinâmicas, objetos mutáveis ou compartilhar informações entre diferentes partes de um sistema. Este conteúdo aborda a sintaxe correta, estruturas de dados avançadas, algoritmos aplicados a tipos de referência e princípios de programação orientada a objetos, como encapsulamento, herança e polimorfismo. O leitor aprenderá a utilizar List
Exemplo Básico
textusing System;
using System.Collections.Generic;
namespace ReferenciaTiposDados
{
class Program
{
static void Main(string\[] args)
{
// Tipos de Valor
int numero = 42;
double preco = 99.99;
bool ativo = true;
// Tipos de Referência
string nome = "Desenvolvedor C#";
int[] notas = new int[] { 85, 90, 95 };
List<string> habilidades = new List<string> { "OOP", "LINQ", "Async" };
// Tipo Nullable
int? numeroNulo = null;
// Saída
Console.WriteLine($"Número: {numero}, Preço: {preco}, Ativo: {ativo}");
Console.WriteLine($"Nome: {nome}");
Console.WriteLine("Notas: " + string.Join(", ", notas));
Console.WriteLine("Habilidades: " + string.Join(", ", habilidades));
Console.WriteLine($"Valor Nullable: {numeroNulo?.ToString() ?? "Sem valor"}");
}
}
}
Este exemplo demonstra claramente a distinção entre tipos de valor e tipos de referência. Tipos de valor como int, double e bool são armazenados na stack e copiados ao serem atribuídos a novas variáveis, enquanto tipos de referência, como string, arrays e List
Exemplo Prático
textusing System;
using System.Collections.Generic;
namespace ReferenciaTiposDadosPratico
{
class Funcionario
{
public string Nome { get; set; }
public int Idade { get; set; }
public decimal Salario { get; set; }
}
class Program
{
static void Main()
{
List<Funcionario> funcionarios = new List<Funcionario>
{
new Funcionario { Nome = "Alice", Idade = 30, Salario = 60000 },
new Funcionario { Nome = "Bob", Idade = 45, Salario = 80000 },
new Funcionario { Nome = "Charlie", Idade = 25, Salario = 50000 }
};
// Ordenação por salário
funcionarios.Sort((f1, f2) => f1.Salario.CompareTo(f2.Salario));
foreach (var f in funcionarios)
{
Console.WriteLine($"Nome: {f.Nome}, Idade: {f.Idade}, Salário: {f.Salario:C}");
}
}
}
}
Advanced C# Implementation
textusing System;
using System.Collections.Generic;
using System.Linq;
namespace ReferenciaTiposDadosAvancado
{
class Funcionario
{
public string Nome { get; set; }
public int Idade { get; set; }
public decimal Salario { get; set; }
public Funcionario(string nome, int idade, decimal salario)
{
Nome = nome;
Idade = idade;
Salario = salario;
}
}
class Program
{
static void Main()
{
List<Funcionario> funcionarios = new List<Funcionario>
{
new Funcionario("Alice", 30, 60000),
new Funcionario("Bob", 45, 80000),
new Funcionario("Charlie", 25, 50000),
new Funcionario("Diana", 35, 70000)
};
try
{
var altosSalarios = funcionarios.Where(f => f.Salario > 60000)
.OrderByDescending(f => f.Salario)
.ToList();
foreach (var f in altosSalarios)
{
Console.WriteLine($"Alto Salário: {f.Nome}, Salário: {f.Salario:C}");
}
}
catch (Exception ex)
{
Console.WriteLine($"Erro: {ex.Message}");
}
}
}
}
As melhores práticas com tipos de referência em C# incluem a escolha adequada entre tipos de valor e referência, gerenciamento eficiente de memória e escrita de código limpo e manutenível. Tipos de valor são indicados para dados pequenos e imutáveis, enquanto tipos de referência são essenciais para objetos complexos e compartilhados. O uso de coleções genéricas, LINQ e tipos Nullable melhora a segurança e performance do código. Recomenda-se minimizar a criação de objetos dentro de loops, escolher corretamente List
📊 Referência Completa
C# Element/Method | Description | Syntax | Example | Notes |
---|---|---|---|---|
int | Inteiro de 32 bits | int x = 10; | int numero = 100; | Tipo de valor padrão |
double | Número de ponto flutuante | double d = 3.14; | double preco = 19.99; | Alta precisão |
bool | Valor lógico | bool flag = true; | bool ativo = false; | true/false |
char | Caractere único | char c = 'A'; | char letra = 'B'; | Um único caractere |
string | Texto | string s = "Texto"; | string nome = "Alice"; | Tipo referência imutável |
object | Base de todos os tipos | object obj = 123; | object dados = "Olá"; | Armazena qualquer tipo |
decimal | Número decimal de alta precisão | decimal valor = 100.50m; | decimal salario = 1500.75m; | Uso financeiro |
float | Ponto flutuante de precisão simples | float f = 1.23f; | float taxa = 0.05f; | Menor precisão |
long | Inteiro de 64 bits | long l = 1234567890L; | long distancia = 5000000000L; | Para grandes números |
short | Inteiro de 16 bits | short s = 32000; | short temperatura = 150; | Economiza memória |
byte | Inteiro de 8 bits | byte b = 255; | byte idade = 25; | Uso eficiente de memória |
sbyte | Inteiro com sinal de 8 bits | sbyte sb = -128; | sbyte deslocamento = -50; | Pequeno intervalo |
uint | Inteiro sem sinal 32 bits | uint u = 4000; | uint contador = 1000; | Somente positivo |
ulong | Inteiro sem sinal 64 bits | ulong ul = 100000; | ulong valorGrande = 1000000; | Somente positivo |
ushort | Inteiro sem sinal 16 bits | ushort us = 60000; | ushort altura = 55000; | Somente positivo |
int? | Nullable int | int? x = null; | int? resultado = null; | Pode assumir null |
List<T> | Lista genérica | List<int> numeros = new List<int>(); | List<string> nomes = new List<string>(); | Coleção dinâmica |
Dictionary\<K,V> | Coleção chave-valor | Dictionary\<string,int> dict = new Dictionary\<string,int>(); | Dictionary\<string,string> estados = new Dictionary\<string,string>(); | Mapeamento rápido |
Array | Array de tamanho fixo | int\[] arr = new int\[5]; | string\[] frutas = { "Maçã", "Banana" }; | Acesso por índice |
Tuple | Tupla imutável | var tuple = Tuple.Create(1,"A"); | var pessoa = Tuple.Create("Alice",25); | Grupo temporário |
var | Inferência de tipo | var x = 10; | var soma = 100; | Tipo definido pelo compilador |
dynamic | Tipo dinâmico | dynamic obj = 1; | dynamic valor = "Olá"; | Verificação em tempo de execução |
📊 Complete C# Properties Reference
Property | Values | Default | Description | C# Support |
---|---|---|---|---|
Length | int | 0 | Tamanho de array ou string | C# 1.0+ |
Count | int | 0 | Número de elementos em coleção | C# 2.0+ |
Capacity | int | 0 | Capacidade de coleção | C# 2.0+ |
Item | T | null | Indexer para acesso a elementos | C# 2.0+ |
HasValue | bool | false | Verificação de Nullable | C# 2.0+ |
Value | T | N/A | Acesso ao valor Nullable | C# 2.0+ |
Keys | ICollection | N/A | Chaves de Dictionary | C# 2.0+ |
Values | ICollection | N/A | Valores de Dictionary | C# 2.0+ |
First | T | default | Primeiro elemento LINQ | C# 3.0+ |
Last | T | default | Último elemento LINQ | C# 3.0+ |
ItemArray | object\[] | null | Acesso a array de DataRow | C# 2.0+ |
O aprendizado da Referência de Tipos de Dados em C# permite entender o armazenamento e manipulação de dados, aplicar corretamente tipos de valor e referência, e otimizar desempenho de aplicações. Integrando OOP, LINQ e coleções genéricas, o desenvolvedor consegue criar sistemas escaláveis, seguros e de fácil
manutenção. Próximos passos incluem estudo avançado de estruturas de dados, algoritmos, padrões de projeto e programação assíncrona, aprimorando habilidades para construção de soluções corporativas robustas.
🧠 Teste Seu Conhecimento
Test Your Knowledge
Test your understanding of this topic with practical questions.
📝 Instruções
- Leia cada pergunta cuidadosamente
- Selecione a melhor resposta para cada pergunta
- Você pode refazer o quiz quantas vezes quiser
- Seu progresso será mostrado no topo