2012-03-28 11 views
7

En un programa .NET que está escrito para seguir el estilo declarativo, ¿cuáles son algunos usos legítimos para ReferenceEquals()?Usos legítimos de ReferenceEquals()

+2

Un uso legítimo es cuando desea responder la pregunta "¿estas dos referencias se refieren al mismo objeto"? – phoog

+1

¿Qué quiere decir exactamente con estilo declarativo y cómo se relaciona eso con la igualdad referencial? – CodesInChaos

+0

¿Puede proporcionar un ejemplo del código en el que considere que los ReferenceEquals se utilizarán sin justificación? Si es así, podemos sugerir algunos argumentos a favor de su posición. – phoog

Respuesta

12

No estoy seguro de lo que quiere decir con "escrito para seguir el estilo declarativo", pero ReferenceEquals se usa generalmente al anular el operador ==. De http://msdn.microsoft.com/en-us/library/ms173147.aspx:

public static bool operator ==(ThreeDPoint a, ThreeDPoint b) 
{ 
    // If both are null, or both are same instance, return true. 
    if (System.Object.ReferenceEquals(a, b)) 
    { 
     return true; 
    } 

    // If one is null, but not both, return false. 
    if (((object)a == null) || ((object)b == null)) 
    { 
     return false; 
    } 

    // Return true if the fields match: 
    return a.x == b.x && a.y == b.y && a.z == b.z; 
} 

Es importante ver la Nota a continuación para la justificación:

Nota: Un error común en las sobrecargas de operador == es el uso de (a == b), (a == nulo), o (b == nulo) para verificar la igualdad de referencia. Este en su lugar crea una llamada al operador sobrecargado ==, causando un bucle infinito . Use ReferenceEquals o invoque el tipo a Object, a evite el bucle.

+1

@GregC El control es necesario aquí, de lo contrario el escenario 'null == null' se romperá. También tenga en cuenta que los controles' null' usan igualdad referencial. Simplemente usan cast-to-object en lugar de 'ReferenceEquals'. ('ReferenceEquals (a, b)' es equivalente a '(object) a == (object) b') – CodesInChaos

+0

@GregC No se garantiza que sea el mismo, pero por el contexto parece que debería ser el mismo. actuaría de manera diferente, probablemente sería debido a un error en la porción de igualdad profunda. – Servy

+0

Si el cheque para ReferenceEquals no estaba allí y tanto a como b eran nulos, esto devolvería false. Como lo es, devuelve true. –

1

Bueno, si el diseño y/o uso de los objetos relacionados es tal que nunca hay más de una instancia de un objeto que sea "igual" a cualquier otro, entonces será correcto, y es probable ser más rápido que comparar algunas variables de instancia.

O, como se publicó en otra respuesta, puede verificarlo primero como una "salida fácil" y solo realizar una comprobación de igualdad profunda si son diferentes. Este uso es solo una mejora en el rendimiento.

11

En un programa .NET que está escrito para seguir el estilo declarativo, ¿cuáles son algunos usos legítimos para ReferenceEquals()?

Sólo hay un uso legítimo de la ReferenceEquals independientemente del "estilo" en el que el programa está escrito: para comparar dos referencias para la igualdad de referencia.

Si está utilizando ReferenceEquals para algo más que la comparación de dos referencias para la igualdad de referencia, probablemente esté haciendo algo mal.

+0

Err, creo que OP está pidiendo los casos de uso para comparar referencias de igualdad de referencia. Más allá de esto, cualquier información que pueda proporcionar será de gran ayuda. –

+2

Un poco tautológico para mis gustos. – CodesInChaos

+4

@CodeInChaos: Tautológico, claro. Pero tenga en cuenta la cantidad de personas que usan GetHashCode para algo que no sea equilibrar una tabla hash. O la cantidad de personas que usan cadena * ordenando * cuando necesitan cadena * igualdad *. O la cantidad de personas que usan * Count() * cuando quieren decir * Any() *. –