JASoft.org

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

MENÚ - JASoft: JM Alarcón

La dificultad para entender las variables con referencias a objetos

Por lo que veo en las dudas de mis cursos y atendiendo consultas de la comunidad, a muchos programadores inexpertos les cuesta de entrada ver la diferencia entre paso por referencia y valor de parámetros de funciones, pero también la diferencia entre una variable, un valor y una referencia a un objeto. Esto suele pasar tanto en JavaScript como en otros lenguajes. Veamos un caso típico que genera dudas... Si consideramos este código:function modificaObjeto(obj2){ obj2.nombre = "Objeto"; obj2.valor = 5; } var obj = { nombre: "Pepe", valor: 0 }; modificaObjeto(obj); Lo que hacemos es pasar un objeto a la función, y a través del parámetro de ésta modificamos el objeto en si. Si ahora mostramos ese objeto en la consola veremos que se han modificado sus propiedades, como era de esperar, y que el nombre es "Objeto" y el valor es 5. Es decir, hemos modificado sus valores originales porque hemos cambiado el objeto en sí al que apunta la variable, pero no a donde apunt... [Más]

Propagación y herencia de permisos: la clase FileSystemAccessRule

La información que ofrece en ocasiones MSDN sobre la plataforma .NET se puede decir, eufemísticamente, que "no es todo lo buena que debiera ser". Un buen ejemplo de ello es la documentación de la clase FileSystemAccessRule y más en concreto lo que se refiere a los indicadores sobre propagación y herencia de permisos en el acceso al sistema de archivos. Consideremos este ejemplo. Necesitas controlar desde tu aplicación el acceso a un carpeta llamada "docs" de forma que te asegures de que el usuario "DOMINIO\Usuario" tendrá acceso de lectura a la carpeta y todas sus subcarpetas (y las hijas de éstas), pero sin embargo no tendrá acceso a ninguno de los archivos contenidos en éstas. Dejemos de lado la utilidad exacta de esto. Lo que quiero es mostrar lo retorcidas que han puesto las opciones correspondientes en la plataforma .NET :-S El código en C# que necesitaríamos incluir es este: 1: DirectorySecurity dirSec = Directory.GetAccessControl(@&quo... [Más]

Cómo procesar correctamente en .NET fechas de un AS/400

Esto es bastante básico, pero a los usuarios más noveles puede que le resulte complicado y precisamente llegué a ello a raíz de la pregunta de un alumno hace poco… El caso es que los sistemas AS/400 suelen devolver los campos de fecha en un formato similar a este: 20110422, que es tal y como esta almacenado en la base de datos tipo texto. Es decir, el formato es YYYMMDD. ¿Cómo las conviertes en fechas de pleno derecho en .NET? Si es un campo de texto y siempre tiene este mismo formato exactamente (es decir, cuatro cifras para el año, 2 para el mes y 2 para el día) es muy fácil convertirlo en una fecha usando el método ParseExact de la clase DateTime: DateTime.ParseExact("20110422", "yyyyMMdd", CultureInfo.InvariantCulture) Simplemente le indicas la fecha, el formato como segundo parámetro (en este caso cuatro cifras para el año, dos para el mes (ojo, el mes es una M mayúscula, la minúscula son minutos) y dos para el día del mes) y listo. También podrías ha... [Más]

Cómo detectar un cambio de sesión o que el usuario bloquea la sesión en Windows

En ocasiones resulta muy útil detectar desde tu aplicación Windows el hecho de que el usuario actual se esté conectando o desconectando a la sesión actual, o simplemente que se haya bloqueado el escritorio. Por ejemplo, si el usuario tiene el escritorio bloqueado es una tontería mostrarle mensajes o globos de notificación ya que no va a haber nadie para verlos ¿no? ¿Cómo podemos detectar estas circunstancias? La API de .NET dispone de un espacio de nombres especial llamado Microsoft.Win32 que contiene clases que encapsulan funcionalidad atada al sistema operativo Windows. Dentro de este espacio de nombres existe una clase llamada SystemEvents que ofrece multitud de eventos estáticos que nos permiten responder a diversas cuestiones que ocurren en el sistema operativo: cambio de los ajustes de pantalla, agregar o quitar fuentes, que el equipo se está apagando o suspendiendo, cambios de preferencia de usuario, cambio de la hora del sistema, etc... Es realmente útil, y utiliza por debajo... [Más]

Mostrar fechas relativas estilo Facebook en nuestras aplicaciones

