Programação orientada a objeto

Encapsulamento

Encapsulamento é chamado, ocasionalmente, de primeiro pilar ou princípio da programação orientada a objeto. De acordo com o princípio de encapsulamento, uma classe ou struct pode especificar qual membro será codificado fora da classe ou struct. Métodos e variáveis que não se destinam a serem usados de fora da classe ou assembly podem ser ocultos para limitar o potencial de codificação de erros ou explorações mal-intencionadas. Para obter mais informações, consulte Programação orientada a objeto.

Membros

Todos os métodos, campos, constantes, propriedades e eventos devem ser declarados em um tipo. Eles são chamados de membros do tipo. No C#, não existem variáveis globais ou métodos como em algumas das outras linguagens. Até mesmo o ponto de entrada de um programa, o método , deve ser declarado dentro de uma classe ou Main struct (implicitamente no caso de 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

Acessibilidade

Alguns métodos e propriedades devem ser chamados ou acessados do código fora de uma classe ou struct, conhecido 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 chegar a ele. Especifique o quanto seus tipos e seus membros estão acessíveis ao 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 que deriva de outra classe (a classe base) contém automaticamente todos os membros públicos, protegidos e internos da classe base, exceto seus construtores e finalizadores. Para obter mais informações, consulte Herança e Polimorfismo.

As classes podem ser declaradas como abstratas, o que significa que um ou mais dos seus métodos não têm nenhuma implementação. Embora as classes abstratas não possam ser instanciadas diretamente, elas servem 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.

Interfaces

Classes, structs e registros podem herdar várias interfaces. Herdar 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 ele cria uma instância do tipo. Por exemplo, a classe List<T> 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 conterá. 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 instautada com a new palavra-chave . Uma cópia da classe é carregada na memória quando o programa é carregado e seus membros são acessados pelo nome da classe. Classes, structs e registros podem conter membros estáticos.

Tipos aninhados

Uma classe, struct ou registro pode ser aninhado dentro de outra classe, struct ou registro.

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.

Inicializadores de objeto

Você pode insinuar e inicializar objetos de classe ou struct, bem como coleções de objetos, atribuindo valores às suas propriedades.

Tipos anônimos

Em situações em que não é conveniente ou necessário criar uma classe nomeada, por exemplo, quando você estiver populando uma lista com estruturas de dados que não precisa persistir ou passar para outro método, use tipos anônimos.

Métodos de Extensão

Você pode "estender" uma classe sem criar uma classe derivada criando um tipo separado cujos métodos podem ser chamados como se pertencessem ao tipo original.

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.

Registros

O C# 9 introduz o tipo , um tipo de referência que você pode criar em vez de uma record classe ou um struct. Os registros são classes com comportamento integrado para encapsular dados em tipos imutáveis. Um registro 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 serão iguais se as definições de tipo de registro são idênticas e se, para cada campo, os valores em ambos os registros são iguais. Isso difere das classes, que 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 expressão permite criar uma nova instância de registro que é uma cópia de uma instância existente, mas com valores with de propriedade especificados alterados.

  • Formatação integrado para exibição.

    O ToString método imprime o nome do tipo de registro e os nomes e valores de propriedades públicas.

  • Suporte para hierarquias de herança.

    Há suporte para herança porque um registro é uma classe nos covers, não um struct.

Para obter mais informações, consulte Registros.

Especificação da Linguagem C#

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