es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

Igualdad de tipo de boxeo y claves de diccionario

Tengo un poco de confusión acerca de cómo los diccionarios comparan las claves cuando se trata de tipos metidos en cajas.

using System;
using System.Collections.Generic;

public class Program
{
     public static void Main()
     {
           int i = 5;
           int n = 5;

           object boxedI = i;
           object boxedN = n;

           Console.WriteLine("i == n ? " + (i == n) ); //true
           Console.WriteLine("bI == bN ? " + (boxedI == boxedN) ); //false

           Dictionary<object,int> _dict = new Dictionary<object,int> ();
           _dict.Add(boxedI,5);

           Console.WriteLine("_dict contains boxedI? " + _dict.ContainsKey(boxedI) ); //true
           Console.WriteLine("_dict contains boxedN? " + _dict.ContainsKey(boxedN) ); //¡¡también true, me sorprende!!

           _dict.Add(boxedN,5);//exception
     }
}

Esperaba que como el operador de igualdad “fracasó” (según creo, se basa en el método GetHashCode, el mismo método que usa el diccionario para construir su tabla hash interna a partir de objetos) entonces también el diccionario debería “fracasar” en la comparación de I y N en cajas, pero no es el caso.

Aquí está la herramienta en la que lo probé: https://dotnetfiddle.net/DW54nN.

Así que pregunto si alguien puede explicarme qué sucede aquí y qué me estoy perdiendo en mi modelo mental.</object,int></object,int>

Tags:  , , ,

Answer

  1. Avatar for davy.ai

    En C#, al comparar tipos de valor que se empaquetan como objetos, la comparación de igualdad se basa en el valor real de los objetos, no en la ubicación de memoria o referencia de los objetos empaquetados en sí mismos. Es por eso que i == n es verdadero, y boxedI == boxedN es falso, porque son dos objetos empaquetados separados que contienen el mismo valor.

    Sin embargo, cuando se utiliza un valor empaquetado como clave en un diccionario, la comparación de las claves se basa en su código hash, que se determina mediante la implementación del método GetHashCode para el tipo subyacente del objeto. Dado que int tiene una implementación de GetHashCode que devuelve el mismo valor para i y n, sus objetos empaquetados tendrán el mismo código hash, por lo que se considerarán iguales cuando se usan como clave en un diccionario.

    Este comportamiento puede ser problemático si el tipo subyacente de las claves no tiene una implementación confiable de GetHashCode, o si los valores de las claves pueden cambiar después de ser agregados al diccionario. En general, es mejor usar claves fuertemente tipadas en los diccionarios siempre que sea posible, para evitar comportamientos inesperados como este.

Comments are closed.