Nota
El acceso a esta página requiere autorización. Puede intentar iniciar sesión o cambiar directorios.
El acceso a esta página requiere autorización. Puede intentar cambiar los directorios.
Un campo es una variable de cualquier tipo que se declara directamente en una clase o estructura. Los campos son miembros de su tipo contenedor.
Una clase o estructura puede tener campos de instancia, campos estáticos o ambos. Los campos de instancia son específicos de una instancia de un tipo. Si tiene una clase T
, con un campo F
de instancia , puede crear dos objetos de tipo T
y modificar el valor de F
en cada objeto sin afectar al valor del otro objeto. Por el contrario, un campo estático pertenece al propio tipo y se comparte entre todas las instancias de ese tipo. Solo puede acceder al campo estático mediante el nombre de tipo. Si accede al campo estático con un nombre de instancia, obtendrá el error en tiempo de compilación CS0176.
Por lo general, debe declarar una accesibilidad private
o protected
de los campos. Los datos que expone el tipo al código de cliente deben proporcionarse a través de métodos, propiedades e indexadores. Mediante estas construcciones para el acceso indirecto a los campos internos, puede protegerse frente a valores de entrada no válidos. Un campo privado que almacena los datos expuestos por una propiedad pública se denomina memoria auxiliar o campo de respaldo. Puede declarar public
campos, pero no puede impedir que el código que use el tipo establezca ese campo en un valor no válido o cambie los datos de un objeto.
Los campos suelen almacenar los datos que deben ser accesibles para más de un método de tipo y deben almacenarse durante más tiempo que la duración de cualquier método único. Por ejemplo, un tipo que representa una fecha de calendario podría tener tres campos enteros: uno para el mes, otro para el día y otro para el año. Las variables que no se usan fuera del ámbito de un único método deben declararse como variables locales dentro del propio cuerpo del método.
Los campos se declaran en el bloque de clase o estructura especificando el nivel de acceso, seguido del tipo, seguido del nombre del campo. Por ejemplo:
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 acceder a un campo de una instancia, agregue un período después del nombre de la instancia, seguido del nombre del campo, como en instancename._fieldName
. Por ejemplo:
CalendarEntry birthday = new CalendarEntry();
birthday.Day = "Saturday";
Se puede asignar un valor inicial a un campo mediante el operador de asignación cuando se declara el campo. Para asignar automáticamente el Day
campo a "Monday"
, por ejemplo, declararía Day
como en el ejemplo siguiente:
public class CalendarDateWithInitialization
{
public string Day = "Monday";
//...
}
Los campos se inicializan inmediatamente antes de llamar al constructor de la instancia de objeto. Si el constructor asigna el valor de un campo, sobrescribe cualquier valor proporcionado durante la declaración de campo. Para obtener más información, vea Utilizar constructores.
Nota:
Un inicializador de campo no puede hacer referencia a otros campos de instancia.
Los campos se pueden marcar como public
, private
, protected
, internal
, , protected internal
o private protected
. Estos modificadores de acceso definen cómo los usuarios del tipo pueden acceder a los campos. Para obtener más información, vea Modificadores de acceso.
Opcionalmente, un campo se puede declarar static
. Los campos estáticos están disponibles para los autores de llamadas en cualquier momento, incluso si no existe ninguna instancia del tipo. Para obtener más información, vea Clases estáticas y miembros de clase estática.
Se puede declarar readonly
un campo . Un campo de solo lectura solo se puede asignar un valor durante la inicialización o en un constructor. Un static readonly
campo es 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. Para obtener más información, vea Constantes.
Se puede declarar required
un campo . Un campo requerido debe ser inicializado por el constructor o por un inicializador de objeto cuando se crea un objeto. Agregue el System.Diagnostics.CodeAnalysis.SetsRequiredMembersAttribute atributo a cualquier declaración de constructor que inicialice todos los miembros necesarios.
El required
modificador no se puede combinar con el readonly
modificador en el mismo campo. Sin embargo, la propiedad solo puede ser required
y init
.
A partir de C# 12, los parámetros del constructor principal son una alternativa a declarar campos. Cuando el tipo tiene dependencias que se deben proporcionar en la inicialización, puede crear un constructor principal que proporcione esas dependencias. Estos parámetros se pueden capturar y usar en lugar de campos declarados en los tipos. En el caso de record
tipos, los parámetros del constructor principal se exponen como propiedades públicas.
Especificación del lenguaje C#
Para obtener más información, consulte la Especificación del lenguaje C#. La especificación del lenguaje es el origen definitivo de la sintaxis y el uso de C#.