Variables por referencia

Ayer mientras publicaba un ejemplo sobre variables por referencia y comparación de objetos -como respuesta a una pregunta hecha en un foro, me surgió el siguiente problema:

csharp:
using System;

class Program
{
    static void Main(string[] args)
    {
        object a = new object();
        object b = a; // [1]

        a = "test"; // [2]

        Console.WriteLine(a == b);
    }
}

Por algún motivo la expresión a == b evalúa a falso, aún cuando se sabe que en [1] a y b deberían tener la misma referencia para el objeto creado en el paso anterior. En [2] asigno un string para evitar problemas con el boxing/unboxing entre variables por referencia y por valor, he probado asignando otros objetos también pero sin ningún efecto sobre el resultado final.

Lo curioso de esto es que si se comenta [2], esta vez la expresión evalúa a verdadero, resultado que confirma que a y b tienen la misma referencia -cabe recordar que tanto el operador = como el método Equals sólo comparan referencias.

No sé si esto es un bug o feature, en todo caso, estaré muy agradecido si alguien me ahorra tiempo de búsqueda para absolver esta pequeña duda.

Nota: sé que es difícil que el código mostrado pueda aparecer en una determinada aplicación.

The Quality Code Handbook

Este es un pequeño ebook, distribuido al parecer de manera gratuita incluye los siguientes temas:

  • Desarrollo orientado a pruebas, hace una breve y básica introducción al Desarrollo Orientado a Pruebas, para el ejemplo hace uso del entorno de pruebas de Visual Studio Team System -hubiera sido mejor con algún xUnit pero bueno...
  • Como mejorar el rendimiento de aplicaciones administradas, nuevamente hace referencia a una herramienta (profiler) de Team System, para detectar cuellos de botella en nuestras aplicaciones.
  • Herramientas de análisis de código para desarrolladores de aplicaciones nativas, en realidad no he leído este capítulo puesto que no uso C++ 😀
  • Modelado de amenazas: este apartado es un pequeño manual de uso de la aplicación Threat Analysis and Modeling Tool, que permite modelar las amenazas desde el diseño de la aplicación -gran parte de las funcionalidades de esta herramienta están basadas en el libro Writing Secure Code
  • Análisis de código con FxCop, FxCop es una herramienta que permite analizar ensamblados para determinar si el código sigue las buenas prácticas definidas para el BCL.
  • Pruebas de stress para aplicaciones web, comenta la importancia de este tipo de pruebas en aplicaciones Web
  • Personalización de check-ins en Visual Studio Team System, tampoco he leído este capítulo puesto que subversion cubre todas nuestras necesidades en el trabajo :).

Como se habrán dado cuenta, en este ebook se pone énfasis en herramientas de Microsoft -en realidad no existe casi referencia a otras alternativas. Si desean descargarlo pueden hacerlo desde esta dirección, pero para poder visualizar el documento de este software.

Fuente: Blog de Dave Glover

mod_rewrite y el modificador L

Etienne Kneuss, en un breve pero bastante explicativo artículo comenta sobre: el modificador L (last rule), el funcionamiento interno de mod_rewrite y donde no debería ser usado este modificador cuando las reglas se definen desde el archivo .htaccess.

Es una referencia útil para los que deseen conocer un poquito más sobre el funcionamiento de mod_rewrite, en especial para los que teníamos algunos conceptos errados.

Versión final de ASP.NET AJAX

Hoy liberaron la versión final de ASP.NET AJAX, entre los cambios que trae esta versión, están:

  • Mejora de rendimiento y escalabilidad para hostings compartidos.
  • Corrección de ScriptManager y ScriptResource para el soporte de fechas en diferentes culturas
  • Posibilidad de habilitar/deshabilitar la compresión de javascript a través de ScriptResource
  • Correcciones de otros bugs

Pueden descargar esta versión desde el sitio oficial, adicionalmente también está disponible una nueva versión de ASP.NET AJAX Control Toolkit

Ejercicio de la Semana: Visualización de perfiles

Continuando con la serie, pongo otro script para que se diviertan.

php:
<?php
include_once './config.php';

if ( empty($_REQUEST['id']) && empty($_REQUEST['nick']) ) {
    die('No user selected');
}

if ( isset($_REQUEST['nick']) ) {
    if ( preg_match('/^[a-z0-9]{3,20}$/i', $_REQUEST['nick']) ) {
        $where = "WHERE nick='" . $bcdb->escape($_REQUEST['nick']) . "'";
    }
    else {
        die('Invalid nick: ' . $_REQUEST['nick']);
    }   
}
elseif ( !preg_match('/\d+/i', $_REQUEST['id']) || ($id = $bcdb->escape($_REQUEST['id'])) < 0 ) {
    die('Invalid user id: ' . $id);
}
else {
    $where = "WHERE id='$id'";
}

if ( ! ($user = $bcdb->get_row("SELECT * FROM users $where")) ) {
    die("User does not exists");
}

header('Content-type: text/html; charset=utf-8');
?>
<html>
<head>
    <title>Profile: <?php echo $user->name; ?></title>
</head>

<body>

<dl>

    <dt>Nombre</dt>
    <dd><?php echo $user->name; ?></dd>

    <dt>Email</dt>
    <dd><?php echo $user->email; ?></dd>
   
    <dt>Página Web</dt>
    <dd><a href="<?php echo $user->url; ?>"><?php echo $user->url; ?></a></dd>
</dl>

</body>

</html>

¿Existe algún problema con el código mostrado? Si es así, ¿cuál o cuáles?

Nota: A sugerencia de Agustí, he puesto una página de prueba. Si desean ver el código fuente de los ficheros php, aumenten una s al nombre. Ej http://test.buayacorp.com/quiz/user.phps

Actualización: Cambios realizados

  • Comillas simples agregadas alrededor de la variable id