En el post del año pasado sobre C# 13 vimos varias funcionalidades que finalmente no entraron en esa versión, pero que se preveía que llegarían en C# 14 (noviembre 2025). Hoy vamos a ver una de ellas: la keyword field.
Tabla de contenidos
1 - La historia de los Backing fields en C#
Quiero empezar hablando de cómo hemos llegado hasta aquí, en C# tenemos fields y propiedades, siendo las propiedades elementos públicos de un objeto los cuales acceden a los fields mientras que los fields son elementos privados que almacenan la información en dicho objeto.
En las primeras versiones de C# la forma en la que definimos estas combinación de características era así:
public class FieldPropExample
{
//field
private string _message;
// property
public string Message
{
get
{
return _message;
}
set
{
_message = value;
}
}
}
Posteriormente el lenguaje evolucionó para permitir los getters y setters que tenemos hoy en día:
public class GetterSetterExample
{
public string Message { get; set; }
}
Por detrás lo que el compilador realiza es crear un “backingfield
” por lo que Message sigue siendo una propiedad, el field sigue existiendo pero no lo tenemos que escribir.
Esto funciona a la perfección hasta que llega el momento de que tenemos que incluir lógica, ya bien sea al getter o al setter, lo cual no es super común pero en algunos casos es necesario.
En este caso la lógica es comprobar si la primera letra viene con mayúscula, si no lo hace lanzamos una excepción:
public class FieldPropExampleWithLogic
{
//field
private string _message;
// property
public string Message
{
get => _message;
set
{
if (string.IsNullOrEmpty(value) || !char.IsUpper(value[0]))
{
throw new ArgumentException("the first letter must be uppercase");
}
_message = value;
}
}
}
Para realizar lógica en el getter o en el setter hasta C# 14 debíamos crear el field de forma manual.
Y esto es lo que cambia a partir de C# 14, no debemos introducir manualmente el backing field, ya que el compilador lo hará por nosotros con la nueva keyword field.
2 - La keyword field de C#
A partir de C# 14 tenemos la nueva keyword field
, la cual nos permite no tener que introducir el backing field pero poder seguir añadiendo configuraciones extra tanto en el getter como en el setter:
public class FieldKeywordExampleWithLogic
{
public string Message
{
get => field;
set
{
if (string.IsNullOrEmpty(value) || !char.IsUpper(value[0]))
{
throw new ArgumentException("the first letter must be uppercase");
}
field = value;
}
}
}
Lo cual reduce la cantidad de código que vamos a estar escribiendo. Pero no solo eso, ya que la keyword field está encapsulada dentro del propio accesor y no se puede acceder fuera de este, así que si desde dentro del propio objeto tampoco podemos hacer referencia al backed field (esto es bueno)
Finalmente, si tuvieras un field ya existente llamada field en el propio objeto, lo cual puede pasar si el código es antiguo, puedes solucionarlo con @field
o con this.field
, aunque lo ideal sería no llamar a nada field claro.