Как сравнить управляемые и неуправляемые строки? - PullRequest
2 голосов
/ 23 июля 2010

У меня есть приложение, которое использует управляемые System::String в элементах пользовательского интерфейса, но затем обращается к неуправляемому (читай: устаревшему) коду для более сложных вычислений.

Кроме того, не существует согласованногокодирование для строк - управляемые строки могут быть либо обычными "strings", либо Unicode L"strings", а неуправляемые строки бывают всех char *, wchar_t *, std::string, std::wstring разновидностей.

Каков наилучший способ сравнения различных разновидностейстроки?Я надеюсь, что смогу сделать это, не прибегая к полудюжине методов сравнения, таких как

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);
...

. Основной целью будет сравнение на равенство, поэтому, если это будет значительно проще, я бы хотелсм. также эти ответы.

1 Ответ

0 голосов
/ 23 июля 2010

Вот отличная статья MSDN, охватывающая эту тему в обоих направлениях:

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

А вот класс Маршала:

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

При этом я бы предложил определить различные методы управляемого кода, которые принимают различные типы собственных строк, преобразуют их в управляемую строку, а затем сравнивают их.

К сожалению, я не вижу способа обойти различные типы собственных строк. Это буквально разные типы данных, хотя они оба представляют то, что мы называем строкой. И если это испортит конверсию, вы можете попасть на опасную территорию.

Кроме того, я бы исключил std::string из строя, так как вы можете легко позвонить c_str(), чтобы получить const char *. То же самое для std::wstring и wchar_t.

Вот один пример:

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);
}
...