É igual a do CA1815: Substituição e o operador equals em tipos de valor
TypeName |
OverrideEqualsAndOperatorEqualsOnValueTypes |
CheckId |
CA1815 |
Category (Categoria) |
Microsoft.Performance |
Alteração Significativa |
Sem quebra |
Causa
Um tipo de valor público não substitui Object.Equals, ou não implementa o operador de igualdade (==).Esta regra não verifica enumerações.
Descrição da Regra
Para tipos de valor, a implementação herdada de Equals usa a biblioteca de Reflexo (Reflection library), e compara o conteúdo de todos os campos.Reflexão é computacionalmente cara, e comparar cada campo por igualdade pode ser desnecessário.Se você pretende que usuários classifiquem ou comparem instâncias, ou as usa como chaves de tabela de hash, seu tipo de valor deve implementar Equals.Se sua linguagem de programação oferece suporte à sobrecarga de operador, você também deve fornecer uma implementação dos operadores de igualdade e desigualdade.
Como Corrigir Violações
Para corrigir uma violação desta regra, forneça uma implementação de Equals.Se você puder, implemente o operador de igualdade.
Quando Suprimir Alertas
É seguro suprimir um aviso desta regra se as instâncias do tipo de valor não serão comparadas entre si.
Exemplo de uma Violação
Descrição
O exemplo a seguir mostra uma estrutura (tipo de valor) que viola esta regra.
Código
using System;
namespace Samples
{
// Violates this rule
public struct Point
{
private readonly int _X;
private readonly int _Y;
public Point(int x, int y)
{
_X = x;
_Y = y;
}
public int X
{
get { return _X; }
}
public int Y
{
get { return _Y; }
}
}
}
Exemplo de Como Corrigir
Descrição
O exemplo a seguir corrige a violação anterior substituindo ValueType.Equals e implementando os operadores de igualdade (==, !=).
Código
using System;
namespace Samples
{
public struct Point : IEquatable<Point>
{
private readonly int _X;
private readonly int _Y;
public Point(int x, int y)
{
_X = x;
_Y = y;
}
public int X
{
get { return _X; }
}
public int Y
{
get { return _Y; }
}
public override int GetHashCode()
{
return _X ^ _Y;
}
public override bool Equals(object obj)
{
if (!(obj is Point))
return false;
return Equals((Point)obj);
}
public bool Equals(Point other)
{
if (_X != other._X)
return false;
return _Y == other._Y;
}
public static bool operator ==(Point point1, Point point2)
{
return point1.Equals(point2);
}
public static bool operator !=(Point point1, Point point2)
{
return !point1.Equals(point2);
}
}
}
Regras Relacionadas
CA2224: É igual a substituição na sobrecarga de operador equals
CA2231: Sobrecarga de operador é igual a sobre a anulação de ValueType.Equals
CA2226: Os operadores devem ter a sobrecargas simétricas