Campos (Guía de programación de C#)Fields (C# Programming Guide)

Un campo es una variable de cualquier tipo que se declara directamente en una clase o struct.A field is a variable of any type that is declared directly in a class or struct. Los campos son miembros de su tipo contenedor.Fields are members of their containing type.

Una clase o struct puede tener campos de instancia o campos estáticos, o ambos.A class or struct may have instance fields or static fields or both. Los campos de instancia son específicos de una instancia de un tipo.Instance fields are specific to an instance of a type. Si tiene una clase T, con un campo de instancia F, puede crear dos objetos de tipo T y modificar el valor de F en cada objeto sin afectar el valor del otro 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 el contrario, un campo estático pertenece a la propia clase y se comparte entre todas las instancias de esa clase.By contrast, a static field belongs to the class itself, and is shared among all instances of that class. Los cambios realizados desde la instancia A serán visibles inmediatamente para las instancias B y C, si tienen acceso al campo.Changes made from instance A will be visibly immediately to instances B and C if they access the field.

Por lo general, solo se deben usar campos para las variables que tienen accesibilidad privada o protegida.Generally, you should use fields only for variables that have private or protected accessibility. Los datos que la clase expone al código de cliente deben proporcionarse a través de métodos, propiedades e indizadores.Data that your class exposes to client code should be provided through methods, properties and indexers. Mediante estas construcciones para el acceso indirecto a los campos internos, se puede proteger de los valores de entrada no válidos.By using these constructs for indirect access to internal fields, you can guard against invalid input values. Un campo privado que almacena los datos expuestos por una propiedad pública se denomina memoria auxiliar o campo de respaldo.A private field that stores the data exposed by a public property is called a backing store or backing field.

Los campos almacenan habitualmente los datos que deben ser accesibles para más de un método de clase y que deben almacenarse durante más tiempo de lo que dura un único método.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 ejemplo, es posible que una clase que representa una fecha de calendario tenga tres campos enteros: uno para el mes, otro para el día y otro para el año.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. Las variables que no se usan fuera del ámbito de un único método se deben declarar como variables locales dentro del campo del 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.

Los campos se declaran en el bloque de clase especificando el nivel de acceso del campo, seguido por el tipo del campo, seguido por el nombre del 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 ejemplo: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 obtener acceso a un campo en un objeto, agregue un punto después del nombre de objeto, seguido del nombre del campo, como en 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 ejemplo:For example:

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

Se puede proporcionar un valor inicial a un campo mediante el operador de asignación cuando se declara el campo.A field can be given an initial value by using the assignment operator when the field is declared. Para asignar automáticamente el campo day a "Monday", por ejemplo, se declararía day como en el ejemplo siguiente: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";
    //...
}

Los campos se inicializan inmediatamente antes de que se llame al constructor para la instancia del objeto.Fields are initialized immediately before the constructor for the object instance is called. Si el constructor asigna el valor de un campo, sobrescribirá cualquier valor dado durante la declaración del campo.If the constructor assigns the value of a field, it will overwrite any value given during field declaration. Para obtener más información, vea Using Constructors (Uso de constructores).For more information, see Using Constructors.

Nota

Un inicializador de campo no puede hacer referencia a otros campos de instancia.A field initializer cannot refer to other instance fields.

Se pueden marcar campos como público, privado, protegido, interno, protegido interno o privado protegido.Fields can be marked as public, private, protected, internal, protected internal or private protected. Estos modificadores de acceso definen cómo los usuarios de la clase pueden obtener acceso a los campos.These access modifiers define how users of the class can access the fields. Para obtener más información, consulte Modificadores de acceso.For more information, see Access Modifiers.

Opcionalmente, un campo se puede declarar como static.A field can optionally be declared static. Esto hace que el campo esté disponible para los llamadores en cualquier momento, aunque no exista ninguna instancia de la clase.This makes the field available to callers at any time, even if no instance of the class exists. Para más información, vea Clases estáticas y sus miembros.For more information, see Static Classes and Static Class Members.

Se puede declarar un campo como readonly.A field can be declared readonly. Solamente se puede asignar un valor a un campo de solo lectura durante la inicialización o en un constructor.A read-only field can only be assigned a value during initialization or in a constructor. Un campo static readonly es muy similar a una constante, salvo que el compilador de C# no tiene acceso al valor de un campo estático de solo lectura en tiempo de compilación, solo en tiempo de ejecución.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 obtener más información, vea Constants (Constantes).For more information, see Constants.

Especificación del lenguaje C#C# Language Specification

Para obtener más información, consulte la Especificación del lenguaje C#.For more information, see the C# Language Specification. La especificación del lenguaje es la fuente definitiva de la sintaxis y el uso de C#.The language specification is the definitive source for C# syntax and usage.

Vea tambiénSee also