JASoft.org

El blog de José Manuel Alarcón Aguín. Programación web y mucho más...

MENÚ - JASoft: JM Alarcón

Iteradores en C# 2.0

Pensemos por un momento cómo podemos construir en C# 1.0 o 1.1, una clase contenedora de datos que se pueda utilizar con la construcción foreach para iterar por los elementos que contiene... Para empezar la clase debe implementar la interface IEnumerable. Esto tampoco supone mucho trabajo ya que, al fin y al cabo, sólo se debe implementar un método, GetEnumerator(). Ahí se empieza complicar la cosa un poco ya que este método devolverá un objeto que implementa la interfaz IEnumerator y que nosotros debemos definir también. La implementación de esta clase es algo más compleja y además debe mantener una referencia al objeto enumerable original. Ya de por sí, como podemos comprobar, se trata de algo bastante tedioso. Pero es que además de eso en algunos casos es algo muy complicado de hacer. Por ejemplo, si queremos implementar una clase enumerable que contenga los nodos de una jerarquía (un árbol de carpetas, por ejemplo) y que, enumerándolo con foreach, nos devuelva por el orden correc... [Más]

El próximo día 2 (jueves) imparto formación gratuita

Dentro de la iniciativa Desarrolla con MSDN de Microsoft Ibérica, el próximo día 2 de diciembre de 2004, jueves, en Santiago de Compostela, impartiré formación sobre desarrollo de aplicaciones Web con ASP.NET. El curso es gratuito. Durará toda la mañana y nos hará falta el tiempo, así que por favor sed puntuales (9:00 en punto) los que os apunteis ;-) En esta sesión exploraremos el entorno de desarrollo de ASP.NET y los conceptos más importantes para construir aplicaciones web escalables y robustas. Los conceptos aprendidos nos permitirán desarrollar el frontal web principal y el cliente móvil de la aplicación de ejemplo MSDN Video. La agenda aproximada es la siguiente: Modelo de ASP.NET e IIS Web Forms Controles de usuario Mobile Web Controls Sesión y caché Configuración e instalación Seguridad Para anotarse sólo hay que hacerlo a través de este enlace, usando el icono que hay en el lateral. En él encontrareis más información, la ubicación exacta y un plano de cómo... [Más]

Cualificadores globales para espacios de nombres en C# 2.0

