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

Um campo é uma variável de qualquer tipo que é declarada diretamente em uma classe ou struct.A field is a variable of any type that is declared directly in a class or struct. Os campos são membros do tipo que os contém.Fields are members of their containing type.

Uma classe ou um struct podem ter campos de instância, campos estáticos ou ambos.A class or struct may have instance fields or static fields or both. Os campos de instância são específicos a uma instância de um tipo.Instance fields are specific to an instance of a type. Se você tem uma classe T, com um campo de instância F, você pode criar dois objetos do tipo T e modificar o valor de F em cada objeto sem afetar o valor no outro objeto.If you have a class T, with an instance field F, you can create two objects of type T, and modify the value of F in each object without affecting the value in the other object. Por outro lado, um campo estático pertence à própria classe e é compartilhado entre todas as instâncias dessa classe.By contrast, a static field belongs to the class itself, and is shared among all instances of that class. As alterações feitas na instância A serão imediatamente visíveis para as instâncias B e C se elas acessarem o campo.Changes made from instance A will be visibly immediately to instances B and C if they access the field.

Em geral, você só deve usar campos para variáveis que têm acessibilidade particular ou protegida.Generally, you should use fields only for variables that have private or protected accessibility. Os dados que a classe expõe para o código de cliente devem ser fornecidos por meio de métodos, propriedades e indexadores.Data that your class exposes to client code should be provided through methods, properties and indexers. Usando esses constructos para acesso indireto aos campos internos, você pode proteger contra valores de entrada inválidos.By using these constructs for indirect access to internal fields, you can guard against invalid input values. Um campo particular que armazena os dados expostos por uma propriedade pública é chamado de repositório de backup ou de campo de suporte.A private field that stores the data exposed by a public property is called a backing store or backing field.

Os campos normalmente armazenam os dados que devem estar acessíveis a mais de um método de classe e devem ser armazenados por mais tempo que o tempo de vida de qualquer método único.Fields typically store the data that must be accessible to more than one class method and must be stored for longer than the lifetime of any single method. Por exemplo, uma classe que representa uma data do calendário pode ter três campos de inteiros: um para o mês, um para o dia e outro para o ano.For example, a class that represents a calendar date might have three integer fields: one for the month, one for the day, and one for the year. As variáveis que não são usadas fora do escopo de um método único devem ser declaradas como variáveis locais dentro do próprio corpo do método.Variables that are not used outside the scope of a single method should be declared as local variables within the method body itself.

Os campos são declarados no bloco de classe, especificando o nível de acesso do campo, seguido pelo tipo do campo e pelo nome do campo.Fields are declared in the class block by specifying the access level of the field, followed by the type of the field, followed by the name of the field. Por exemplo:For example:

   public class CalendarEntry
   {
       // private field
       private DateTime date;

       // public field (Generally not recommended.)
       public string day;

       // 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();
           }

       }

       // 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();
       }

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

           if (dt != null && dt.Ticks < date.Ticks)
           {
               return date - dt;
           }
           else
               throw new ArgumentOutOfRangeException();  

       }
   }

Para acessar um campo em um objeto, adicione um ponto após o nome do objeto, seguido pelo nome do campo, como em objectname.fieldname.To access a field in an object, add a period after the object name, followed by the name of the field, as in objectname.fieldname. Por exemplo:For example:

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

Um campo pode receber um valor inicial, usando o operador de atribuição quando o campo é declarado.A field can be given an initial value by using the assignment operator when the field is declared. Para atribuir automaticamente o campo day ao "Monday", por exemplo, você poderia declarar day como no exemplo a seguir:To automatically assign the day field to "Monday", for example, you would declare day as in the following example:

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

Os campos são inicializados imediatamente antes do construtor para a instância do objeto ser chamado.Fields are initialized immediately before the constructor for the object instance is called. Se o construtor atribuir o valor de um campo, ele substituirá qualquer valor fornecido durante a declaração do campo.If the constructor assigns the value of a field, it will overwrite any value given during field declaration. Para obter mais informações, veja Usando construtores.For more information, see Using Constructors.

Observação

Um inicializador de campo não pode fazer referência a outros campos de instância.A field initializer cannot refer to other instance fields.

Os campos podem ser marcados como public, private, protected, internal, protected internal ou private protected.Fields can be marked as public, private, protected, internal, protected internal or private protected. Esses modificadores de acesso definem como os usuários da classe podem acessar os campos.These access modifiers define how users of the class can access the fields. Para obter mais informações, consulte Modificadores de Acesso.For more information, see Access Modifiers.

Opcionalmente, um campo pode ser declarado static.A field can optionally be declared static. Isso torna o campo disponível para chamadores a qualquer momento, mesmo se não existir nenhuma instância da classe.This makes the field available to callers at any time, even if no instance of the class exists. Para obter mais informações, consulte Classes estáticas e membros de classes estáticas.For more information, see Static Classes and Static Class Members.

Um campo pode ser declarado readonly.A field can be declared readonly. Um valor só pode ser atribuído a um campo somente leitura durante a inicialização ou em um construtor.A read-only field can only be assigned a value during initialization or in a constructor. Um campo static readonly é muito semelhante a uma constante, exceto que o compilador C# não tem acesso ao valor de um campo somente leitura estático em tempo de compilação, mas somente em tempo de execução.A static readonly field is very similar to a constant, except that the C# compiler does not have access to the value of a static read-only field at compile time, only at run time. Para obter mais informações, consulte Constantes.For more information, see Constants.

Especificação da Linguagem C#C# Language Specification

Para obter mais informações, consulte a Especificação da linguagem C#.For more information, see the C# Language Specification. A especificação da linguagem é a fonte definitiva para a sintaxe e o uso de C#.The language specification is the definitive source for C# syntax and usage.

Consulte tambémSee Also