Mostrando entradas con la etiqueta Programacion General. Mostrar todas las entradas
Mostrando entradas con la etiqueta Programacion General. Mostrar todas las entradas

lunes, 8 de octubre de 2007

Operadores C#: as e is

Hace un tiempo me encontre en muchos trozos de codigo con expresiones en c# que contenian el operador as, operador que no conocia y por ende me vi en la obligacion de investigar su proposito.
Para poder explicar el operador as es recomendable primero conocer el operador is. Este es un operador binario que retorna un booleano y se utiliza de la siguiente manera:

bool retorno = objeto is Clase_X

Si el objeto no tiene el valor null y además es posible obtener este objeto como una instancia de la Clase_X (mediante polimorfismo) sin producirse una Excepcion, entonces el valor devuelto es true, en cualquier otro caso el retorno sera false.
Conociendo este operador se puede comprender de manera simple el operador as.
La forma de utilizar el operador as es la siguiente:

Clase_X MiClase = objeto as Clase_X;

Esta expresion es equivalente a lo siguiente:

Clase_X Miclase;
if( objeto is Clase_X ){
Miclase = (Clase_X)objeto;
} else {
MiClase = null;
}

Se entiende?, la idea principal es tener un operador que realiza cast, pero en caso de no ser posible el cast requerido devuelva el valor null y no lance una CastException como lo haria una expresion como la siguiente.

Clase_X Miclase = (Clase_X)objeto;

Espero sea de utilidad a más de alguien.

jueves, 4 de octubre de 2007

Almacenamiento Aislado en .NET

Esta clase permite definir la creación y utilización de archivos y directorios en entornos aislados.
Los entornos aislados son útiles cuando se necesita acceder a datos contenidos en archivos (por ejemplo configuraciones) y se quiere evitar que el assembly pueda ser explotado con fines maleficos (por ejemplo, acceder a otros recursos dentro del sistema de archivos).

Antes de utilizar almacenamiento aislado es necesario definir el alcance de dicho almacenamiento, es decir, quien y desde donde podrá acceder a los datos ahí almacenados. Los métodos de almacenamiento son:

Assembly/Machine: Corresponde a información del Assembly a nivel de máquina, por ejemplo, archivos de configuración que tendrá una aplicación comúnes para todos los usuarios de una máquina.
Asssembly/User: Datos del assembly a nivel de usuario, sólo cuando el usuario en cuestión ejecute el assembly dado se podrá acceder a los datos almacenados.
Domain/Machine: Similar a Assembly/Machine, pero a nivel de dominio de apicación (AppDomain).
Domain/User: Similar a Assembly/User, pero a nivel de dominio de apicación (AppDomain).

A continuación ejemplos de como crear almacenamientos aislados.

// nivel Assembly/Machine
IsolatedStorageFile machineStorage = IsolatedStorageFile.GetMachineStoreForAssembly();

// nivel Assembly/User
IsolatedStorageFile userStorage = IsolatedStorageFile.GetUserStoreForAssembly();

// nivel Domain/Machine
IsolatedStorageFile machineDomainStorage = IsolatedStorageFile.GetMachineStoreForDomain();

// nivel Domain/User
IsolatedStorageFile userDomainStorage = IsolatedStorageFile.GetUserStoreForDomain();

Con la clase IsolatedStorageFileStream es posible crear archivos en un almacenamiento aislado. IsolatedStorageFileStream deriva de la clase FileStream, por lo que su comportamiento es muy similar a cualquier Stream de datos.

A continuación, un ejemplo del uso de IsolatedStorageFileStream:

IsolatedStorageFile almacen = IsolatedStorageFile.GetUserStoreForAssembly();

IsolatedStorageFileStream configuracion = new IsolatedStorageFileStream("Configuracion.dat", FileMode.Create, almacen);

StreamWriter sw = new StreamWriter(configuracion)
sw.WriteLine("Nombre = francisco");
sw.Close();
configuracion.Close();

