Implementar una propiedad de solo lectura en C#

Bilal Shahid 12 octubre 2023
  1. Declarar la propiedad de solo lectura en una variable al inicializar en C#
  2. Implementar una propiedad de solo lectura usando una propiedad get simple en C#
Implementar una propiedad de solo lectura en C#

Hoy aprenderemos cómo crear una propiedad de solo lectura en C#, para que solo se pueda leer y no modificar.

Declarar la propiedad de solo lectura en una variable al inicializar en C#

Hemos trabajado en la clase CAR para los dos últimos artículos. Usemos la misma clase e intentemos implementar una propiedad de solo lectura. Digamos que nuestra clase CAR tiene una propiedad conocida como maker_id que queremos mantener de solo lectura por motivos de seguridad.

using System;

class CAR {
  private readonly int maker_id;

  public CAR(int maker_id) {
    this.maker_id = maker_id;
  }

  public int get_maker_id() {
    return maker_id;
  }
}

public class Program {
  static void Main(String[] args) {
    CAR x = new CAR(5);
    Console.WriteLine(x.get_maker_id());
  }
}

Así que hemos declarado el maker_id como readonly. Si ejecuta lo anterior, la salida será:

5

Así que digamos que ahora deseamos agregar otro setter para nuestro campo maker_id. Entonces podemos hacer algo de la siguiente manera:

public void set_maker_id(int maker_id) {
  this.maker_id = maker_id;
}

Pero, ahora notará que arroja un error:

Propiedad de solo lectura de C# en variable - Error

Entonces puedes ver que la propiedad readonly solo nos permite asignar el valor una vez a una variable en el constructor. De lo contrario, tiende a arrojar errores y niega la modificación debido a la accesibilidad.

El código completo se muestra a continuación:

using System;

class CAR {
  private readonly int maker_id;

  public CAR(int maker_id) {
    this.maker_id = maker_id;
  }

  public void set_maker_id(int maker_id) {
    this.maker_id = maker_id;  // line ERROR
  }

  public int get_maker_id() {
    return maker_id;
  }
}

public class Program {
  static void Main(String[] args) {
    CAR x = new CAR(5);
    Console.WriteLine(x.get_maker_id());
  }
}

El error ha sido mencionado en los comentarios en el código.

Implementar una propiedad de solo lectura usando una propiedad get simple en C#

Podemos escribir la propiedad maker_id de la siguiente manera:

private int maker_id { get; }

Y si intenta escribir una función de la siguiente manera:

public void set_val(int val) {
  this.maker_id = val;
}

Se producirá un error de la siguiente manera:

Propiedad de solo lectura de C# usando GET - Error

Entonces puede ver cómo configurar la propiedad get hace que sea de solo lectura. El código completo es el siguiente:

using System;

class CAR {
  private int maker_id {
    get;
    set;
  }

  public CAR(int maker_id) {
    this.maker_id = maker_id;
  }
}

class Program {
  static void Main(String[] args) {
    CAR x = new CAR(5);
  }
}

Esto no solo sigue las reglas de la convención, sino que también tiende a romper los serializadores. Además, no cambia y tiende a ser inmutable.

En caso de que quiera asegurarse de que get devuelva algo, haga el código de la siguiente manera:

class CAR {
  public int maker_id {
    get { return maker_id; }
  }
}

Así es como se implementa un read-only en C#.

Bilal Shahid avatar Bilal Shahid avatar

Hello, I am Bilal, a research enthusiast who tends to break and make code from scratch. I dwell deep into the latest issues faced by the developer community and provide answers and different solutions. Apart from that, I am just another normal developer with a laptop, a mug of coffee, some biscuits and a thick spectacle!

GitHub

Artículo relacionado - Csharp Property