Este es un truco sencillo pero útil que puede ayudar a hacer más amigables las fechas de cara a los usuarios. Generalmente cuando mostramos una fecha y hora en una de nuestras aplicaciones tendemos a mostrar este dato de la forma habitual, es decir, visualizando la fecha y la hora en el formato que sea apropiado para el idioma y país actuales. Sin embargo para la mayoría de los usuarios esta información no les dice gran cosa y tienen que fijarse y hacer cálculos mentales para hacerse una idea de cuándo es exactamente ese evento, sea en el pasado o en el futuro. En este sentido sería mucho más útil mostrarle al usuario una fecha indicada de un modo más amigable, relativo al momento actual y de forma que resulte más informativa para el usuario medio. Así, en lugar de mostrarles simplemente la fecha, resultaría mucho más útil decirles cosas como "Hace 3 minutos", "Dentro de 2 días" o expresiones similares. Incluso podríamos mostrarle ambas cosas, por ejemplo expresi... [Más]

Direcciones MAC y cómo obtener información detallada sobre tarjetas de red con .NET.

Aparecido con la versión 2.0 de la plataforma, allá por 2005, el espacio de nombres System.Net.NetworkInformation resulta de gran utilidad a la hora de crear aplicaciones de diagnóstico de red basadas en la plataforma .NET. Gracias a las clases contenidas en éste podemos obtener información de todo tipo acerca de nuestros dispositivos de comunicaciones (tarjetas de red y otros adaptadores) de forma que resultaría fácil clonar algunas herramientas de diagnóstico del sistema operativo para adaptarlas a nuestras necesidades. En su día, ya hace muchos años, comenté lo fácil que era construir un clon de "ping.exe" para determinar el estado de un servidor remoto (si responde o no). También es sencillo responder a cambios en la conectividad con los eventos de la clase NetworkChange, como también expliqué en su momento, lo cual nos permite detectar cambios en la dirección IP o que se pierda la conexión a Internet por ejemplo. Direcciones MAC Ayer, para un experimento, estuve constr... [Más]

¿Qué es un deadlock o interbloqueo?

Cuando se trabaja en programación paralela o multisubproceso, una palabra que sale a colación cada dos por tres es "deadlock" (o un "interbloqueo" en castellano). Muchos porgramadores principiantes tienen dudas sobre qué son y cómo se pueden producir, por lo que, a raíz de la pregunta de un alumno de mi curso de fundamentos de C# y .NET, me he decidido a escribir algo que lo explique de manera simple pero efectiva. Un deadlock, es una situación difícil de reproducir, y se dará sólo en algunas circunstancias muy concretas, por eso son situaciones muy difíciles de prever y de depurar. Un ejemplo clásico de interbloqueo es el de una cuenta bancaria. Consideremos el caso de una clase para transferir dinero entre cuentas bancarias, algo así: class Cuenta { double saldo; void Retirar(double cantidad) { saldo -= cantidad; } void Ingresar(double cantidad) { saldo += cantidad; } void Transferir(Cuenta cuentaOr... [Más]

Diferencias entre conversiones de tipos explícitas y mediante la clase Convert

¿Qué diferencia existe en C# entre hacer una conversión implícita y usar un método de la clase Convert?  En realidad lo que hacen por debajo la mayor parte de las veces los métodos de Convert es llamar a conversiones implícitas. Es fácil comprobarlo viendo el código fuente de la plataforma con, por ejemplo, Reflector. Sin embargo sí puede haber diferencias cuando se hacen conversiones entre tipos que pueden llevar a pérdida de información. Por ejemplo convertir desde un Int32 a un Int16, donde es posible que se pueda perder información ya que un Int32 puede contener números mayores que un Int16. En estos casos sí que podría haber diferencias ya que las conversiones explícitas y los métodos de conversión se comportan de forma ligeramente distinta puesto que los últimos introducen alguna lógica para avisarte de que se producen excepciones. Por ejemplo, si usas este código:double d = 123456.76; long l = (long)d; long l2 = Convert.ToInt32(d); La variable "l" contendrá el número... [Más]

Normas para la creación de Excepciones propias en .NET

Cuando el código de nuestro programa produce un error o una situación no esperada que se traduce en un fallo se produce una excepción. Aprende .NET, Cursos on-line tutelados:    · Visual Studio 2010 desde cero   · Fundamentos de la plataforma .NET 3.5 y Visual Studio 2005/2008   · Preparación examen 70–536: Fundamentos de desarrollo con la plataforma .NET (tutelado por mi)   · Preparación del examen 70-505: .NET Framework 3.5, Windows Forms Application Development   · Gestión de proyectos de software con Team System y Team Foundation Server .NET Framework ofrece gestión estructurada de excepciones, es decir, que podemos gestionar las excepciones de manera jerárquica en nuestro código, capturándolas en la rutina que las produce o en cualquier otro punto de la pila de llamadas de ésta (es decir, las excepciones "convergen" hacia los niveles superiores de la pila). La estructura Try-Catch-Finally (VB) o try-catch-finally (C#) nos ... [Más]