miércoles, 3 de octubre de 2007

String v/s StringBuilder

Un objeto de tipo String permite Almacenar una cadena de texto o cadena de caracteres. De la misma manera un objeto de tipo StringBuilder almacena una cadena de caracteres o texto.

Existe una gran diferencia entre ambas implementaciones: String es inmutable, mientras que StringBuilder permite mutaciones.

¿Qué significa realmente esto?
Bueno tal como lo dice el concepto, String es inmutable, por ende no puede cambiar. Esto significa que no es posible agregar contenido a un String ya definido.
¿Cómo dice?, ¿Entonces qué diablos hace el siguiente código?

string miString = "Hola";
miString = miString + " Mundo";

Bueno, la primera línea crea un objeto de tipo String inicializándolo en un valor de texto "Hola", luego, en la segunda línea, lo que efectivamente se realiza es:

  • Crear un nuevo objeto String, que tendrá como valor el valor del objeto miString concatenado con el valor " Mundo".

  • Asignar a miString este nuevo objeto creado.


En resumen, un String no es mutable y cada vez que se "modifica" su valor, realmente lo que se hace es crear un nuevo objeto String y asignarlo a la variable "modificada".

Esta acción puede traer serios problemas de eficiencia y seguridad, ya que eventualmente podría acarrear problemas de desborde de memoria (sobretodo en witios web) lo que implica una serie de riesgos en cuanto a seguridad.

En la otra esquina tenemos la clase StringBuilder, la que mencione es mutable y por ende, puede variar su contenido. Un objeto de tipo StringBuilder permite agregar, eliminar, sustituir e insertar datos sin crear una nueva instancia de la clase, lo que significa un ahorro e recursos comparado con un objeto String.

La manera de trabajo de StringBuilder es la siguiente:

  • maneja un buffer que permite agregar datos directamente si el dato agregado es menor al espacio libre en el buffer.

  • Si el dato es mayor que el buffer, entonces se solicita un nuevo buffer con tamaño mayor, se copian los datos actuales, y finalmente se agregan los nuevos datos.


Al comparar ambos tipos de datos, es posible identificar las siguientes características.

  • Si la cantidad y tamaño de datos a agregar a un string es constante y conocida, entonces es más eficiente utilizar un objeto de tipo String.

  • Si la cantidad y tamaño de datos a agregar a un string es variable y/o desconocida, entonces una intancia de StringBuilder presenta mayores beneficios que una instancia de String.

martes, 27 de febrero de 2007

La sentencia Using

La mayoría de los programas escritos en C# contienen al menos, aunque no es requisito, una sentencia using.

Sabemos que con esta sentencia utilizamos un namespace determinado y con esto acortamos notoriamente los nombres de las clases y tipos que utilizaremos en nuestro código.

La manera de utilizar la sentencia using para importar un namespace es la siguiente.

using MiNamespace1;
using MiNamespace2;

Con esto se importan todas las classes de los namespaces referenciados.

¿Que pasa si tanto MiNamespace1 como MiNamespace2 contienen una clase llamada MiClase?
Esto crearía un conflicto de nombres, ya que el compilador no sabría a qué clase nos referimos cuando utilizamos MiClase (si a MiNamespace1.MiClase o MiNamespace2.MiClase).
Para solucionar este conflicto es posible crear un alias para cada espacio de nombres importado. Podemos definir un alias para el using de la siguiente manera.

using Alias = MiNamespace1;


De esta manera ahora para referirnos a MiNamespace1.MiClase lo hacemos como Alias.MiClase (el ejemplo no es el mejor
para notar lo útil que puede ser esta sentencia, pero imaginate que tengas que utilizar namespaces como los siguientes).

using Alias1 = Empresa.Departamento.Proyecto.Modulo1;
using Alias2 = Empresa.Departamento.Proyecto.Modulo2;

Aquí sí que acorta notoriamente la codificación de los nombres de las clases.

