En .NET podemos crear y utilizar un elemento especial, denominado Propiedad, que aunque a simple vista parece ser una variable cualquiera, puede esconder una funcionalidad tan compleja como lo necesitemos.
Suponiendo que creamos una clase Venta, en la cual ponemos un producto, su precio unitario, la cantidad comprada, el valor en IVA y el importe total. Lo que pensaríamos en seguida es crear la clase con las variables para los datos que el usuario modifique y funciones que calculen los otros. Algo así:
public class Venta{ public string producto; public decimal precioUnitario; public int cantidad; public decimal iva(){ return precioUnitario * 0.16; } public decimal importeTotal(){ return (precioUnitario + iva()) * cantidad; } }
Problema resuelto, aparentemente. Ahora, supongamos que tenemos toda una lista de Ventas, obtenidas de una base de datos, y la queremos insertar en un DataGridView. ¿Qué haremos? Bueno, podemos crear un DataTable e ir insertando los datos uno por uno.
DataTable dt = new DataTable(); // Se crean las columnas para el DataTable foreach (Venta venta in List<Venta>) { DataRow dr = dt.NewRow(); dr["Producto"] = venta.producto; dr["PrecioUnitario"] = venta.precioUnitario; dr["Cantidad"] = venta.cantidad; dr["IVA"] = venta.iva(); dr["ImporteTotal"] = venta.importeTotal(); }
Ahora ya tenemos nuestra tabla llena, y podemos usarla dentro del Grid.
Pero para nuestra sorpresa (y disgusto, después de tanto trabajo), hay maneras más fáciles de hacer esto, definiendo esas variables y métodos como propiedades.
Una propiedad es una especie de combinación entre lo que es una variable y un método, ya que se define parecido al segundo, pero se utiliza como el primero.
string variable; public string propiedad{ get{ return variable; } set{ variable = value; } }
Una propiedad tiene dos secciones: get, que devuelve un valor, cuando la propiedad es consultada, y set, que recibe un valor dentro de la palabra reservada value, del mismo tipo de la propiedad, y es utilizada dentro de la misma.
propiedad = "hola" // se invoca get string str = propiedad; // se invoca set
Aquí podemos ver la diferencia con las variables. Usamos una propiedad para mostrar el valor de una variable inaccesible desde fuera de la clase, la cual pudo haber sido modificada internamente. Nuestra clase Venta puede quedar, entonces, de esta forma:
public class Venta{ private string _producto; public string producto{ get{ return _producto; } set{ _producto = value; } } private decimal _precioUnitario; public decimal precioUnitario{ get{ return _precioUnitario; } set{ _precioUnitario = value; } } private int _cantidad; public int cantidad{ get{ return _cantidad; } set{ _cantidad = value; } } public decimal iva{ get{ return _precioUnitario * 0.16; } } public decimal importeTotal{ get{ return (_precioUnitario + iva) * _cantidad; } // Incluso podemos llamar a una propiedad desde otra! } }
Las propiedades iva e importeTotal no tienen sección set
, ya que son valores calculados con base en los otros datos. Si omitimos set
, la propiedad será de sólo lectura, y si omitimos get
, será de sólo escritura.
Ahora, ¿cómo resolvemos el asunto de llenar un grid con una lista de Ventas? Lo único que tenemos que hacer es asignar esa lista como DataSource del grid, mapear las columnas de éste a los nombres de las propiedades y listo. No hay necesidad de llenar un DataTable, ya que un objeto List es considerado origen de datos, y todas las propiedades que tenga la clase Venta pueden usarse como columnas.
Problema resuelto, y de una manera realmente sencilla.
Nota: Las variables privadas declaradas antes de cada propiedad (_producto, _cantidad, etc.) guardan el valor de la propiedad correspondiente, ya que ésta no puede almacenar un valor. Pero en C# 3.0 (el de Visual Studio 2008) y superiores, no es necesario tener declarada una variable privada que guarde el valor de la propiedad. Si no vamos a realizar funciones especiales en las propiedades, podemos declararlas «ocultando» el contenido de las secciones get y set. Es decir, podemos hacer esto:
public string producto{ get; set; }
Repito: Ésto es solamente para C# 3.0 en adelante. Para C# 2.0 sigue siendo necesario tener los valores de las propiedades en variables separadas, sean públicas o privadas.
Se agradece lo claro que lo has dejado