Compartilhar via


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

Um construtor é um método chamado pelo runtime quando é criada uma instância de uma classe ou de uma struct. Uma classe ou struct pode ter vários construtores que têm argumentos diferentes. Os construtores permitem que você garanta que as 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. Campos de instância são definidos como 0. Essa inicialização normalmente é feita pelo runtime.
  2. Inicializadores de campo são executados. Os inicializadores de campo na execução de tipo mais derivada.
  3. Inicializadores de campo de tipo base são executados. Inicializadores de campo começando com a base direta por meio de cada tipo base para System.Object.
  4. Construtores de instância base são executados. Todos os construtores de instância, começando por Object.Object, em cada classe base para a classe base direta.
  5. O construtor de instância é executado. O construtor de instância para o tipo é executado.
  6. Inicializadores de objeto são executados. Se a expressão incluir os inicializadores de objeto, eles são executados após a execução do construtor de instância. 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 for definida como seu valor default, todos os campos de instância serão definidos como 0. Os elementos de uma matriz são definidos como o valor padrão de 0 ou null quando uma matriz é criada.

O construtor estático, se houver, é executado antes que qualquer ação do construtor de instância ocorra 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 sua lista de parâmetros; ela não inclui 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 puder ser implementado como uma única instrução, você poderá usar uma membro do corpo da expressão. O exemplo a seguir define uma classe Location cujo construtor tem um único parâmetro de cadeia de caracteres chamado nome. 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 exigir um parâmetro para criar uma instância, você poderá usar um 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. Construtores estáticos não têm parâmetros. Se você não fornecer um construtor estático para inicializar campos estáticos, o compilador C# inicializará campos estáticos para o valor padrão, conforme listado no artigo Valores padrão dos tipos C#.

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 Construtores Estáticos.

Consulte também