El chat de C # método equals () y GetHashCode ()

El chat de C # método equals () y GetHashCode ()

https://www.cnblogs.com/xiaochen-vip8/p/5506478.html

El chat de C # método equals () y GetHashCode ()

Crear un blog de un año, la primera vez en el blog de escritura, hay algo mal también pidió a las exposiciones.

Contenido de la escritura sobre esto puede decirse que es una larga conversación quiere saber, Baidu buscar en un montón. auto desvío gran Dios.

Recientes mirando de Jeffrey Richter CLR a través de C #, viendo método GetHashCode () cuando hay un lugar no entender sobre todo, es volver a escribir los Iguales () método cuando ¿por qué método GetHashCode () para una reescritura (tampoco reescribir no importa, pero Microsoft enviará un aviso). Necesidad de poner Iguales () y el método GetHashCode () la comprensión en profundidad de este tema antes de la interpretación.

 

En primer lugar hablar de los Iguales () Este método:

método equals () del objeto, es la forma en que siempre hay que ser reescrito. La implementación por defecto de este método es probablemente la siguiente:

Copiar el código

bool pública virtual es igual a (objeto obj) 

{ 

  si (obj == null) return false; 

  si (GetType () = obj.GetType ()!) falso retorno; 

  Return true; 

}

Copiar el código

 

Se puede ver, de hecho, la implementación predeterminada de la dirección de memoria se comparan dos objetos (== comparación de direcciones de memoria operadores por defecto). A excepción de los tipos de valor y tipos de cadenas, ya que todos los tipos de valor heredan de System.ValueType () (System.ValueType () también se hereda del objeto, pero System.ValueType () en sí mismo es un tipo de referencia), y System.ValueType () de Iguales () y el operador == reescrito, es la comparación byte a byte. La cadena es un tipo especial de tipo de referencia, por lo que para cuerdas en muchos lugares son especialmente tratados aquí no llegar al fondo.

Ps: comunicado de prensa de Jeffrey Richter, el valor del tipo de Iguales (uso), ya que iguala a () utiliza la reflexión, al comparar afecta la eficiencia.

Tener equals () y después de charlar GetHashCode ().

De hecho, GetHashCode () cuando el valor del tipo de operación se está System.ValueType () reescrito. Después de varios ensayos de tipo valor común es que el propietario, (especialmente número entero, Int32 excluido), autenticidad y tipos de valor GetHashCode () Valor de salida básicamente originales. Los resultados son como sigue:

Tener un tipo de valor, hablar de los tipos de referencia, vistazo a los resultados de esta operación lo siguiente:

Los resultados se pueden ver en la figura, aunque la cadena es un tipo de referencia, pero siempre y cuando el valor devuelto HashCode es el mismo, dependiendo de su especificidad. Y escribimos el mismo tipo de valor devuelto HashCode Coordenadas pero no el mismo, simplemente se puede entender como diferentes COOR1 y dirección de memoria COOR2, por lo que el CLR piensan que no son lo mismo.

PS: En el curso de la vida del programa, los mismos objetos, las variables volvió HashCode es el mismo, y es único. Pero absolutamente no se les permite hacer un almacenamiento persistente, una vez que el programa terminó y se reinicia, el mismo objeto no se puede obtener HashCode la última vez que se ejecuta el programa.

Aprender dos métodos, comenzó a centrarse en el tema de hoy.

De hecho, los dos objetivos anteriores (COOR1, COOR2), coor1.Equals (COOR2) devuelve un valor de falso (debido a las diferentes direcciones de memoria), si queremos que vuelvan a verdad, entonces, sólo se puede anular el método equals (ver más abajo).

Enfoque aquí, posteriormente re-escrito iguales, vs advirtió, aunque el programa ha sido siempre simios caso omiso de la advertencia, pero la advertencia hace necesario mirar a, mirar a las tres secciones siguientes del código.

Un segmento de código, di:

 

sección de código de tres:

Después de leer estas tres secciones del código, usted debe entender por qué es necesario para anular GetHashCode cuando se quiere volver a escribir la Igualdad.

Por supuesto, si usted no tiene la intención de utilizar el diccionario o HashTable en el código no les importa a escribir, no escriba, en otras palabras, si el tipo de referencia como el diccionario o poner la llave HashTable, debe volver a escribir estos dos métodos.

La razón: Cuando hacemos referencia tipo (a excepción de cadena) como el diccionario o HashTable la llave, nunca puede ser capaz de obtener el valor de valor de acuerdo con llave, o dos tipos de HashCode nunca será la misma. Tome diccionario, aunque cuando almacenamos pares de valores clave, pero la tecla CLR primera vuelta a HashCode y verificación antes de la toma es igual de almacenamiento, sino también para convertir en base al valor de la clave cuando el HashCode llave y luego verificar Iguales valor, debe prestar atención para verificar el tiempo de relación y HashCode iguales son y (&&) relación. En otras palabras, siempre que no se no se reemplaza un método GetHashCode y Equlas, al verificar que el método no anula el valor predeterminado llama a la implementación de la clase base, pero la implementación predeterminada de estos dos métodos son juzgados de acuerdo con la dirección de memoria, que es, de hecho, el valor de retorno de un método siempre será falsa. Como resultado, cuando se puede almacenar existencia díscolo, cuando el valor es que usted no puede encontrar su madre llorando.

Bueno, lo dicho tanto estos dos métodos que debe tener una re-comprensión de la misma. Si todavía no entiende, a continuación, utilizar el código para lograrlo, garantizo entender.

Por favor indique la fuente: http://www.cnblogs.com/xiaochen-vip8/articles/5506478.html 

 

 

 

 

 

 

 

Publicado 80 artículos originales · ganado elogios 38 · Vistas a 40000 +

Supongo que te gusta

Origin blog.csdn.net/kuangben2000/article/details/104778459
Recomendado
Clasificación