DEV Community

Baltasar García Perez-Schofield
Baltasar García Perez-Schofield

Posted on • Edited on

C# { get; set => field = getDotNet9() }

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";
    }
}
Enter fullscreen mode Exit fullscreen mode

Podemos utilizar esta clase con código como el siguiente:

var p1 = new Pos{
             Lat = 42.34492263526889,
             Lon = -7.85534246703789 };
Console.WriteLine( p1 );
Enter fullscreen mode Exit fullscreen mode

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;
}
Enter fullscreen mode Exit fullscreen mode

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" );
            }
        }
    }
}
Enter fullscreen mode Exit fullscreen mode

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)