Partilhar via


Construtores (guia de programação em C#)

Um construtor é um método chamado pelo tempo de execução quando uma instância de uma classe ou um struct é criada. Uma classe ou struct pode ter vários construtores que usam argumentos diferentes. Os construtores permitem que você garanta que instâncias do tipo sejam válidas quando criadas. Para obter mais informações e exemplos, consulte Construtores de instância e Usando construtores.

Há várias ações que fazem parte da inicialização de uma nova instância. As seguintes ações ocorrem na seguinte ordem:

  1. Os campos de instância são definidos como 0. Esta inicialização é normalmente feita pelo ambiente de execução.
  2. Os inicializadores de campo são processados. Os inicializadores de campo no tipo mais derivado são executados.
  3. Os inicializadores dos campos do tipo base são executados. Inicializadores de campo que começam com a base direta e percorrem cada tipo de base até System.Object.
  4. Construtores de instância base são executados. Qualquer construtor de instância, começando com Object.Object, atravessando cada classe base até à classe base direta.
  5. O construtor de instância é executado. O construtor de instância para o tipo é executado.
  6. Os inicializadores de objeto são executados. Se a expressão incluir quaisquer inicializadores de objeto, eles serão executados após a execução do construtor de instância. Os inicializadores de objeto são executados na ordem textual.

As ações anteriores ocorrem quando uma instância é criada usando o operador new. Se uma nova instância de um struct estiver definida com seu valor default, todos os campos de instância serão definidos como 0. Os elementos de uma matriz são definidos com seu valor padrão de 0 ou null quando uma matriz é criada.

O construtor estático, se houver, é executado antes que quaisquer ações do construtor de instância ocorram para qualquer instância do tipo. O construtor estático é executado no máximo uma vez.

Sintaxe do construtor

Um construtor é um método com o mesmo nome que seu tipo. A assinatura do método pode incluir um modificador de acesso opcional, o nome do método e a sua lista de parâmetros; não deve incluir um tipo de retorno. O exemplo a seguir mostra o construtor de uma classe chamada Person.

public class Person
{
   private string last;
   private string first;

   public Person(string lastName, string firstName)
   {
      last = lastName;
      first = firstName;
   }

   // Remaining implementation of Person class.
}

Se um construtor pode ser implementado como uma única instrução, você pode usar um membro do corpo da expressão . O exemplo a seguir define uma classe Location cujo construtor tem um único parâmetro string chamado name. A definição do corpo da expressão atribui o argumento ao campo locationName.

public class Location
{
   private string locationName;

   public Location(string name) => Name = name;

   public string Name
   {
      get => locationName;
      set => locationName = value;
   }
}

Se um tipo requer um parâmetro para criar uma instância, você pode usar um do construtor primário para indicar que um ou mais parâmetros são necessários para instanciar o tipo, conforme mostrado no exemplo a seguir:

public class LabelledContainer<T>(string label)
{
   public string Label { get; } = label;
   public required T Contents 
   { 
      get;
      init;
   }
}

Construtores estáticos

Os exemplos anteriores mostram construtores de instância, que inicializam um novo objeto. Uma classe ou struct também pode declarar um construtor estático, que inicializa membros estáticos do tipo. Os construtores estáticos são sem parâmetros. Se você não fornecer um construtor estático para inicializar campos estáticos, o compilador C# inicializará campos estáticos com seu valor padrão, conforme listado no Valores padrão de tipos C# artigo.

O exemplo a seguir usa um construtor estático para inicializar um campo estático.

public class Adult : Person
{
   private static int minimumAge;

   public Adult(string lastName, string firstName) : base(lastName, firstName)
   { }

   static Adult() => minimumAge = 18;

   // Remaining implementation of Adult class.
}

Você também pode definir um construtor estático com uma definição de corpo de expressão, como mostra o exemplo a seguir.

public class Child : Person
{
   private static int maximumAge;

   public Child(string lastName, string firstName) : base(lastName, firstName)
   { }

   static Child() => maximumAge = 18;

   // Remaining implementation of Child class.
}

Para obter mais informações e exemplos, consulte Static Constructors.

Ver também