2010-03-04 11 views
9

digamos que tenemos dos objetos o1 o2 & definidos como System.Object, en mi situtaion o1 o2 & pueden ser cualquiera de los siguientes tipos:.NET objeto la igualdad

  • cadena
  • Int32
  • doble
  • booleana
  • DateTime
  • DBNull

Entonces, ¿cómo puedo comprobar que o1 & o2 son iguales, por lo tanto, son el mismo objeto o ambos tienen el mismo valor de tipo &.

¿Puedo hacer o1 == o2 o tengo que hacer o1.Equals(o2) o algo más?

Gracias,

AJ

Respuesta

17

yo sugeriría que utilizan

object.Equals(o1, o2) 

como que va a hacer frente a la nulidad también. (Eso supone que usted quiere dos referencias nulas para comparar como iguales.)

Usted debe no use == porque los operadores no se aplican polimórficamente; los tipos sobrecarga == pero no lo hacen anula (no hay nada que anular). Si utiliza

o1 == o2 

que se compararlos para identidad referencia, porque las variables son declaradas como de tipo object.

Usando o1.Equals(o2) trabajará excepto en el caso en o1 es nulo - momento en el que iba a lanzar un NullReferenceException.

+0

+1, justo lo que estaba sugiriendo también (pero unos segundos tarde) – Lucero

+0

Creo que debería haber refrescado las respuestas antes de terminar mi respuesta. :) +1 – IAbstract

+0

Gracias, eso tiene sentido. –

1

Yo usaría Object.Equals(o1,o2) - ref. MSDN

Jon ha proporcionado excelentes explicaciones de por qué este sería el mejor uso.

4

Operador == compare los objetos por referencia, y el método es igual a comparando los objetos por valor.
Por ejemplo:

StringBuilder s1 = new StringBuilder(“Yes”); 

StringBuilder s2 = new StringBuilder(“Yes”); 

Console.WriteLine(s1 == s2); 

Console.WriteLine(s1.Equals(s2)); 

pantalla:

False 

True 

objetos de valor pueden ser comparados ya sea por == o iguales.

1

'Igual' debería funcionar para las cadenas y los tipos de valores que enumeró.

'==' fallará para cosas como el siguiente código debido a que las referencias a los objetos en cajas no son los mismos:

 int x = 1; 
     int y = 1; 
     Object o1 = x; 
     Object o2 = y; 

Editar: me di el ejemplo dado anteriormente StringBuilder, pero ya que están utilizando cadenas y se anula su operador de igualdad, en realidad trabajarían con "==" o ".Equals", el siguiente código

string s1 = "Sí";

string s2 = "Sí";

Console.WriteLine (s1 == s2);

Console.WriteLine (s1.Equals (s2));

salidas Verdadero Verdadero

0
object.Equals(obj1, obj2) // This is the way prefered and the best practice for equality comparison. 

lo tanto también podría considerar la sustitución del método Equals cuando se trabaja con objetos personalizados (no es el caso aquí appearently).

public class Something { 
    public long Id { get; set; } 
    public string Name { get; set; } 

    public override bool Equals(object obj) { 
     if (obj == null) 
      return false; 

     if (((Something)obj) == null) 
      return false; 

     Something s = (Something)obj; 

     return this.Id == s.Id && string.Equals(this.Name, s.Name); 
    } 

    public bool Equals(Something s) { 
     if (s == null) 
      return false; 

     return this.Id == s.Id && string.Equals(this.Name, s.Name); 
    } 
} 

De esta manera, se asegurará de que sus objetos personalizados son iguales.

Cuestiones relacionadas