DEV Community

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

Posted on • Edited on

2

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?

AWS Security LIVE!

Join us for AWS Security LIVE!

Discover the future of cloud security. Tune in live for trends, tips, and solutions from AWS and AWS Partners.

Learn More

Top comments (0)

The Most Contextual AI Development Assistant

Pieces.app image

Our centralized storage agent works on-device, unifying various developer tools to proactively capture and enrich useful materials, streamline collaboration, and solve complex problems through a contextual understanding of your unique workflow.

👥 Ideal for solo developers, teams, and cross-company projects

Learn more

👋 Kindness is contagious

Please leave a ❤️ or a friendly comment on this post if you found it helpful!

Okay