Partilhar via


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

Um campo é uma variável de qualquer tipo que é declarada 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 de 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 em 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ê pode acessar o campo estático somente usando o nome do tipo. Se você acessar o campo estático por um nome de instância, obterá um erro em tempo de compilação CS0176 .

Geralmente, 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 essas construções 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 armazenamento de suporte ou campo de suporte. Você pode declarar public campos, mas não pode impedir que o código que usa seu tipo defina 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 a vida útil 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 um para o ano. As 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 ponto 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 ao "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 do construtor para a instância do objeto ser chamado. Se o construtor atribui o valor de um campo, ele substitui qualquer valor dado durante a declaração de campo. Para obter mais informações, consulte Usando construtores.

Nota

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

Os campos podem ser marcados como , , , internalprotected, protected internal, ou private protected. privatepublic 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 classes estáticas.

Um campo pode ser declarado readonly. Um campo somente leitura só pode ser atribuído 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 estático somente leitura em tempo de compilação, apenas em tempo de execução. Para obter mais informações, consulte Constantes.

Um campo pode ser declarado required. Um campo obrigatório deve ser inicializado pelo construtor ou por um inicializador de objeto quando um objeto é criado. Você adiciona o System.Diagnostics.CodeAnalysis.SetsRequiredMembersAttribute atributo a qualquer declaração de construtor que inicializa 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 required e init apenas.

A partir do C# 12, os parâmetros do construtor Primary são uma alternativa à declaração de campos. Quando seu tipo tem dependências que devem ser fornecidas na inicialização, você pode criar um construtor primário que fornece essas dependências. Esses parâmetros podem ser capturados e usados no lugar de campos declarados em seus tipos. No caso de tipos, os parâmetros primários do record construtor são apresentados como propriedades públicas.

Especificação da linguagem C#

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

Consulte também