Compartilhar via


Visão geral das técnicas orientadas a objetos em C#

Em C#, a definição de um tipo — uma classe, struct ou registro — é como um blueprint que especifica o que o tipo pode fazer. Um objeto é basicamente um bloco de memória alocado e configurado de acordo com o blueprint. Este artigo fornece uma visão geral desses blueprints e seus recursos. O próximo artigo desta série apresenta objetos.

Encapsulamento

Às vezes, o encapsulamento é conhecido como o primeiro pilar ou princípio da programação orientada a objetos. Uma classe ou struct pode especificar o quão acessível cada um de seus membros é para codificar fora da classe ou struct. Os membros não destinados a consumidores fora da classe ou assembly estão ocultos para limitar o potencial de codificação de erros ou explorações mal-intencionadas. Para obter mais informações, consulte o tutorial de programação orientada a objetos.

Membros

Os membros de um tipo incluem todos os métodos, campos, constantes, propriedades e eventos. Em C#, não há variáveis ou métodos globais como há em algumas outras linguagens. Até mesmo o ponto de entrada de um programa, o Main método, deve ser declarado dentro de uma classe ou struct (implicitamente quando você usa instruções de nível superior).

A lista a seguir inclui todos os vários tipos de membros que podem ser declarados em uma classe, struct ou registro.

  • Campos
  • Constantes
  • Propriedades
  • Métodos
  • Construtores
  • Eventos
  • Finalizadores
  • Indexadores
  • Operadores
  • Tipos aninhados

Para obter mais informações, consulte Membros.

Acessibilidade

Alguns métodos e propriedades devem ser chamados ou acessados a partir de código fora de uma classe ou struct, que são conhecidos como código do cliente. Outros métodos e propriedades podem ser usados apenas na classe ou struct em si. É importante limitar a acessibilidade do código para que somente o código do cliente pretendido possa alcançá-lo. Especifique o quão acessíveis seus tipos e seus membros são para o código do cliente usando os seguintes modificadores de acesso:

A acessibilidade padrão é private.

Herança

Classes (mas não structs) dão suporte ao conceito de herança. Uma classe derivada de outra classe, chamada classe base, contém automaticamente todos os membros públicos, protegidos e internos da classe base, exceto seus construtores e finalizadores.

As classes podem ser declaradas como abstratas, o que significa que um ou mais de seus métodos não têm implementação. Embora as classes abstratas não possam ser instanciadas diretamente, elas podem servir como classes base para outras classes que fornecem a implementação ausente. As classes também podem ser declaradas como lacradas para impedir que outras classes herdem delas.

Para obter mais informações, consulte Herança e Polimorfismo.

Interfaces

Classes, structs e registros podem implementar várias interfaces. Implementar a partir de uma interface significa que o tipo implementa todos os métodos definidos na interface. Para obter mais informações, consulte Interfaces.

Tipos genéricos

Classes, structs e registros podem ser definidos com um ou mais parâmetros de tipo. O código do cliente fornece o tipo quando cria uma instância do tipo. Por exemplo, a List<T> classe no System.Collections.Generic namespace é definida com um parâmetro de tipo. O código do cliente cria uma instância de um List<string> ou List<int> para especificar o tipo que a lista contém. Para obter mais informações, consulte Genéricos.

Tipos estáticos

Classes (mas não structs ou registros) podem ser declaradas como static. Uma classe estática pode conter apenas membros estáticos e não pode ser instanciada com a new palavra-chave. Uma cópia da classe é carregada na memória quando o programa é carregado e seus membros são acessados por meio do nome da classe. Classes, structs e registros podem conter membros estáticos. Para obter mais informações, consulte classes estáticas e membros de classe estática.

Tipos aninhados

Uma classe, um struct ou um registro podem ser aninhados em outra classe, struct ou registro. Para obter mais informações, consulte Tipos aninhados.

Tipos parciais

Você pode definir parte de uma classe, struct ou método em um arquivo de código e outra parte em um arquivo de código separado. Para obter mais informações, consulte Classes e métodos parciais.

Inicializadores de objeto

Você pode instanciar e inicializar objetos de classe ou struct e coleções de objetos, atribuindo valores às suas propriedades. Para obter mais informações, consulte Como inicializar objetos usando um inicializador de objeto.

Tipos anônimos

Em situações em que não é conveniente ou necessário criar uma classe nomeada, você usa tipos anônimos. Os membros de dados nomeados definem tipos anônimos. Para obter mais informações, consulte tipos anônimos.

Membros da Extensão

Você pode "estender" uma classe sem criar uma classe derivada criando um tipo separado. Esse tipo contém métodos que podem ser chamados como se pertencessem ao tipo original. Para obter mais informações, consulte Métodos de extensão.

Variáveis Locais Tipadas Implicitamente

Em uma classe ou método struct, você pode usar a digitação implícita para instruir o compilador a determinar o tipo de uma variável no tempo de compilação. Para obter mais informações, consulte var (referência de C#).

Arquivos

Você pode adicionar o record modificador a uma classe ou a um struct. Os registros são tipos com comportamento interno para igualdade baseada em valor. Um registro (seja record class ou record struct) fornece os seguintes recursos:

  • Sintaxe concisa para criar um tipo de referência com propriedades imutáveis.
  • Igualdade de valor. Duas variáveis de um tipo de registro são iguais se tiverem o mesmo tipo e se, para cada campo, os valores em ambos os registros forem iguais. As classes usam igualdade de referência: duas variáveis de um tipo de classe são iguais se se referirem ao mesmo objeto.
  • Sintaxe concisa para mutação não estruturativa. Uma with expressão permite que você crie uma nova instância de registro que seja uma cópia de uma instância existente, mas com valores de propriedade especificados alterados.
  • Formatação embutida para exibição. O ToString método imprime o nome do tipo de registro e os nomes e valores das propriedades públicas.
  • Suporte para hierarquias de herança em classes de registro. Classes de registro dão suporte à herança. Os structs de registro não dão suporte à herança.

Para saber mais, confira Registros.

Especificação da linguagem C#

Para obter mais informações, consulte a Especificação da Linguagem C# . A especificação de idioma é a fonte definitiva para a sintaxe e o uso de C#.