2012-10-11 1 views
-2

Existe-t-il un moyen possible de comparer des chaînes sans appeler la fonction op_Equality par mscorlib? Par exemple:Comment éviter les appels à mscorlib lors de la comparaison de chaînes?

string s1 = "hi"; 
if(s1 == "bye") 
{ 
Console.Writeline("foo"); 
} 

Compile à:

IL_0003: call bool [mscorlib]System.String::op_Equality(string, string) 

Et regardant op_Equality à mscorlib de GAC appelle une autre méthode Equals (string, string) code:

public static bool Equals(string a, string b) 
{ 
    return a == b || (a != null && b != null && string.EqualsHelper(a, b)); 
} 

il utilise le code op bne.une.s pour comparer ces chaînes.

Maintenant de retour à ma question, comment puis-je comparer 2 chaînes sans appeler aucune fonction du mscorlib comme la méthode Equals.

+0

Pourquoi voulez-vous éviter mscorlib? –

+0

Vous pourriez écrire votre propre méthode, peut-être en itérant sur les caractères. Mais quel serait le but? –

+1

Les chances sont que toute méthode que vous écrivez ne sera pas aussi rapide que celle intégrée, soit. La méthode intégrée utilise du code non sécurisé pour effectuer la vérification d'égalité assez efficacement. –

Répondre

3

Maintenant de retour à ma question, comment puis-je comparer 2 chaînes sans appeler aucune fonction du mscorlib comme le fait la méthode Equals.

Vous ne pouvez pas - du moins pas sans écrire votre propre méthode de comparaison de chaîne à partir de zéro.

À un certain moment, il vous faudrait au moins appeler String.Equals(a,b) (afin d'avoir la méthode EqualsHelper privée appelée, qui fait la comparaison réelle), qui est également défini dans mscorlib.

Vous pouvez appeler directement Equals si vous souhaitez éviter l'appel de l'opérateur, si:

string s1 = "hi"; 
if (string.Equals(s1, "bye")) 
{ 
    Console.WriteLine("foo"); 
} 

Cela permettrait d'éviter l'appel à op_Equality, sans passer et appeler Equals directement.

Cela étant dit, il n'y a vraiment aucune raison d'éviter d'appeler op_Equality sur les chaînes en premier lieu ...

+0

Mais comment la méthode String.Equals compare-t-elle réellement ces 2 chaînes? Je veux dire qu'il doit y avoir un moyen. – method

+0

@Furious Juste édité avec plus de détails. Il utilise une méthode privée ('string.EqualsHelper'), qui est également définie dans' mscorlib' - puisque c'est privé, vous ne pouvez pas l'appeler vous-même. –

0

C'est une autre façon de comparer:

 string s1 = "Hello"; 

     bool same = s1.CompareTo("Hello") == 0; 
     bool different = s1.CompareTo("GoodBye") != 0; 

     Console.WriteLine(same); 
     Console.WriteLine(different); 

Dans ce cas, les deux devraient signaler "True" à la console.

Une autre façon:

private static bool CheckEqual(string s1, string s2) 
    { 
     char[] c1 = (s1 == null) ? new char[0] : s1.ToCharArray(); 
     char[] c2 = (s2 == null) ? new char[0] : s2.ToCharArray(); 

     if (c1.Length != c2.Length) { return false; } 

     for (int i = 0; i < c1.Length; i++) 
     { 
      if (!c1[i].Equals(c2[i])) { return false; } 
     } 

     return true; 
    } 
+0

Je suis assez sûr que 'CompareTo' est fourni par mscorlib –

+1

MSDN à propos de' 0' pour 'CompareTo': *" Cette instance a la même position dans l'ordre de tri que strB. "* Donc, ils sont certainement équivalents, mais pas garanti d'égaler. Je ne suis pas sûr du comportement réel, pour être honnête, mais je vous recommande de ne pas compter sur quelque chose qui n'est pas explicitement indiqué. http://msdn.microsoft.com/en-us/library/35f0x18w.aspx –

+0

@Mudu plus, 'CompareTo' pourrait être moins efficace que' Equals'. Si vous avez des chaînes longues, de longueurs différentes, qui commencent par la même sous-chaîne, Equals retournera false immédiatement après avoir vérifié la longueur, mais CompareTo devra parcourir les chaînes jusqu'à ce qu'il trouve un caractère incompatible. – phoog

1

Il semble que vous demandez une fonction de comparaison de chaînes. Les chaînes sont essentiellement des tableaux de caractères que vous pouvez indexer de la même manière. Voici un algorithme de comparaison de chaînes simple.

public static bool Equals(string left, string right) 
{ 
    if (ReferenceEquals(left, null)) return ReferenceEquals(right, null); 
    if (left.Length != right.Length) return false; 
    for (int i = 0; i < left.Length; i++) 
    { 
     if (left[i] != right[i]) 
      return false; 
    } 
    return true; 
} 

Après vous avoir montré que, il n'y a aucune raison d'éviter la mise en œuvre mscorlib, puisque mon exemple fait plusieurs appels à mscorlib.

0

Étant donné que la classe String est fournie par mscorlib, il n'y a absolument aucun moyen de comparer deux chaînes sans utiliser mscorlib. Même en utilisant simplement l'indexeur pour que chaque personnage appelle mscorlib.La seule façon d'éviter mscorlib est de ne pas utiliser l'exécution .Net, mais c'est assez difficile si vous voulez utiliser C#.

+0

Vous pouvez utiliser Mono. – phoog

+0

@phoog - Oui, je suppose, mais alors le PO poserait des questions sur la façon d'éviter tout assemblage est l'équivalent Mono de mscorlib. –

+0

C'est sans doute vrai. Je voulais juste souligner qu'il existe des moyens d'utiliser C# sans utiliser l'environnement d'exécution .NET. – phoog