Cuando hacemos referencia a una clase o un tipo desde nuestro código podemos emplear una ruta completa de espacios de nombres para llegar hasta él. Por ejemplo, si escribimos System.Console.ReadLine(); se busca la clase Console dentro del espacio de nombres System que está en la raíz de todos los espacios de nombres (es decir, System se encuentra en la parte más alta de la jerarquía de espacios nombres junto a otros como Cryptography, etc... y los que nosotros mismos definamos o agreguemos a un proyecto). ¿Qué pasa sin embargo si escribimos esa misma línea dentro de una clase que está contenida dentro de un espacio de nombres llamado también System?, por ejemplo: namespace MiEmpresa.MiBiblioteca{    namespace System    {        class MiClase        {            System.Console.ReadLine();        }    }} El resultado será que la búsqueda de la clase Console comienza en el espacio de nombres actual y sólo cuando se recorra y no aparezca (porque pudiera aparecer si la hemos definido n... [Más]

Tipos genéricos en .NET 2.0

Una de las grandes novedades de la versión 2.0 de la plataforma .NET son sin duda los tipos genéricos. Esta nueva característica de los lenguajes Visual Basic .NET y C# y sus correspondientes compiladores, permite escribir código genérico que, a la hora de compilarse se transforma en código específico para un tipo de datos. Ello permite crear código de métodos, estructuras, clases e incluso interfaces sin preocuparnos por los tipos de datos que vamos a utilizar a la hora de la verdad. Hasta la fecha cuando queríamos escribir código genérico que pudiese trabajar indistintamente con dos o más tipos de datos no nos quedaba más remedio que utilizar el tipo 'object' que es la raíz de todas las clases. Con los nuevos Generics de .NET 2.0 ya no es necesario, y nuestro código puede disfrutar de la robustez de tipos concretos sin tener que comprometerse por adelantado con ninguno. ... [Más]

Métodos anónimos en C# 2.0

Siguiendo la estela marcada ayer, los próximos días me dedicaré, sin prisa pero sin pausa, a comentar algunas novedades interesantes que trae la plataforma .NET 2.0, C# 2.0 y Visual Studio .NET 2005. Hoy le toca el turno a los métodos anónimos. Éstos están pensados para simplificar la definición de manejadores de eventos cuando las tareas a realizar son simples. Imaginemos que queremos asociar una única línea de código (o dos) como acción a realizar cuando se produzca un evento. Por ejemplo, que cuando se pulse un botón se muestre un mensaje de saludo. Lo que debíamos hacer hasta ahora era declarar una función del tipo adecuado y asociarla con un nuevo delegado al evento. Por ejemplo: private void button1_Click(object sender, System.EventArgs e){    MessageBox.Show("Hola");} button1.Click += new System.EventHandler(button1_Click); Esto hace que al pulsar el botón se vea el saludo "Hola". Sin embargo es un poco engorroso para tan poca acción tener que crear una función como es... [Más]

Visual Studio 2005 reemplaza "Code-Behind" por "Code-Beside" en ASP.NET

Cuando creamos una página ASP.NET con Visual Studio 1.x lo que obtenemos es un archivo '.aspx' con el HTML y etiquetas básicas de servidor para enlazar datos y para directivas de páginas, y por otro lado un archivo '.cs' o '.vb' que contiene una clase que implementa el código de la página en cuestión. A este modelo de programación se le conoce como "Code-Behind" que se podría traducir como "Código por detrás". El símil es bastante bueno ya que un usuario llama a la página ASPX pero en realidad se ejecuta por detrás y de forma transparente el código de la clase "Code-Behind". En la clase code-behind, además, se incluyen las declaraciones de los distintos controles de la página y se asignan también los manejadores de sus eventos entre otras cosas. De hecho la página final hereda de la clase code-behind, que en última instancia hereda de la clase Page. En ASP.NET 2.0 y Visual Studio 2005 esto ha cambiado. Ahora el término nuevo a conocer es "Code-Beside" que podría traducirse como "códig... [Más]

Actualización de TabletPC a Service Pack 2

Ayer intenté actualizar mi nuevo TabletPC con el Service Pack 2 de Windows XP. Dificil misión. Como es sabido, Microsoft iba a sacar al mercado como producto independiente una nueva versión del sistema operativo Windows XP para TabletPC. Al final decidieron fusionarlo con el SP2 para Windows XP. Por lo tanto si instalamos el SP2, aparte de aumentar mucho la seguridad del sistema, si tenemos un TabletPC obtendremos también la nueva versión del sistema operativo: TabletPC 2005. Entre las mejoras de la versión 2005 están un panel de entrada de datos muy mejorado respecto al anterior, mejor y más potente integración con Office, mejoras en la conversión de escritura a texto, más capacidades para desarrollo de aplicaciones, etc... Puedes ver la lista completa aquí. El caso es que al intentar instalar el SP2 en castellano sobre mi TabletPC en castellano no había manera: el instalador porfiaba en decir que los idiomas del SP2 y el sistema no coincidían. Nada que hacer. Llamé al soporte té... [Más]

Ejecución de subprocesos en segundo plano: advertencias.

Cuando lanzamos un nuevo hilo de ejecución en una aplicación, éste puede ejecutarse en segundo plano o no. Depende del valor que tenga la propiedad IsBackground del objeto Thread asociado. Los subprocesos en segundo plano son idénticos a los subprocesos en primer plano, pero los subprocesos en segundo plano no impiden que un proceso finalice. Es decir, un proceso en primer plano permanece "asociado" al proceso que lo lanzó y no permite que éste termine hasta que él mismo a su vez haya terminado su ejecución. Por el contrario, cuando hay procesos en segundo plano (IsBackground = true) y terminan todos los procesos en primer plano que pertenecen a un determinado proceso, la CLR finaliza el proceso llamando al método Abort de todos los subprocesos en segundo plano que todavía se estén ejecutando. En resumen: si tenemos un proceso en segundo plano debemos asegurarnos de que termina antes de que lo haga el proceso principal que lo lanzó o se suspenderá automáticamente y no terminará su tr... [Más]

Cómo conectar y desconectar automáticamente un Módem

El otro día ayudando a una persona surgió la necesidad de que una aplicación se conectara y se desconectara de Internet automáticamente utilizando un módem estándar, a través de la línea telefónica. La aplicación estaba escrita en Visual Basic 6 (nada de .NET). Tras darle vueltas un rato llegué a esta solución que pasa por usar la API de Windows para conseguirlo: ' Declaraciones de la APIPrivate Declare Function InternetAutodial Lib "wininet.dll" _(ByVal dwFlags As Long, ByVal dwReserved As Long) As LongPrivate Declare Function InternetAutodialHangup Lib "wininet.dll" _(ByVal dwReserved As Long) As Long Private Const INTERNET_AUTODIAL_FORCE_ONLINE = 1Private Const INTERNET_AUTODIAL_FORCE_UNATTENDED = 2 Con ellas, para conectarse a Internet de forma automática con un módem, sin intervención del usuario, sólo hay que escribir: InternetAutodial INTERNET_AUTODIAL_FORCE_UNATTENDED, 0 Para desconectarse al terminar de hacer lo que necesitamos en la Red sólo hay que escribir: Inte... [Más]

ASP.NET - Uso de funciones externas desde código de enlazado a datos

En ocasiones hay que realizar transformaciones más o menos complejas con los datos de un origen de datos antes de enlazarlos a un control. Lo mejor en estos casos es crear un método que devuelva una cadena como resultado, en una clase accesible desde la página que haga las operaciones. Luego se lo puede llamar desde el código de enlazado (<%# %>) para no hacerlo innecesariamente largo o complejo. Sin embargo y en contra de lo que pudiera parecer, no llega con que la clase con las utilidades se encuentre dentro del mismo espacio de nombres que el resto de la aplicación, puesto que el código de enlazado a datos se ejecuta dentro de su propio espacio de nombres, específico para la página actual. Para asegurarnos de que al enlazar los datos se ecuentran esas funciones auxiliares podemos hacer tres cosas: 1.- Si la función de transformación estamos seguros de que sólo la vamos a usar desde la página actual bastará con incluirla dentro del archivo de código "CodeBehind" para poder ... [Más]