Escrito em March 16th, 2009 as 10:00 pm por

0 Comentários

A comparação em .NET é algo que muitas vezes os programadores deixam de lado, renegadas às simples comparação de endereço de memória (a == b).

Contudo, o .Net Framework nos fornece mecanismos muito mais poderosos para essas comparações, que além de elegantes nos ajudam na manutenção futura dos códigos e na prevenção de possíveis bugs em nossos algoritmos.

System.IEquatable– Comparando Objetos

Utilizemos um cenário com um objeto de negócio (Usuario):
C#

public class Usuario
{
      private string _Nome;
      private string _Email;
      private byte _Idade;
      private int _ID;
      public string Nome
      {
            get { return _Nome; }
            set { _Nome = value; }
      }
      public string Email
      {
            get { return _Email; }
            set { _Email = value; }
      }
      public byte Idade
      {
            get { return _Idade; }
            set { _Idade = value; }
      }
      public int ID
      {
            get { return _ID; }
            set { _ID = value; }
      }
}

VB.NET

Public Class Usuario
    Private _Nome As String
    Private _Email As String
    Private _Idade As Byte
    Private _ID As Integer
    Public Property Nome() As String
        Get
            Return _Nome
        End Get
        Set(ByVal value As String)
            _Nome = value
        End Set
    End Property
    Public Property Email() As String
        Get
            Return _Email
        End Get
        Set(ByVal value As String)
            _Email = value
        End Set
    End Property
    Public Property Idade () As Byte
        Get
            Return _Idade
        End Get
        Set(ByVal value As Byte)
            _Idade = value
        End Set
    End Property
    Public Property ID () As Integer
        Get
            Return _ID
        End Get
        Set(ByVal value As Integer)
            _ID = value
        End Set
    End Property
End Class

Como objeto de negócio, um Usuario será igual ao outro se, e somente se, o ID (chave primária) for igual nos dois objetos. Utiliza-se muito esse mecanismo em áreas de prevalência de dados.
Em uma situação típica, executaríamos o código abaixo para verificar se os usuários são iguais.

C#

if (userI.ID == userII.ID)
{
      // Usuários Iguais
}
else
{
      // Usários Diferentes
}

VB.NET

If (userI.ID = userII.ID) Then
      ' Usuários Iguais
Else
      ' Usuários Diferentes
End If

Nada de errado com o a forma de se realizar essa verificação, contudo, não está orientado a objetos e se por acaso a chave primária (que identifica um usuário) mudar teremos um grande problemas em mãos.
A fim de minimizar esse problema, podemos adotar a interface (System.IEquatable) e nosso objeto de usuário ficará:
C#

public class Usuario : IEquatable
{
      private string _Nome;
      private string _Email;
      private byte _Idade;
      private int _ID;
      public string Nome
      {
            get { return _Nome; }
            set { _Nome = value; }
      }
      public string Email
      {
            get { return _Email; }
            set { _Email = value; }
      }
      public byte Idade
      {
            get { return _Idade; }
            set { _Idade = value; }
      }
      public int ID
      {
            get { return _ID; }
            set { _ID = value; }
      }
      public bool Equals(Usuario obj)
      {
            return obj.ID == this.ID;
      }
}

VB.NET

Public Class Usuario
    Implements IEquatable(Of Usuario)
    Private _Nome As String
    Private _Email As String
    Private _Idade As Byte
    Private _ID As Integer
    Public Property Nome() As String
        Get
            Return _Nome
        End Get
        Set(ByVal value As String)
            _Nome = value
        End Set
    End Property
    Public Property Email() As String
        Get
            Return _Email
        End Get
        Set(ByVal value As String)
            _Email = value
        End Set
    End Property
    Public Property Idade() As Byte
        Get
            Return _Idade
        End Get
        Set(ByVal value As Byte)
            _Idade = value
        End Set
    End Property
    Public Property ID() As Integer
        Get
            Return _ID
        End Get
        Set(ByVal value As Integer)
            _ID = value
        End Set
    End Property
    Public Function Equals(ByVal other As Usuario) As Boolean Implements IEquatable(Of Usuario).Equals
        Return IIf(other.ID = Me.ID, True, False)
    End Function
End Class

A partir deste momento, podemos utilizar a seguinte forma para a mesma comparação anterior:
C#

if (userI.Equals(userII))
{
      // Usuários Iguais
}
else
{
      // Usários Diferentes
}

VB.NET

If (userI.Equals(userII)) Then
      ' Usuários Iguais
Else
      ' Usuários Diferentes
End If

Desta forma, temos uma comparação entre objetos de negócio de uma forma orientada a objetos e cuja regra de comparação fica restrita no próprio objeto. Acima de tudo, a regra ainda está TypeSafe graças a interface Generics utilizada.

Se você gostou do post, deixe um comentário ou assine nosso RSS RSS.

Posts Relacionados:

  1. Desmistificando Interfaces
  2. DataBind em GridView com XML e XMLDataSource no ASP.NET
  3. Utilizando Argumentos (args) em Console Application
  4. Tipos Nulos (Nullable Value Types)
  5. Manipulando Arquivos e Diretórios no .NET
, , , ,

Be the first to start a conversation

Deixa uma Resposta

znjdb32s6g