Enumeraciones vacías

Generalmente para saber si una enumeración está vacía lo que hacíamos era preguntar por la cantidad de elementos, si tenía 0 elementos estaba vacía, de lo contrario no :). Lo que hacíamos era más o menos lo siguiente:

List lista = new List();

if (lista.Count > 0)
{
    // Lista con elementos.
}
else
{ 
    // Lista sin elementos.
}

Uno de los primeros problemas que encontramos al realizar esta práctica es que, dependiendo el tipo de colección que usemos, disponemos distintos atributos para consultar por la cantidad de elementos, por ejemplo si usamos listas disponemos de la propiedad Count, en cambio si usamos un array tenemos que utilizar la propiedad Lenght.

List lista = new List();
int c1 = lista.Count; //Cantidad de elementos 0

string[] arreglo = new string[] { "elemento 1", "elemento 2" };
int c2 = arreglo.Length; //Cantidad de elementos 2

Otro de los problemas es que mucha de las veces nos encontramos con datos del tipo IEnumerable y que desconocemos la implementación real de los mismos, por lo tanto no tenemos acceso ninguna propiedad para obtener la cantidad de elementos.
Un error de la utilización de métodos cómo Count para determinar si un arreglo está vacío es que internamente estamos recorriendo de forma completa la colección para devolvemos la cantidad de elementos… todo este esfuerzo inútilmente, ya que con saber que tiene al menos un elemento podemos determinar si se encuentra vacía o no.

Por suerte tenemos a disposición el método Any para identificar si una lista está o no vacía, devolviéndonos un valor booleano (lo que es más coherente), también internamente es mucho más eficiente que los métodos anteriores, ya que recorrerá la colección y al encontrar el primer elemento devolverá true, sin tener que ir hasta el final de toda la colección.

bool listaConElementos = lista.Any(); // false
bool arregloConElementos = arreglo.Any(); // true

Más info en el post de Chris Eargle y en el de J. M. Aguilar.

Tips en el uso de métodos de extensión

En el blog de Richar Dingwall encontré un buen tips para los métodos de extensión.

Lo que él dice es que generalmente los métodos de extensión que creamos no son usados porque simplemente no son descubiertos por el resto de los desarrolladores.

Cómo corregir este problema entonces? La idea es muy simple y efectiva 😀 … simplemente abandonar la estructura de namespace de la solución en que trabajamos y directamente utilizar el namespace de la clase que deseamos extender, de esta forma aparecerá el IntelliSense cuando estemos invocando a esa clase que extendemos.

Por ejemplo, utilizando la siguiente forma se dificulta saber que existen extensiones de la clase Linq:

namespace YourCompany.Common.Extensions
{
public static class clase LinqExtensions (... )
}

Pero de esta forma sí le será fácil al equipo de desarrollo descubrir que existen extensiones de la clase Linq, gracias a que aparecerán en el IntelliSense:

namespace System.Linq
{
public static class LinqExtensions (... )
}

Modificador readonly

Los modificadores readonly es una forma de definir constantes en C#. A diferencia de las constantes que definimos con el modificador const, estas se tratan en tiempo de compilación, mientras que valores de los campos readonly se especifican en tiempo de ejecución. Por lo tanto podemos asignar una valor a los campos definidos como readonly ya sea cuando lo declaramos o en el constructor de la clase.

Una vez asignado su valor, ya sea en su declaración o en el constructor, su valor es constante y no se puede variar en esa instancia. Esto me permite definir mis propias constantes una vez ejecutado el programa (a diferencia de las constantes que deben estar declaradas previamente).

modifcador readonly y const

modifcador readonly y const

En rojo marqué los errores, ya que se está tratando de asignar un valor en un ámbito incorrecto.