J’ai été récemment introduit à une grande base de code et remarqué toutes les comparaisons de chaînes sont effectuées à l’aide au lieu de
Quelle est la raison pour cela, pensez-vous ? Pourquoi voudriez-vous utiliser String.Equals plus == ?
J’ai été récemment introduit à une grande base de code et remarqué toutes les comparaisons de chaînes sont effectuées à l’aide au lieu de
Quelle est la raison pour cela, pensez-vous ? Pourquoi voudriez-vous utiliser String.Equals plus == ?
Il est tout à fait probable qu’une grande partie de la base de développeur provient d’un Java où l’utilisation de fond `` pour comparer des chaînes est faux et ne fonctionne pas.
En c#, il n’y a aucune différence (pratique) (pour cordes) tant qu’ils sont de type string.
Si elles sont tapées comme ou
alors voir ici les autres réponses qui parlent de méthodes génériques ou de surcharge des opérateurs car il vous certainement à utiliser la méthode Equals.
Il est pratique, la différence entre string.Equals
et ==
bool result = false;
object obj = "String";
string str2 = "String";
string str3 = typeof(string).Name;
string str4 = "String";
object obj2 = str3;
// Comparision between object obj and string str2 -- Com 1
result = string.Equals(obj, str2);// true
result = String.ReferenceEquals(obj, str2); // true
result = (obj == str2);// true
// Comparision between object obj and string str3 -- Com 2
result = string.Equals(obj, str3);// true
result = String.ReferenceEquals(obj, str3); // false
result = (obj == str3);// false
// Comparision between object obj and string str4 -- Com 3
result = string.Equals(obj, str4);// true
result = String.ReferenceEquals(obj, str4); // true
result = (obj == str4);// true
// Comparision between string str2 and string str3 -- Com 4
result = string.Equals(str2, str3);// true
result = String.ReferenceEquals(str2, str3); // false
result = (str2 == str3);// true
// Comparision between string str2 and string str4 -- Com 5
result = string.Equals(str2, str4);// true
result = String.ReferenceEquals(str2, str4); // true
result = (str2 == str4);// true
// Comparision between string str3 and string str4 -- Com 6
result = string.Equals(str3, str4);// true
result = String.ReferenceEquals(str3, str4); // false
result = (str3 == str4);// true
// Comparision between object obj and object obj2 -- Com 7
result = String.Equals(obj, obj2);// true
result = String.ReferenceEquals(obj, obj2); // false
result = (obj == obj2);// false
L'Ajout De Regarder
obj "String" {1#} object {string}
str2 "String" {1#} string
str3 "String" {5#} string
str4 "String" {1#} string
obj2 "String" {5#} object {string}
Maintenant, regardez {1#}
et {5#}
obj
, str2
, str4
et obj2
références sont les mêmes.
obj
et obj2
sont object type
et d'autres sont string type
object
et string
donc effectue une référence de contrôle d'égalitéobject
et string
donc effectue une référence de contrôle d'égalitéobject
et string
donc effectue une référence de contrôle d'égalitéstring
et string
donc effectue une valeur de chaîne de vérifierstring
et string
donc effectue une valeur de chaîne de vérifierstring
et string
donc effectue une valeur de chaîne de vérifierobject
et object
donc effectue une référence de contrôle d'égalité
- obj et obj2 point pour les différentes références de sorte que le résultat est fauxIl y a une subtile mais très importante différence entre == et la Chaîne.Est égal méthodes:
class Program
{
static void Main(string[] args)
{
CheckEquality("a", "a");
Console.WriteLine("----------");
CheckEquality("a", "ba".Substring(1));
}
static void CheckEquality<T>(T value1, T value2) where T : class
{
Console.WriteLine("value1: {0}", value1);
Console.WriteLine("value2: {0}", value2);
Console.WriteLine("value1 == value2: {0}", value1 == value2);
Console.WriteLine("value1.Equals(value2): {0}", value1.Equals(value2));
if (typeof(T).IsEquivalentTo(typeof(string)))
{
string string1 = (string)(object)value1;
string string2 = (string)(object)value2;
Console.WriteLine("string1 == string2: {0}", string1 == string2);
}
}
}
Produit de cette sortie:
value1: a value2: a value1 == value2: True value1.Equals(value2): True string1 == string2: True ---------- value1: a value2: a value1 == value2: False value1.Equals(value2): True string1 == string2: True
Vous pouvez voir que l'opérateur == est de retour faux à deux, évidemment, l'égalité des chaînes de caractères. Pourquoi? Parce que l'opérateur == en cours d'utilisation dans le générique de la méthode est résolu à l'op_equal méthode telle que définie par le Système.Objet (la seule garantie de T la méthode a au moment de la compilation), ce qui signifie que c'est la référence à l'égalité au lieu de la valeur de l'égalité.
Lorsque vous avez deux valeurs saisies en tant que Système.Chaîne explicitement, alors == a la valeur de l'égalité sémantique, car le compilateur résout l' == pour le Système.Chaîne de caractères.op_equal au lieu de Système.Objet.op_equal.
Donc, pour jouer la sécurité, j'ai presque toujours utiliser des chaînes de caractères.Est égal à la place de qui je reçois toujours la valeur de l'égalité sémantique que je veux.
Et pour éviter d'exception nullreferenceexceptions si une des valeurs est nulle, je l'utilise toujours la statique de la Chaîne.Méthode Equals:
bool true = String.Equals("a", "ba".Substring(1));
Il y a un texte sur cet article que vous trouverez peut-être intéressant, avec quelques citations de Jon Skeet. Il semble que l’utilisation est à peu près les mêmes.
Jon Skeet affirme que l’exécution de l’instance est égale à « est un peu mieux lorsque les chaînes sont courtes-comme les chaînes augmentent de longueur, cette différence devient complètement insignifiante. »
Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.