Explication des méthodes publiques dans Objet :
Méthodes publiques :
Equals :
Objet de classe publique {
public virtuel Boolean Equals(Object obj )
{
//Si deux références pointent vers le même objet, elles doivent contenir la même valeur
if (this == obj) return true;
return false;
}
}
En supposant que les instances this et obj font référence au même objet, renvoie true. Cela semble raisonnable car Equals sait que l'objet doit contenir la même valeur que lui. Mais si les instances font référence à des objets différents, Equals ne sait pas si les objets contiennent la même valeur, il renvoie donc false. En d’autres termes, pour l’implémentation par défaut de la méthode Equals d’Object, ce qu’elle implémente réellement est l’identité et non l’égalité.
Implémentation correcte de la méthode Equals :
1. Si le paramètre réel obj est nul, renvoyez false, car lors de l'appel de la méthode Equals non statique, l'objet actuel identifié par ceci ne peut évidemment pas être nul.
2, si les paramètres réels this et obj font référence au même objet, renvoie true. Cette étape peut aider à améliorer les performances lors de la comparaison d'objets contenant un grand nombre de champs
3 Si les arguments this et obj font référence à des objets de types différents, renvoient false. Un objet chaîne n'est évidemment pas égal à un objet FileStream
4 Pour chaque champ défini par le type, comparez la valeur de cet objet avec la valeur de l'objet obj. Si un champ n'est pas égal, false<.>
5. Appelez la méthode Equals de la classe de base pour comparer n'importe quel champ défini par celle-ci. Si la méthode Equals de la classe de base renvoie false, elle renvoie false, sinon elle renvoie true
Remarque :
Le test des problèmes d'identité utilise la méthode statique d'Object ReferenceEquals, dont le prototype est le suivant :
public static Boolean ReferenceEquals(Object objA, object objB)
{
return (objA==objB);
>
Vérifiez le problème d'identité (pour voir si les deux références pointent vers le même objet). Assurez-vous d'appeler ReferenceEquals. n'utilisez pas l'opérateur C# == (sauf si vous convertissez d'abord les deux opérandes en objet), car le type d'un certain opérande peut être surchargé avec l'opérateur == et sa valeur attribuée a une sémantique différente de celle de l'identité.
Système. ValueType (la classe de base de tous les types de valeur) remplace la méthode Equals de Object et implémente l'implémentation correcte pour effectuer des contrôles d'égalité des valeurs (au lieu de contrôles d'identité). L'implémentation interne de Equals de ValueType est la suivante :
.
1, si le paramètre réel obj est nul, renvoie false
2, si ceci et les paramètres réels obj font référence à des objets de types différents, renvoie false
3, pour chaque définition de type Les champs d'instance comparent tous la valeur de cet objet avec la valeur de l'objet obj (au lieu d'un contrôle d'identité). L'implémentation interne de Equals of ValueType est la suivante :
1, si le paramètre réel obj est nul, renvoie false
2, si this et les paramètres réels obj font référence à des objets de types différents, return false
3. Pour chaque champ d'instance défini par le type, comparez la valeur de cet objet avec la valeur de l'objet obj (en appelant la méthode equals du champ Si un champ n'est pas égal). false
4, renvoie vrai. La méthode Equals de ValueType n'appelle pas la méthode Equals de Object
En interne, la méthode Equals de ValueType utilise la réflexion pour terminer l'étape 3 ci-dessus. Étant donné que le mécanisme de réflexion CLR est lent, vous devez remplacer la méthode Equals pour fournissez le vôtre lors de la définition de votre propre type de valeur. Implémentation, améliorant ainsi les performances des comparaisons d'égalité avec la force de votre propre type. Bien sûr, votre propre implémentation n'appelle pas base.Equals.
Remarque :
est remplacé lors de la définition de votre propre type. Equals doit respecter les quatre caractéristiques de l'égalité
1, Equalse doit être réflexif : x.Equals(x) doit renvoyer true
2. , Equals doit être symétrique : x.Equals(y) et y.Equals(x) renvoie la même valeur
3, Equals doit être transférable : x.Equals(y) renvoie true, y.Equals(z ) renvoie vrai, alors x.Equals(z) doit renvoyer vrai
4, Equals doit être cohérent. La comparaison de deux valeurs reste inchangée et la valeur de retour de Equals reste inchangée
GetHashCode :
Lorsque la classe que vous définissez remplace la méthode Equals, vous devez également la remplacer la méthode GetHashCode . La raison de cette exigence est que l'implémentation du type System.Collections.Hashtable, du type System.Collection.Generic.Dictionary et de certaines autres collections nécessite que deux objets aient le même code de hachage pour être considérés comme égaux. Par conséquent, si vous réécrivez Equals, vous devez réécrire GetHashCode pour garantir la cohérence de l'algorithme d'égalité et de l'algorithme de code de hachage d'objet. Pour faire simple, pour ajouter une paire clé/valeur à une collection, vous devez d’abord obtenir le code de hachage de l’objet. Le code de hachage indique dans quel compartiment de hachage la paire clé/valeur doit être stockée. Lorsqu'une collection doit rechercher une clé, elle obtient le code de hachage de l'objet clé spécifié, qui identifie le compartiment de hachage qui doit maintenant être recherché de manière séquentielle, où elle recherchera des objets clés égaux à l'objet clé spécifié. . L'utilisation de cet algorithme pour stocker et rechercher des clés signifie qu'une fois qu'un objet clé de la collection est modifié, la collection ne peut plus trouver l'objet. Par conséquent, lorsque vous devez modifier l'objet clé dans la table de hachage, l'approche correcte consiste à supprimer la paire clé/valeur d'origine, à modifier l'objet clé, puis à rajouter la nouvelle paire clé/valeur à la table de hachage.
La personnalisation de la méthode GetHashCode n'est peut-être pas difficile, mais cela dépend du type de données et de la distribution des données. Un exemple et une règle seront donnés ci-dessous :
Point de classe scellé interne
{
private readonly Int32 m_x, m_y;
public override int GetHashCode()
{
return m_x ^ m_y; //Renvoie le résultat XOR de m_x et m_y
}
}
Règle :
1, cet algorithme devrait provide Une bonne distribution aléatoire permet à la table de hachage d'obtenir les meilleures performances
2. La méthode GetHashCode accumulée peut être appelée dans l'algorithme et sa valeur de retour est incluse. Mais n'appelez généralement pas la méthode GetHashCode de Object ou ValueType, car l'implémentation des deux n'a rien à voir avec les algorithmes de hachage hautes performances
3, la vitesse d'exécution de l'algorithme doit être la plus rapide possible
4, contenant la même valeur. Différents objets doivent renvoyer la même valeur de hachage. Par exemple, deux objets chaîne contenant le même texte renvoient le même code de hachage
5. La méthode GetHashCode implémentée par System.Object ne sait rien des types dérivés et des autres champs, elle renvoie donc un nombre inchangé garanti.
ToString :
Le nom complet du type de retour par défaut (this.GetType().FullName)
GetType :
Renvoie un type dérivé de Type Une instance de Indique le type de l'objet lorsque GetType est appelé. L'objet Type renvoyé peut être utilisé avec des classes de réflexion pour obtenir des informations de métadonnées liées au type de l'objet. De plus, GetType est une méthode non virtuelle. Le but est d'empêcher la classe de remplacer la méthode, de masquer le type d'entreprise et de détruire ainsi la sécurité des types.
Méthode protégée :
MemberwiseClone :
Cette méthode non virtuelle crée une nouvelle instance de la classe et définit le champ d'instance de la objet statique à ceci Les champs d'instance des objets sont exactement les mêmes. Renvoie une référence à la nouvelle instance.
Finaliser :
Cette méthode virtuelle sera appelée une fois que le ramasse-miettes aura déterminé que l'objet est recyclé comme déchet et avant que la mémoire de l'objet ne soit réellement recyclée. Les types qui doivent effectuer des travaux de nettoyage avant le recyclage doivent remplacer cette méthode.
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!