== y equals

20/11/2003 - 10:01 por Miguel Tubía | Informe spam
Hola,
me gustaría redefinir el operador ==, para personalizar cuando una clase es
igual a otra (un cliente es igual a otro si tiene el mismo nombre, etc...),
pero he leído q tb es aconsejable redefinir el operador equals, por el tema
de las colecciones, o algo así...
El caso es q no creo q esas clases estén en una colección (sí en Arrays pero
es diferente). ¿Debería redefinir tb el equals? ¿Cómo se debería hacer?
Aunque tenga redefinido ==.
Por otro lado, he leído que equals, internamente, llama a == pero haciendo
algunas cosas más, o algo así... ¿Q diferencias hay entre ==, el método de
clase equals y el estático equals?
Muchas gracias por su ayuda
Un saludo
 

Leer las respuestas

#1 Joao Paulo Melo
20/11/2003 - 11:24 | Informe spam
veja este exemplo, espero q lhe ajude entender, depurando
dah pra ver como funciona
______________________________________________ exemplo
public class Pessoa
{
#region Atributos
ushort codigo = ushort.MinValue;
string nome = string.Empty;
ArrayList dependentes = new ArrayList();
#endregion

#region Propriedades
public ushort Codigo
{
get { return codigo; }
set { codigo = value; }
}

public string Nome
{
get { return nome; }
set { nome = value; }
}

public Dependente[] Dependentes
{
get { return this.dependentes.ToArray
(typeof(Dependete)) as Dependente[]; }
set { this.dependentes.AddRange(value); }
}
#endregion

public Pessoa()
{
}



/// <summary>
/// Este método eh o mais importante, eh onde
pegaremos o codigo hash
/// do objeto, q será quem vai diferenciar (ou
igualar) uma 'Pessoa' de outra
/// </summary>
public override int GetHashCode()
{
int value = 0;

value ^= codigo.GetHashCode();
value ^= nome.GetHashCode();
value ^= dependentes.GetHashCode();

return value;
}

/// <summary>
/// Este Método vai chamar o 'GetHashCode()'
/// </summary>
public override bool Equals(object obj)
{
if (this.GetType() != obj.GetType())
return false;

//
// aqui estou comparando atraves do
codigo hash
// por isso a importancia de fazer o
override do GetHashCode (acima)
//
Pessoa value = (Pessoa)obj;
value.GetHashCode().Equals(
this.GetHashCode() );
}

/// <summary>
/// Este Operador vai chamar o 'Equals()'
/// </summary>
public static bool operator == (Categoria obj1,
Categoria obj2)
{
if (((object)obj1 == null) || ((object)
obj2 == null))
return (object)obj1 == (object)
obj2;

return Object.Equals(obj1, obj2);
}

/// <summary>
/// Este Operador vai chamar o operador '=='
/// </summary>
public static bool operator != (Categoria obj1,
Categoria obj2)
{
return !(obj1 == obj2);
}

object ICloneable.Clone()
{
return new Categoria(this);
}
}
______________________________________________


Hola,
me gustaría redefinir el operador ==, para personalizar


cuando una clase es
igual a otra (un cliente es igual a otro si tiene el


mismo nombre, etc...),
pero he leído q tb es aconsejable redefinir el operador


equals, por el tema
de las colecciones, o algo así...
El caso es q no creo q esas clases estén en una


colección (sí en Arrays pero
es diferente). ¿Debería redefinir tb el equals? ¿Cómo se


debería hacer?
Aunque tenga redefinido ==.
Por otro lado, he leído que equals, internamente, llama


a == pero haciendo
algunas cosas más, o algo así... ¿Q diferencias hay


entre ==, el método de
clase equals y el estático equals?
Muchas gracias por su ayuda
Un saludo


.

Preguntas similares