Nota del autor

Si la entrada que estás leyendo carece de imágenes, no se ve el vídeo que teóricamente lleva incrustado o el código fuente mostrado aparece sin formato, podéis conocer los motivos aquí. Poco a poco iré restableciendo la normalidad en el blog.
Este blog es un archivo de los artículos situados previamente en Lobosoft.es y ha dejado de ser actualizado. Las nuevas entradas pueden encontrarse en www.lobosoft.es. Un saludo,
Lobosoft.

lunes, 3 de marzo de 2008

Propiedades automáticas en C# 3.0

Seguimos con las novedades del .Net Framework 3.5, en concreto con las propiedades automáticas que vienen incluidas desde la versión 3.0 del mismo. Hasta no hace mucho, cuando deseábamos declarar una propiedad que simplemente almacenase o recuperase un valor de un campo privado de nuestra clase, el proceso a seguir era el siguiente:




  1. Declarar la variable privada.

  2. Definir la propiedad que permitía el acceso de lectura (get{}) y escritura (set{}) a la misma.


Con lo que el código podía quedar así:


[csharp]
private string mipropiedad;

public string MiPropiedad
{
get { return mipropiedad; }
set { mipropiedad= value; }
}
[/csharp]

Esto, repetido por ejemplo para una clase con veinte propiedades, conlleva un importante trabajo de copy&paste(TM) ;) .


En C# 3.0 podemos (si lo deseamos) hacerlo así:


[csharp]public string MiPropiedad { get; set; }[/csharp]

Ahorramos la declaración de la variable, y la asignación y recuperación de valores. Claro está, lo único que está haciendo Visual Studio es encargarse de generar, de forma automática, toda la lógica subyacente. Si usamos Reflector para ver la clase generada, nos encontraremos con lo siguiente:


Propiedades automáticas en C# 3.0


Ahora bien, si deseamos declarar una propiedad automática de sólo lectura o sólo escritura, ¿bastará con un public string MiPropiedad { set; } o un public string MiPropiedad { get; }? Sintiéndolo mucho, la respuesta es que no. De intentarlo, se provocará el error de compilación "'NamespaceX.MiPropiedad.set' (o get) must declare a body because it is not marked abstract or extern. Automatically implemented properties must define both get and set accessors."


Para lograrlo debemos declarar como privado el set, en las propiedades de sólo lectura, y el get en las de sólo escritura.
[csharp]
// Propiedad de sólo lectura
public string MiPropiedadSoloLectura
{
get;
private set;
}

// Propiedad de sólo escritura
public string MiPropiedadSoloEscritura
{
private get;
set;
}[/csharp]

Lo que para el CLR se traduce en:


Propiedades automáticas de solo lectura/escritura en C# 3.0

1 comentario:

  1. La verdad es que es de agradecer esta mejora. En en muchas ocasiones nos encontramos con una clase que una inmensa cantidad de propiedades y aunque parezca que no, conlleva un trabajo de chinos. Otro detalle, que me parece tal vez de mayor importancia, es lo limpio que queda el código de esta manera.

    ResponderEliminar