C# - Conceitos : Construtor (revisitado) - II


Hoje vamos rever um conceito muito importante na linguagem C#: O Construtor. 

Continuando a primeira parte do artigo vamos apresentar outros conceitos importantes sobre construtores.

Construtores Estáticos

Um construtor estático é usado para inicializar quaisquer dados estáticos ou para executar uma ação específica que precisa ser executada apenas uma vez. Ele é chamado automaticamente antes que a primeira instância seja criada ou que quaisquer membros estáticos sejam referenciados.

Assim, uma classe pode também ter um construtor estático que inicializa membros estáticos do tipo.

Nota: Membros estáticos são membros que usam o modificador static e que estão associados coma classe e não com uma instância particular da classe. Assim para acessar membros estáticos não precisamos criar uma instância da classe.

Construtores estáticos não possuem parâmetros, e, se você não fornecer um construtor estático para inicializar campos estáticos, o compilador do C# fornecerá um construtor estático padrão que inicializa os campos estáticos com os respectivos valores padrão, conforme a tabela a seguir:

Tipo de valor Valor padrão
bool false
byte 0
char '\0'
decimal 0M
double 0,0D
enum O valor produzido pela expressão (E)0,
em que E é o identificador de enumeração.
float 0,0F
int 0
long 0L
sbyte 0
short 0
uint 0
ulong 0
ushort 0

Obs: Os valores por referência como string são inicializados com o valor null;

A seguir temos a definição de uma classe Pessoa. Definimos nesta classe :

Na classe Pessoa o construtor estático inicializa o valor do campo estático idadeMinima. Ao lado vemos o mesmo código onde o construtor estático foi criado usando a definição de corpo da expressão.

Quando a primeira instância da classe Pessoa for criada o construtor estático será invocado para inicializar a classe e podemos acessar o valor do campo idadeMinima :

 
 

Note que idadeMinima esta associado à classe Pessoa e não à sua instância p.

Construtores estáticos têm as seguintes propriedades:

Invocando um construtor a partir de outro construtor

Podemos fazer uma chamada para um construtor a partir de outro construtor.  Para isso podemos usar a palavra-chave this.

No exemplo a seguir a classe Pessoa possui 3 construtores. O construtor sem parâmetros Pessoa() usa a palavra-chave this(21) para invocar o construtor Pessoa(int idade) passando o valor 21:

Criando uma instância da classe Pessoa e usando o construtor sem parâmetros, iremos invocar o construtor Pessoa(int Idade) com o resultado mostrado abaixo:

 

Construtores privados

Os construtores com o modificador de acesso "private" são um caso um especial. Usando construtores privados não podemos criar um objeto da classe nem podemos herdar da classe.

Mas podemos ter um conjunto de construtores públicos junto com os construtores privados na classe, e, os construtores públicos podem acessar os construtores privados de dentro da classe por meio do encadeamento de construtores. Para isso usamos a palavra-chave this.

A seguir temos a classe MinhaClasse onde definimos um construtor publico MinhaClasse(int var) : this() e um construtor privado MinhaClasse() :

Podemos criar um objeto da classe usando o construtor público :
MinhaClasse mc1 = new MinhaClasse(10);

E a sequência de execução será a seguinte:

  1. O construtor com parâmetros de MinhaClasse é invocado;
  2. A palavra-chave this invoca o e executa o construtor privado da classe;
  3. A seguir o construtor com parâmetros será executado;

Se tentarmos criar um objeto usando o construtor privado da classe vamos obter uma mensagem de erro indicando que o mesmo é inacessível.

Na terceira parte do artigo vou continuar a falar sobre construtores...

Pegue o código do projeto aqui: CShp_Construtor2.zip

"E por que atentas tu no argueiro que está no olho de teu irmão, e não reparas na trave que está no teu próprio olho ? "
Lucas 6:41

Referências:


José Carlos Macoratti