2010-07-23 5 views
2

J'ai une application qui utilise System::String géré dans les éléments de l'interface utilisateur, mais fait référence au code non géré (read: legacy) pour le calcul plus complexe.Comment comparer les chaînes gérées et non gérées?

De plus, il n'y a pas un codage cohérent pour les chaînes - chaînes gérées peuvent être soit "strings" régulière ou Unicode L"strings" et les chaînes ONU gérés sont disponibles dans toutes char *, wchar_t *, std::string, std::wstring variétés.

Quelle est la meilleure façon de comparer les différentes saveurs de chaînes? J'espère que je peux le faire sans avoir à mettre en œuvre une demi-douzaine de méthodes de comparaison comme

int compare(System::String^s1, char * s2); 
int compare(System::String^s1, wchar_t * s2); 
int compare(System::String^s1, std::string s2); 
int compare(System::String^s1, std::wstring s2); 
int compare(char * s1, System::String^s2); 
int compare(wchar_t * s1, System::String^s2); 
... 

L'objectif principal sera les comparaisons d'égalité, donc si ceux-ci sont beaucoup plus faciles à faire, alors je voudrais voir les réponses aussi bien.

Répondre

0

Voici un excellent article MSDN couvrant ce sujet dans les deux sens:

http://msdn.microsoft.com/en-us/library/42zy2z41.aspx

Et voici la classe Marshal:

http://msdn.microsoft.com/en-us/library/atxe881w.aspx

Avec cela, je suggère de définir divers code managé méthodes qui prennent les différents types de chaînes natives, les convertissent en une chaîne gérée, puis les compare.

Malheureusement, je ne vois aucun moyen de permuter les différents types de chaînes natives. Ils sont littéralement des types de données différents, même s'ils représentent tous deux ce que nous appelons une chaîne. Et si cela chamboule la conversion, vous pouvez entrer dans un territoire dangereux.

En outre, je laisser tomber std::string hors de la course, puisque vous pouvez facilement appeler c_str() pour obtenir un const char *. Idem pour std::wstring et wchar_t.

Voici un exemple d'un:

using namespace System::Runtime::InteropServices; 

public static int NativeCompare(System::String^s1, char * s2) 
{ 
    System::String ms2 = Marshal::PtrToStringAnsi((IntPtr)s2); 
    return s1.CompareTo(ms2); 
} 
+0

est-il une raison particulière de choisir de faire la comparaison using System :: chaîne sur l'une des alternatives? Je n'ai aucune idée si l'utilisation de chaînes de style C serait mieux, mais je ne peux pas imaginer que ce soit pire. – MikeD

Questions connexes