Observação
O acesso a essa página exige autorização. Você pode tentar entrar ou alterar diretórios.
O acesso a essa página exige autorização. Você pode tentar alterar os diretórios.
Dica
Novo no desenvolvimento de software? Comece primeiro com os tutoriais de Introdução . Você encontrará classes quando precisar modelar objetos com comportamento e estado.
Experimentou em outro idioma? As classes C# são semelhantes às classes em Java ou C++. Leia a seção inicializadores de objeto para padrões específicos de C# e veja Registros para uma alternativa focada em dados.
Uma classe é um tipo de referência que define um blueprint para objetos. Quando você cria uma variável de um tipo de classe, a variável mantém uma referência a um objeto no heap gerenciado. A variável não contém os dados do objeto em si. Atribuir uma variável de classe a outra variável copia a referência, portanto, ambas as variáveis apontam para o mesmo objeto. Classes são a maneira mais comum de definir tipos personalizados em C#. Use-os quando precisar de comportamento complexo, herança ou identidade compartilhada entre referências.
Quando usar classes
Use uma classe quando:
- O tipo tem um comportamento complexo ou gerencia o estado mutável.
- Você precisa de herança para criar uma classe base com especializações derivadas ou para criar um tipo derivado que estenda uma classe existente.
- As instâncias representam uma identidade compartilhada, não objetos que contêm valores iguais. Duas referências ao mesmo objeto devem permanecer em sincronia.
- O tipo é grande ou de longa duração e se beneficia da alocação de heap e da semântica de referência.
Declarar uma classe
Defina uma classe com a class palavra-chave seguida pelo nome do tipo. Um modificador de acesso opcional controla a visibilidade. O padrão é internal. Especifique public para permitir que chamadores de outros assemblies usem seus tipos.
public class Customer
{
public string Name { get; set; }
public Customer(string name) => Name = name;
}
O corpo da classe contém campos, propriedades, métodos e eventos, chamados coletivamente de membros de classe. O nome deve ser um nome de identificador C# válido.
Criar objetos
Uma classe define um tipo, mas não é um objeto em si. Você cria um objeto (uma instância da classe) com a new palavra-chave:
var customer = new Customer("Allison");
Console.WriteLine(customer.Name); // Allison
A variável customer contém uma referência ao objeto, não ao objeto em si. Você pode atribuir várias variáveis ao mesmo objeto. As alterações por meio de uma referência são visíveis por meio da outra:
var c1 = new Customer("Grace");
var c2 = c1; // both variables reference the same object
c2.Name = "Hopper";
Console.WriteLine(c1.Name); // Hopper — c1 sees the change made through c2
Esse comportamento de compartilhamento de referência é uma distinção entre classes e structs. Com structs, a atribuição copia os dados. O mais importante é que as classes dão suporte à herança. Você pode criar hierarquias em que os tipos derivados reutilizam e especializam o comportamento de uma classe base. Os structs não podem participar de hierarquias de herança. Para obter mais informações sobre a distinção, consulte tipos de valor e tipos de referência.
Construtores e inicialização
Ao criar uma instância, você deseja que seus campos e propriedades sejam inicializados para valores úteis. O C# oferece várias abordagens: inicializadores de campo, parâmetros de construtor, construtores primários e propriedades necessárias.
Inicializadores de campo definem um valor padrão diretamente na declaração de campo:
public class Container
{
private int _capacity = 10;
}
Inicializadores de campo atribuem um valor padrão razoável a um campo ou propriedade. Essa característica o distingue dos métodos a seguir em que os chamadores podem fornecer o valor inicial.
Os parâmetros do construtor exigem que os chamadores forneçam valores:
public class Container
{
private int _capacity;
public Container(int capacity) => _capacity = capacity;
}
Construtores primários (C# 12+) adicionam parâmetros diretamente à declaração de classe. Esses parâmetros estão disponíveis em todo o corpo de classe.
public class Container(int capacity)
{
private int _capacity = capacity;
}
Construtores primários e inicializadores de campo podem trabalhar juntos: o inicializador _capacity = capacity de campo usa o parâmetro de construtor primário como seu valor. Esse padrão permite capturar argumentos de construtor em campos com uma única declaração concisa.
As propriedades necessárias impõem que os chamadores definam propriedades específicas por meio de um inicializador de objeto:
public class Person
{
public required string FirstName { get; set; }
public required string LastName { get; set; }
}
// var missing = new Person(); // Error: required properties not set
var person = new Person { FirstName = "Grace", LastName = "Hopper" };
Console.WriteLine($"{person.FirstName} {person.LastName}"); // Grace Hopper
Para ver mais detalhadamente os padrões de construtor, incluindo validação de parâmetro e encadeamento de construtores, consulte Construtores.
Classes estáticas
Uma static classe não pode ser instanciada e contém apenas membros estáticos. Use classes estáticas para organizar métodos utilitários que não operam em dados de instância:
static class MathHelpers
{
public static double CircleCircumference(double radius) =>
2 * Math.PI * radius;
}
double circumference = MathHelpers.CircleCircumference(5.0);
Console.WriteLine($"Circumference: {circumference:F2}"); // Circumference: 31.42
A biblioteca de classes .NET inclui muitas classes estáticas, como Math e Console. Uma classe estática é implicitamente selada. Você não pode derivar dele ou instanciá-lo.
Inicializadores de objeto
Os inicializadores de objeto permitem que você defina propriedades ao criar um objeto, sem escrever um construtor para cada combinação de valores:
class ConnectionOptions
{
public string Host { get; init; } = "localhost";
public int Port { get; init; } = 80;
public bool UseSsl { get; init; }
}
var options = new ConnectionOptions
{
Host = "db.example.com",
Port = 5432,
UseSsl = true
};
Console.WriteLine($"{options.Host}:{options.Port} (SSL: {options.UseSsl})");
// db.example.com:5432 (SSL: True)
Inicializadores de objeto funcionam com qualquer propriedade acessível que tenha um set ou init acessador. Eles combinam naturalmente com required propriedades e com construtores que aceitam alguns parâmetros, permitindo que o chamador defina outros.
Quando a propriedade é uma coleção, você pode usar uma expressão collection (referência de C#) para inicializar esse objeto.
Herança
As classes dão suporte à herança. Você pode definir uma nova classe que reutiliza, estende ou modifica o comportamento de uma classe existente. A classe da qual você herda é a classe base e a nova classe é a classe derivada:
var manager = new Manager("Satya", "Engineering");
Console.WriteLine($"{manager.Name} manages {manager.Department}");
// Satya manages Engineering
Uma classe pode herdar de uma classe base e implementar várias interfaces. Classes derivadas herdam todos os membros da classe base, exceto construtores. Para obter mais informações, consulte Herança e Interfaces.