1. Como criar um objeto do jeito certo
O operador new em C# é tipo aquele botão mágico que transforma um "projeto" (nosso class) em uma instância real (objeto) que dá pra usar de verdade. Falando de boa: a class define o que o objeto sabe fazer e quais propriedades ele tem, e o new — cria esse objeto na memória do PC.
Sem o operador new, nossas classes seriam tipo projetos sem construção: dá pra admirar, discutir, mas não dá pra pular nem derrubar café na poltrona de alcantara.
Se a class é uma receita de pizza, o operador new é o chef que faz a pizza de verdade seguindo a receita. O objeto é o resultado: a pizza na caixa, pronta pra comer.
Sintaxe
Bora ver como usar esse new poderoso. Olha o básico, se a gente tem uma class Contact:
Contact cont = new Contact();
- Contact à esquerda — é o tipo da variável que a gente tá criando.
- cont — nome da variável (escolhe nomes que façam sentido, senão vai sofrer debugando depois).
- new Contact() — chamada do operador new, que cria um objeto do tipo Contact.
Na memória
Quando esse código roda, o sistema operacional separa um pedaço de memória pro novo objeto e devolve uma referência (endereço) onde esse objeto "mora". Essa referência fica guardada na variável cont.
Esquema
+------------------+ +--------------------+
| variável cont | ---------> | Objeto Contact |
+------------------+ +--------------------+
|
| (contém nome, telefone, email, ...)
|
endereço
2. Criando objetos de contatos
No exemplo anterior, a gente inventou essa class:
public class Contact
{
public string Name;
public string Phone;
public string Email;
}
Agora bora criar um novo objeto do tipo Contact:
Contact friend = new Contact();
friend.Name = "Ivan Ivanov";
friend.Phone = "+1-999-123-45-67";
friend.Email = "ivan@example.com";
Console.WriteLine($"Nome: {friend.Name}, Telefone: {friend.Phone}, Email: {friend.Email}");
O que tá rolando aqui:
- Criamos o objeto com new Contact().
- Atribuímos valores pros campos dele.
- Mostramos os dados na tela.
Exemplo 2:
Bora adicionar mais contatos — criar outro objeto:
Contact boss = new Contact();
boss.Name = "Anastasia Sergeevna";
boss.Phone = "+1-888-765-43-21";
boss.Email = "nastya@company.com";
Console.WriteLine($"Chefe: {boss.Name}, Telefone: {boss.Phone}");
Não parece que você tá preenchendo um formulário pra cada amigo? É assim que objetos funcionam: cada instância criada ganha seus próprios valores únicos e guarda separado dos outros!
3. Usando array de objetos
Se a gente precisa guardar não só um ou dois, mas tipo dez contatos, faz sentido colocar tudo num array:
Contact[] contacts = new Contact[3]; // array pra 3 objetos
contacts[0] = new Contact();
contacts[0].Name = "Denis";
contacts[0].Phone = "+7-911-111-22-33";
contacts[1] = new Contact();
contacts[1].Name = "Maria";
contacts[1].Phone = "+7-915-123-45-67";
contacts[2] = new Contact();
contacts[2].Name = "Petr";
contacts[2].Phone = "+7-921-543-21-00";
// Mostrar todo mundo na tela
for (int i = 0; i < contacts.Length; i++)
{
Console.WriteLine($"Contato {i+1}: {contacts[i].Name}, {contacts[i].Phone}");
}
Importante: a gente usa new pra cada elemento do array! Só criar o array não cria os objetos, só prepara espaço pras referências deles.
4. Operador new e valor padrão
Às vezes rola a dúvida — e se eu só declarar uma variável do tipo Contact, mas não atribuir um objeto com new, o que acontece?
Contact someContact;
someContact.Name = "Erro"; // Erro de compilação!
Se você escrever assim:
Contact someContact = null;
aí, se tentar acessar someContact.Name, seu programa vai "cair" com aquela exceção famosa:
System.NullReferenceException: Referência de objeto não definida para uma instância de um objeto.
Pra não cair nessa, sempre inicialize objetos com new antes de usar.
5. Chamando o construtor
Quando você escreve new Contact(), nesse momento é chamado um método especial — o construtor. Por enquanto, nossa class não tem construtores explícitos, então é chamado o construtor padrão, que cria o objeto e preenche todos os campos com valores padrão (null pra tipos referência e zero pra números).
Na próxima aula você vai ver como criar seus próprios construtores — tipo já passar nome e telefone direto. Por enquanto, só funciona o construtor sem parâmetros.
Exemplos da vida real
Trabalhar com objetos usando o operador new é rotina de todo dev C#. Imagina:
- Você cria um usuário no site — no código aparece um novo objeto User.
- Abre um pedido na loja online — aparece um novo Order.
- Registra dados de um livro — novo objeto Book.
Em qualquer programa moderno em C# você vai ver milhares de linhas com o operador new.
Memória antes de criar o objeto
Contact firstContact; // Variável, mas não aponta pra nada
+--------------------------+
| firstContact |----> null (nada!)
+--------------------------+
Depois de criar o objeto
Contact firstContact = new Contact();
+--------------------------+ +----------------------+
| firstContact |---------------->| Objeto Contact |
+--------------------------+ +----------------------+
6. Exemplo prático
Imagina que a gente quer deixar o usuário criar novos contatos digitando pelo teclado:
Console.WriteLine("Digite o nome:");
string name = Console.ReadLine();
Console.WriteLine("Digite o telefone:");
string phone = Console.ReadLine();
Contact newContact = new Contact();
newContact.Name = name;
newContact.Phone = phone;
Console.WriteLine($"Contato salvo: {newContact.Name}, {newContact.Phone}");
Agora, cada entrada do usuário vai criar um objeto único na memória, que dá pra guardar, mudar, mostrar — fazer o que quiser!
7. Mancadas clássicas e pegadinhas engraçadas
Erro nº1: esqueceu de chamar new antes de usar o objeto.
Se você só declara a variável e não inicializa, vai acabar com erro de compilação ou NullReferenceException na execução. Clássico: declarou o objeto — já cria com new se for usar mesmo.
Erro nº2: criou array de objetos, mas não criou os objetos.
Pegadinha comum: você cria um array do tipo Contact[], mas esquece que dentro só tem null. Tentar acessar contacts[0].Name vai dar crash. Tem que inicializar cada elemento do array: contacts[i] = new Contact();.
Erro nº3: confundiu método com propriedade.
Às vezes a galera acha que pode usar método como campo: escreve student.GetName em vez de student.GetName(). Até funciona se não usar o resultado, mas o compilador reclama se você tentar usar o "método" onde espera um valor. Sempre confere: método tem que ser chamado com parênteses, mesmo sem parâmetros.
GO TO FULL VERSION