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]

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]

La manera correcta de actualizar contadores de rendimiento personalizados

Esta es una pregunta interesante que ha surgido en el curso de fundamentos de la plataforma .NET que tutelo on-line en campusMVP. Se trata de una pregunta sencilla pero con una sutileza interesante respecto a la creación de contadores de rendimiento para Windows desde .NET. Cuando creamos un contador personalizado en .NET incrementamos o disminuimos su valor para actualizar la medición que queremos reflejar en el contador de rendimiento del sistema. Algunos ejemplos de contadores que podemos crear son: uno que indique el número de usuarios actualmente autenticados en nuestra aplicación Web, uno que indique el número de compras realizadas en una tienda on-line, el promedio de consultas lanzadas contra un almacén de datos, etc, etc... Tienen mucha utilidad ya que nos permiten monitorizar con las herramientas propias de Windows el desempeño de nuestras aplicaciones, tanto en tiempo real como haciendo trazas para un análisis posterior. El caso es que todos ellos implican generalmente e... [Más]

OrderedDictionary vs Dictionary

Hoy, en el curso de preparación del examen 70-536, ha surgido la siguiente duda: “¿OrderedDictionary sólo se diferencia respecto a Dictionary, en qué se puede tener acceso además de por clave también por índice, o existe alguna otra diferencia mayor?” La verdad es que OrderedDictionary es un mal nombre para los programadores de habla hispana, porque hay la tendencia a pensar que ordena los elementos, cuando en realidad se refiere a que los guarda por el orden en que se han introducido con el método Add.  Un diccionario que ordene sus elementos es un SortedDictionary de tipo genérico. Así, si escribimos un código similar a este:using System; using System.Collections; using System.Collections.Specialized; public class Prueba { public static void Main() { OrderedDictionary od = new OrderedDictionary(); od.Add("05", "Cinco"); od.Add("02", "Dos"); od.Add("03", "Tres"); od.Add("04", "Cuatro"); od.Add("01", "Uno"); Console.WriteLine("Iterar como... [Más]

Usando foreach con un diccionario genérico

Lo habitual cuando tenemos una colección o un enumerable de cualquier tipo es recorrer sus elementos usando un bucle de tipo foreach. Sin embargo, cuando usamos una colección genérica de tipo System.Collections.Generic.IDictionary, como por ejemplo Dictionary<TKey,TValue> o SortedList<TKey,TValue>, (que son super-útiles en muchos casos) nos encontraremos con dificultades. Si intentamos hacer algo como esto:Dictionary dict = new Dictionary(); dict.Add("Uno", 1); dict.Add("Dos", 2); dict.Add("Tres", 3); foreach(int numero in dict) { Console.WriteLine(numero); } Descubriremos que obtenemos un error como este otro: Cannot convert type 'System.Collections.Generic.KeyValuePair<string,int>' to 'int' En el ejemplo anterior definimos un diccionario genérico que va a llevar laves de tipo texto y que usaremos para almacenar números enteros. El problema es que esta no es la forma correcta de iterar por colecciones genéricas que tengan pares de clave/valor. L... [Más]

"Serializar" objetos comprimiéndolos antes para ahorrar espacio y los problemas que podremos tener

Esta pregunta surgió el otro día en uno de mis cursos on-line de campusMVP y la verdad es que es bastante interesante, no tanto porque sea especialmente difícil de hacer, si no por las implicaciones que tiene su aplicación en la práctica. La idea está muy bien: dado que estoy almacenando objetos de mi programa en disco (o enviándolos a través de la red), si los comprimo debería ahorrar espacio en disco y/o ancho de banda. De hecho, la idea es tan buena que en ASP.NET 4.0 una de las novedades es que el almacenamiento de sesión fuera de proceso (es decir, cuando guardamos la sesión en un servidor de estado remoto o en un SQL Server), tiene una nueva opción para permitir la compresión de los datos antes de enviarlos para su almacenamiento o recuperación de sesión. Esto es muy útil para sitios web que quieren acelerar la transferencia de información en una granja de servidores, pero tiene la contrapartida de que los procesadores estarán más cargados debido a las operacioens de compresión ... [Más]

Por qué debería importarte la programación paralela

De este tema ya había hablado en una ocasión en este blog (o más bien en su blog gemelo), y lo cierto es que levantó bastante polémica. Cuando hablo con alguna gente acerca de las novedades de Visual Studio 2010 y sale lo de las mejoras para la programación en paralelo, mucha gente lo ve como una mera anécdota, algo que no va con ellos en absoluto. Si bien es cierto que muchas aplicaciones que se hacen, como las de gestión por ejemplo, no suelen tener que sacarle partido, no es menos cierto que en muchas circunstancias nuestras aplicaciones deben poder sacarle el máximo rendimiento al hardware del que disponemos. Desde hace unos años lo más habitual en cualquier ordenador corriente es que disponga de un procesador con al menos dos núcleos. En servidores o máquinas destinadas a tareas más demandantes es muy frecuente que haya varios procesadores con al menos cuatro núcleos. La tendencia es que cada vez haya más núcleos en los procesadores, ya no sólo por rendimiento sino por las venta... [Más]

Cómo llamar a una página Web desde código

<DISCLAIMER>Han pasado unos cuantos días desde que he podido postear algo nuevo. Me ha pillado de lleno el famoso volcán islandés que ha paralizado el tráfico aéreo en Europa, por lo que he estado atrapado varios días en Bruselas sin posibilidad de salir de allí y, lo que es peor, ¡sin ordenador ni Internet! :-S </DISCLAIMER> Esta es una pregunta muy habitual que he visto por ahí y que realmente es muy sencilla de poner en marcha: "¿Cómo puedo llamar a una página Web (o recurso remoto HTTP) desde mi propio programa y mostrar el resultado en mi aplicación?" La respuesta es muy sencilla, pero no todo el mundo sabe cómo hacerlo. Básicamente hay que utilizar la clase WebRequest. Este método, por ejemplo, sirve para solicitar un determinado recurso a partir de su URL, que se le pasa como parámetro, devolviendo una cadena con el contenido del recurso (o generando una excepción si el recurso no existe o da un error): static string LeerRecursoWeb(string laUrl) { // C... [Más]