Los ingenieros de Microsoft han publicado como preview (hay que incluir en el proyecto la línea <LangVersion>preview</LangVersion>
), la característica de poder acceder al atributo creado por el compilador para una propiedad automática.
Es muy sencillo: supongamos que tenemos la siguiente clase Pos:
public class Pos {
public required double Lat { get; init; }
public required double Lon { get; init; }
public override string ToString()
{
return $"{Lat}ºN {Lon}ºW";
}
}
Podemos utilizar esta clase con código como el siguiente:
var p1 = new Pos{
Lat = 42.34492263526889,
Lon = -7.85534246703789 };
Console.WriteLine( p1 );
La cuestión es que, como ya vimos, cuando creamos las propiedades como init, tenemos tendencia a olvidar las invariantes de la clase. En concreto, la latitud puede tomar valores entre -90 y 90, mientras que la longitud puede tomar valores entre -180 y 180.
Pero... el problema es que, en cuanto "nos salimos" de leer y escribir un valor, aunque solo sea para comprobar rangos, ya estamos fuera de los supuestos de creación de una propiedad automática, y es que para empezar tenemos que crear el atributo que va a estar detrás de una propiedad.
public class Pos {
// más cosas...
public required double Lat {
get => this._lat;
init {
if ( value < -90
|| value > 90 )
{
this._lat = value;
} else {
throw new ArgumentException( "invalid lat" );
}
}
}
private double _lat;
}
Pues para "evitar" esto, es decir, para evitar la "incomodidad" de tener que crear el atributo, ahora C# va a soportar field
, que nos permitirá referenciar el atributo que habrá creado el compilador para respaldar la propiedad.
public class Pos {
// más cosas...
public required double Lat {
get => field;
init {
if ( value < -90
|| value > 90 )
{
field = value;
} else {
throw new ArgumentException( "invalid lat" );
}
}
}
}
Interesante; quiero decir, que solo se trata de una comodidad, nada más. ¿Y tú, qué opinas? ¿Es una adición atractiva al lenguaje?
Top comments (0)