La comparaison de deux structures à l'aide de ==

Je suis en train de comparer deux structures à l'aide du signe égal (==) en C#. Ma structure est ci-dessous:

public struct CisSettings : IEquatable<CisSettings>
{
public int Gain { get; private set; }
public int Offset { get; private set; }
public int Bright { get; private set; }
public int Contrast { get; private set; }
public CisSettings(int gain, int offset, int bright, int contrast) : this()
{
Gain = gain;
Offset = offset;
Bright = bright;
Contrast = contrast;
}
public bool Equals(CisSettings other)
{
return Equals(other, this);
}
public override bool Equals(object obj)
{
if (obj == null || GetType() != obj.GetType())
{
return false;
}
var objectToCompareWith = (CisSettings) obj;
return objectToCompareWith.Bright == Bright && objectToCompareWith.Contrast == Contrast &&
objectToCompareWith.Gain == Gain && objectToCompareWith.Offset == Offset;
}
public override int GetHashCode()
{
var calculation = Gain + Offset + Bright + Contrast;
return calculation.GetHashCode();
}
}

Je suis en train d'avoir struct comme un bien dans ma classe, et que vous souhaitez vérifier pour voir si la structure est égale à la valeur, je suis en train de l'attribuer à l', avant d'aller de l'avant et de le faire, donc je ne suis pas en indiquant la propriété a changé quand elle n'a pas, comme suit:

public CisSettings TopCisSettings
{
get { return _topCisSettings; }
set
{
if (_topCisSettings == value)
{
return;
}
_topCisSettings = value;
OnPropertyChanged("TopCisSettings");
}
}

Cependant, sur la ligne où je l'ai vérifier l'égalité, j'obtiens cette erreur:

Opérateur '==' ne peut pas être appliquée à des opérandes de type 'CisSettings" et
'CisSettings'

Je ne peux pas comprendre pourquoi ce qui se passe, quelqu'un pourrait me diriger dans la bonne direction?

  • Comment sur l'utilisation de Equals()?
  • Est égal fonctionne très bien, je me demandais pourquoi mon substitution de == ne fonctionne pas
  • peut-être parce que vous n'avez pas le remplacer... 🙂
  • Donc je n'ai pas, je n'ai pas eu de café encore hah merci à tous!
  • if (obj == null || GetType() != obj.GetType()) est une très étrange façon d'écrire if(!(obj is CisSettings)).
  • Aussi, la logique est à la mauvaise place: mettre le type de logique spécifique dans Equals(CisSettings) et ont Equals(object) l'appeler, plutôt que l'inverse.
  • Aussi, l'appel de GetHashCode sur un entier de 32 bits, est inutile; un entier de 32 bits est son propre code de hachage.
  • Aussi, votre code de hachage a une mauvaise distribution si les quatre numéros ont tendance à être des valeurs similaires.
  • En ce qui concerne le premier point, ReSharper a écrit cela, je devrait avoir changé. Aussi je vais passer le type de logique spécifique pour le générique de la méthode equals, et je comprends maintenant qu'un entier de 32 bits est son propre code de hachage, merci pour les conseils!
  • Citation: . if (obj == null || GetType() != obj.GetType()) est une très étrange façon d'écrire if(!(obj is CisSettings)) Sûr, on dirait qu'il est en imitant la meilleure façon de le faire Equals avec les non-scellé classes. Là, il est de bonne pratique pour vérifier si this ou other est plus dérivé. Mais bien sûr, avec un type scellé, comme un struct dans ce cas, il n'y a pas besoin de cela.
  • Je n'étais pas aussi intelligent que ça, j'étais tout simplement paresseux et laisser ReSharper écrire le code pour moi, mais vous-même et Eric sont tous les deux corrects, merci encore
  • Ne ReSharper vraiment cracher le code comme ça pour une struct? Il est utile pour les non-scellé classes, comme je l'ai dit.
  • ReSharper ou Visual Studio 2012, pas sûr que maintenant! Mais tapez le mot d'égal à égal et appuyez sur la touche retour et c'est ce qui vient de sortir (avec des commentaires en les reliant à des lignes directrices sur Microsoft.com qui est de me faire penser qu'il n'est pas ReSharper, mais à tous VS)
  • Beaucoup de réponses mentionné que la solution est de surcharge == et !=. Mais je pense qu'il est plus important de répondre à cette question: pourquoi ne pas struct mise en œuvre == et != par défaut, à l'aide de la déjà mis en œuvre Equals()

InformationsquelleAutor JMK | 2013-03-04