Bases da linguagem
Tipos de Referência (Reference Types)
Os tipos de referência são ponteiros para os dados, e ao contrário dos value types, durante a atribuição, passagem por parâmetro ou retorno de função, somente o endereço do dado é transmitido.
Strings
Tipo que representa uma sequência de zero ou mais caracteres Unicode.
Atenção
Strings são imutáveis. Após a criação de um string, seu conteúdo não pode ser alterado. Isso significa que a concatenação de strings a uma mesma variável pode ser bastante custosa em termos de consumo de memória e deve ser levada em consideração durante a construção dos programas.
Encapsulamento
Este é o primeiro pilar ou princípio da Programação Orientada a Objeto. Agregamos informações dentro de um contexto que façam sentido no seu conjunto. Neste contexto, a agregação une valores e comportamentos, e para isso precisamos definir os membros de um tipo que está sendo definido:
- Fields
- Variáveis declaradas no escopo do objeto.
- Constants
- Informações imutáveis, definidas em tempo de compilação.
- Properties
- Métodos de leitura (get) e escrita (set) dos valores do tipo, propiciando um tratamento e validação das informações dos fields, além de promover proteção aos valores armazenados.
- Methods
- Ações/funções sobre os valores do tipo.
- Constructors
- Métodos especiais, utilizados para criar a instância do tipo e inicializar seus valores.
- Events
- Métodos especiais, referências para métodos de outras classes, utilizados para notificação de ocorrências.
- Finalizers
- Métodos especiais, que são chamados quando o objeto está sendo destruído e é necessária alguma liberação de recursos de forma manual. Raramente utilizados.
- Operators
- Métodos para sobrecarregar operadores (operator overloading), modificando operações aritméticas, lógicas e comparativas.
- Tipos Aninhados
- Tipos que são utilizados apenas dentro do contexto do objeto.
Acessibiidade
Os membros dos objetos precisam de uma definição de acesso, para que se garanta a integridade dos valores. Dessa maneira, temos os seguintes modificadores:
- public
- Acessível por qualquer código que consuma o objeto
- protected
- Acessível apenas pelos objetos cujos tipos herdem do tipo atual
- internal
- Acessível apenas pelos códigos que pertençam ao mesmo namespace do tipo.
- private
- Acessível apenas por código do próprio tipo.
Classes
Escolhendo entre class e struct
Quando usar structs?
Considere usar uma struct ao invés de uma classe se as instâncias do tipo forem pequenas e de vida curta, ou forem comumente embutidas em outros objetos
Quando não usar structs?
Evite definir uma struct caso o tipo não tenha todas essas características:
* Representa logicamente um valor simples, similar aos tipos primitivos.
* Tem um tamanho de instância de até 16 bytes.
* É imutável.
* Não precisa ser [_unboxed_](https://learn.microsoft.com/en-us/dotnet/csharp/programming-guide/types/boxing-and-unboxing) frequentemente.