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?

Image of AssemblyAI

Automatic Speech Recognition with AssemblyAI

Experience near-human accuracy, low-latency performance, and advanced Speech AI capabilities with AssemblyAI's Speech-to-Text API. Sign up today and get $50 in API credit. No credit card required.

Try the API

Top comments (0)

Billboard image

The Next Generation Developer Platform

Coherence is the first Platform-as-a-Service you can control. Unlike "black-box" platforms that are opinionated about the infra you can deploy, Coherence is powered by CNC, the open-source IaC framework, which offers limitless customization.

Learn more

👋 Kindness is contagious

Engage with a sea of insights in this enlightening article, highly esteemed within the encouraging DEV Community. Programmers of every skill level are invited to participate and enrich our shared knowledge.

A simple "thank you" can uplift someone's spirits. Express your appreciation in the comments section!

On DEV, sharing knowledge smooths our journey and strengthens our community bonds. Found this useful? A brief thank you to the author can mean a lot.

Okay