CA1815: É igual a substituição e o operador equals em tipos de valor
TypeName |
OverrideEqualsAndOperatorEqualsOnValueTypes |
CheckId |
CA1815 |
<strong>Categoria</strong> |
Microsoft.Performance |
Alteração significativa |
Não-separável |
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 a enumerações.
Descrição da regra
Para tipos de valor, a implementação herdada do Equals usa a biblioteca de reflexão e compara o conteúdo de todos os campos. A reflexão é dispendiosa e comparar todos os campos de igualdade talvez seja desnecessário. Se você espera que os usuários para comparar ou classificar instâncias ou usá-los como chaves de tabela de hash, seu tipo de valor deve implementar Equals. Se a sua linguagem de programação oferece suporte a 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, fornecer uma implementação de Equals. Se possível, implemente o operador de igualdade.
Quando suprimir avisos
É seguro eliminar um aviso esta regra se ocorrê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 essa 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 a correção
Descrição
O exemplo a seguir corrige a violação anterior, substituindo ValueTypeEquals() e implementar 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 equals em substituição a ValueType.Equals
CA2226: Os operadores devem ter sobrecargas simétricas