Compartilhar via


Campos (Guia de Programação em C#)

Um campo é uma variável de qualquer tipo que é declarado diretamente em uma classe ou struct. Os campos são membros do tipo que os contém.

Uma classe ou struct pode ter campos de instância, campos estáticos ou ambos. Os campos de instância são específicos para uma instância de um tipo. Se você tiver uma classe T, com um campo Fde instância, poderá criar dois objetos do tipo Te modificar o valor de F cada objeto sem afetar o valor no outro objeto. Por outro lado, um campo estático pertence ao próprio tipo e é compartilhado entre todas as instâncias desse tipo. Você só pode acessar o campo estático usando o nome do tipo. Se você acessar o campo estático por um nome de instância, receberá um erro de tempo de compilação CS0176 .

Em geral, você deve declarar private ou protected acessibilidade para campos. Os dados que seu tipo expõe ao código do cliente devem ser fornecidos por meio de métodos, propriedades e indexadores. Usando esses constructos para acesso indireto a campos internos, você pode se proteger contra valores de entrada inválidos. Um campo privado que armazena os dados expostos por uma propriedade pública é chamado de repositório de backup ou campo de backup. Você pode declarar public campos, mas não pode impedir que o código que usa seu tipo configure esse campo como um valor inválido ou altere os dados de um objeto.

Os campos normalmente armazenam os dados que devem ser acessíveis a mais de um método de tipo e devem ser armazenados por mais tempo do que o tempo de vida de qualquer método único. Por exemplo, um tipo que representa uma data de calendário pode ter três campos inteiros: um para o mês, um para o dia e outro para o ano. Variáveis que não são usadas fora do escopo de um único método devem ser declaradas como variáveis locais dentro do próprio corpo do método.

Os campos são declarados no bloco de classe ou struct especificando o nível de acesso, seguido pelo tipo, seguido pelo nome do campo. Por exemplo:

public class CalendarEntry
{

    // private field (Located near wrapping "Date" property).
    private DateTime _date;

    // Public property exposes _date field safely.
    public DateTime Date
    {
        get
        {
            return _date;
        }
        set
        {
            // Set some reasonable boundaries for likely birth dates.
            if (value.Year > 1900 && value.Year <= DateTime.Today.Year)
            {
                _date = value;
            }
            else
            {
                throw new ArgumentOutOfRangeException("Date");
            }
        }
    }

    // public field (Generally not recommended).
    public string? Day;

    // Public method also exposes _date field safely.
    // Example call: birthday.SetDate("1975, 6, 30");
    public void SetDate(string dateString)
    {
        DateTime dt = Convert.ToDateTime(dateString);

        // Set some reasonable boundaries for likely birth dates.
        if (dt.Year > 1900 && dt.Year <= DateTime.Today.Year)
        {
            _date = dt;
        }
        else
        {
            throw new ArgumentOutOfRangeException("dateString");
        }
    }

    public TimeSpan GetTimeSpan(string dateString)
    {
        DateTime dt = Convert.ToDateTime(dateString);

        if (dt.Ticks < _date.Ticks)
        {
            return _date - dt;
        }
        else
        {
            throw new ArgumentOutOfRangeException("dateString");
        }
    }
}

Para acessar um campo em uma instância, adicione um período após o nome da instância, seguido pelo nome do campo, como em instancename._fieldName. Por exemplo:

CalendarEntry birthday = new CalendarEntry();
birthday.Day = "Saturday";

Um campo pode receber um valor inicial usando o operador de atribuição quando o campo é declarado. Para atribuir automaticamente o Day campo a "Monday", por exemplo, você declararia Day como no exemplo a seguir:

public class CalendarDateWithInitialization
{
    public string Day = "Monday";
    //...
}

Os campos são inicializados imediatamente antes que o construtor da instância de objeto seja chamado. Se o construtor atribuir um valor a um campo, isso substituirá qualquer valor anteriormente definido na declaração do campo. Para obter mais informações, veja Usando construtores.

Observação

Um inicializador de campo não pode se referir a outros campos de instância.

Os campos podem ser marcados como public, , private, protected, internal, protected internalou private protected. Esses modificadores de acesso definem como os usuários do tipo podem acessar os campos. Para obter mais informações, consulte Modificadores de Acesso.

Opcionalmente, um campo pode ser declarado static. Os campos estáticos estão disponíveis para chamadores a qualquer momento, mesmo que nenhuma instância do tipo exista. Para obter mais informações, consulte Classes estáticas e membros de classe estática.

Um campo pode ser declarado readonly. Um campo somente leitura só pode ser atribuído a um valor durante a inicialização ou em um construtor. Um static readonly campo é semelhante a uma constante, exceto que o compilador C# não tem acesso ao valor de um campo somente leitura estático no momento da compilação, apenas no momento da execução. Para obter mais informações, consulte Constantes.

Um campo pode ser declarado required. Um campo necessário deve ser inicializado pelo construtor ou por um inicializador de objeto quando um objeto é criado. Adicione o System.Diagnostics.CodeAnalysis.SetsRequiredMembersAttribute atributo a qualquer declaração de construtor que inicialize todos os membros necessários.

O required modificador não pode ser combinado com o readonly modificador no mesmo campo. No entanto, a propriedade pode ser somente required e init.

A partir do C# 12, os parâmetros do construtor primário são uma alternativa para declarar campos. Quando seu tipo tiver dependências que devem ser fornecidas na inicialização, você poderá criar um construtor primário que forneça essas dependências. Esses parâmetros podem ser capturados e usados no lugar de campos declarados em seus tipos. No caso de tipos record, os parâmetros do construtor primário são exibidos como propriedades públicas.

Especificação da linguagem C#

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

Consulte também