*************************************

Pero si creias que la sentencia using se utiliza únicamente para importar namespaces estas muy equivocado.
Tambien tiene la función de definir bloques que utilizan un recurso determinado. Un recurso es una clase que implementa
la interfaz IDisposable, es decir, contiene un método para definir cuando el recurso ya no está siendo utilizado.

El Bloque using tiene como finalidad utilizar un recurso definido durante el alcance del bloque y
luego liberar el recurso llamando al método Dispose().

El siguiente es un ejemplo práctico de un bloque using.

using (Recurso r = new Recurso())
{
// utilización de recurso r.
}

Lo cual es equivalente a lo siguiente:

Recurso r = new Recurso(); // u otra asignacion.
try {
// utilización de recurso r.
}
finally
{

// Liberación del recurso -> r.Dispose();
r.Dispose();
}


Claro, existe una diferencia entre utilizar un bloque using y un bloque try/finally. En el primero el recurso
utilizado es sólo de lectura, mientras que es modificable en un bloque try/finally.

Es posible, también, definir varias instancias de un mismo recurso al inicializar un bloque using, de la siguiente manera:

using(Recurso r1=X, r2=Y, r3=Z){
...
}

Sentencia que es equivalente a:

using(Recurso r1=x ){
using(Recurso r2=Y){
using(Recurso r3=Z){
...
}
}
}

y a:

try
{
Recurso r1=X, r2=Y, r3=Z;
...
}
finally

{
r1.Dispose();
r2.Dispose();
r3.Dispose();
}

Aplicaciones para esta sentencia son, por ejemplo, conexiones a bases de datos, creacion de una lista de objetos, entre otras.

lunes, 26 de febrero de 2007

Code Snippets

La utilizacion de Code Snippets es una practica que disminuye notoriamente los tiempos de codificación de proyectos, sobre todo con muchas acciones repetitivas a lo largo del código.

El siguiente artículo presenta una manera sencilla de crear tus propios Code Snippets y añadirlos a Visual Studio 2005.

El artículo lo puedes encontrar aqui

sábado, 24 de febrero de 2007

Reflexión con C#

Reflexión es la capacidad de algunos lenguajes de acceder a su estructura mediante su metadata. Los lenguajes de .NEt Framework 2.0 proveen esta funcionalidad mediante el assembly System.Reflection.

Utilizando reflexión podemos consultar por los tipos contenidos en un assembly, sus miembros, propiedades y métodos, asi como sus permisos de acceso, entre otras características.

Este pequeño artículo muestra ejemplos de cómo utilizar reflexión con C#.

El artículo se encuentra aqui

martes, 13 de febrero de 2007

Tipos de datos Nullables.

Una de las novedades del .Net Framework 2.0 son los tipos de datos Nullables.

Este nuevo tipo de datos permite asignar valores nulos a tipos de datos por valor (ValueType), cosa que no era posible antes de la creación de este tipo de datos.

El siguiente artículo es una ayuda a la utilización de los tipos Nullables.

Lo pueden encontrar aqui

miércoles, 7 de febrero de 2007

Aquellos prodigios de la programacion.....

Muchas veces me he encontrado con gente que dice frases como:

"Programar es simple, yo aprendi en 1 mes pascal, C, Java, C++, PHP, C#, Visual Basic, etc". En fin, cualquier lenguaje de programacion sirve para aparentar frente a tus amigos que sabes programar y aprendiste en un periodo muy corto de tiempo.

Un dia viajando por el ciberespacio me encontre con un articulo del señor Peter Norvig (Director of Research at Google Inc) que habla justamente sobre este fenomeno, el aprender programacion en un par de dias, incluso horas!!!!

Espero les guste y a mas de algun especimen que se jacta de sus aptitudes programaticas los haga recapacitar un poco sobre la complejidad de la programación y de manejar un lenguaje específico.

El artículo lo pueden encontrar aqui

para los poco gringos en español aqui