Partilhar via


Strings (C++/CX)

O texto no Tempo de Execução do Windows é representado em C++/CX pela classe Platform::String. Use o Platform::String Class quando você passa cadeias de caracteres para métodos em classes do Tempo de Execução do Windows ou quando estiver interagindo com outros componentes do Tempo de Execução do Windows através do limite da interface binária do aplicativo (ABI). O Platform::String Class fornece métodos para várias operações de cadeia de caracteres comuns, mas não foi projetado para ser uma classe de cadeia de caracteres completa. No módulo C++, use tipos de cadeia de caracteres C++ padrão, como wstring , para qualquer processamento de texto significativo e, em seguida, converta o resultado final em Platform::String^ antes de passá-lo para ou de uma interface pública. É fácil e eficiente converter entre wstring ou wchar_t* e Platform::String.

Passe rápido

Em alguns casos, o compilador pode verificar se pode construir com segurança uma Platform::String ou passar a String para uma função sem copiar os dados da cadeia de caracteres subjacente. Tais operações são conhecidas como fast pass e ocorrem de forma transparente.

Construção de cordas

O valor de um String objeto é uma sequência imutável (somente leitura) de char16 caracteres (Unicode de 16 bits). Como um String objeto é imutável, a atribuição de um novo literal de cadeia de caracteres a uma String variável na verdade substitui o objeto original String por um novo String objeto. As operações de concatenação envolvem a destruição do objeto original String e a criação de um novo objeto.

Literais

Um caractere literal é um caractere entre aspas simples, e uma cadeia de caracteres literal é uma sequência de caracteres entre aspas duplas. Se você usar um literal para inicializar uma variável String^, o compilador assumirá que o literal consiste em char16 caracteres. Ou seja, você não precisa preceder o literal com o modificador de cadeia de caracteres 'L' ou colocar o literal em uma macro _T() ou TEXT(). Para obter mais informações sobre o suporte a C++ para Unicode, consulte Resumo de programação Unicode.

O exemplo a seguir mostra várias maneiras de construir String objetos.

// Initializing a String^ by using string literals
String^ str1 = "Test"; // ok for ANSI text only. uses current code page
String^ str2("Test");
String^ str3 = L"Test";
String^ str4(L"Test");


//Initialize a String^ by using another String^
String^ str6(str1);
auto str7 = str2;

// Initialize a String from wchar_t* and wstring
wchar_t msg[] = L"Test";
String^ str8 = ref new String(msg);
std::wstring wstr1(L"Test");
String^ str9 = ref new String(wstr1.c_str());
String^ str10 = ref new String(wstr1.c_str(), wstr1.length());

Operações de manipulação de cadeias de caracteres

A String classe fornece métodos e operadores para concatenar, comparar cadeias de caracteres e outras operações básicas de cadeia de caracteres. Para executar manipulações de cadeia de caracteres mais extensas, use a String::Data() função de membro para recuperar o String^ valor do objeto como um const wchar_t*arquivo . Em seguida, use esse valor para inicializar um std::wstring, que fornece funções avançadas de manipulação de cadeia de caracteres.


 // Concatenation 
 auto str1 = "Hello" + " World";
 auto str2 = str1 + " from C++/CX!";    
 auto str3 = String::Concat(str2, " and the String class");
 
 // Comparison
 if (str1 == str2) { /* ... */ }
 if (str1->Equals(str2)) { /* ... */ }
 if (str1 != str2) { /* ... */ }
 if (str1 < str2 || str1 > str2) { /* ... */ }
 int result = String::CompareOrdinal(str1, str2);
 
 if (str1 == nullptr) { /* ...*/ }
 if (str1->IsEmpty()) { /* ...*/ }

// Accessing individual characters in a String^
 auto it = str1->Begin();
 char16 ch = it[0];

Conversões de cadeia de caracteres

A Platform::String pode conter apenas char16 caracteres, ou o NULL caractere. Se o seu aplicativo tiver que trabalhar com caracteres de 8 bits, use String::D ata para extrair o texto como um const wchar_t*arquivo . Em seguida, você pode usar as funções apropriadas do Windows ou as funções da Biblioteca Padrão para operar nos dados e convertê-los novamente em um wchar_t* ou wstring, que você pode usar para construir um novo Platform::String.

O fragmento de código a seguir mostra como converter uma String^ variável de e para uma wstring variável. Para obter mais informações sobre a manipulação de cadeia de caracteres usada neste exemplo, consulte basic_string::replace.

// Create a String^ variable statically or dynamically from a literal string. 
String^ str1 = "AAAAAAAA";

// Use the value of str1 to create the ws1 wstring variable.
std::wstring ws1( str1->Data() ); 
// The value of ws1 is L"AAAAAAAA".

// Manipulate the wstring value.
std::wstring replacement( L"BBB" );
ws1 = ws1.replace ( 1, 3, replacement );
// The value of ws1 is L"ABBBAAAA".

// Assign the modified wstring back to str1. 
str1 = ref new String( ws1.c_str() ); 

Comprimento da cadeia de caracteres e valores NULL incorporados

O String::Length retorna o número de caracteres na cadeia de caracteres, não o número de bytes. O caractere NULL de encerramento não é contado, a menos que você o especifique explicitamente quando usar semântica de pilha para construir uma cadeia de caracteres.

A Platform::String pode conter valores NULL incorporados, mas somente quando o NULL é resultado de uma operação de concatenação. NULLs incorporados não são suportados em literais de cadeia de caracteres; portanto, você não pode usar NULLs incorporados dessa maneira para inicializar um Platform::Stringarquivo . Os valores NULL incorporados em um Platform::String são ignorados quando a cadeia de caracteres é exibida, por exemplo, quando é atribuída a uma TextBlock::Text propriedade. NULLs incorporados são removidos quando o valor da cadeia de caracteres é retornado pela Data propriedade.

StringReference

Em alguns casos, seu código (a) recebe um std::wstring, ou wchar_t string ou L"" string literal e apenas o passa para outro método que usa um String^ como parâmetro de entrada. Contanto que o buffer de cadeia de caracteres original em si permaneça válido e não mude antes que a função retorne, você pode converter a wchar_t* cadeia de caracteres ou literal de cadeia de caracteres em um Platform::StringReference e passar isso em vez de um Platform::String^. Isso é permitido porque StringReference tem uma conversão definida pelo usuário para Platform::String^. Ao usar, StringReference você pode evitar fazer uma cópia extra dos dados da cadeia de caracteres. Em loops em que você está passando um grande número de strings, ou ao passar strings muito grandes, você pode potencialmente obter uma melhoria significativa de desempenho usando StringReference. Mas como StringReference essencialmente empresta o buffer de cadeia de caracteres original, você deve usar extremo cuidado para evitar corrupção de memória. Você não deve passar um StringReference para um método assíncrono, a menos que a cadeia de caracteres original tenha a garantia de estar no escopo quando esse método retornar. Um String^ inicializado a partir de um StringReference forçará uma alocação e cópia dos dados da cadeia de caracteres se ocorrer uma segunda operação de atribuição. Neste caso, você perderá o benefício de desempenho do StringReference.

Observe que StringReference é um tipo de classe C++ padrão, não uma classe ref, você não pode usá-lo na interface pública de classes ref que você definir.

O exemplo a seguir mostra como usar StringReference:

void GetDecodedStrings(std::vector<std::wstring> strings)
{
    using namespace Windows::Security::Cryptography;
    using namespace Windows::Storage::Streams;

    for (auto&& s : strings)
    {
        // Method signature is IBuffer^ CryptographicBuffer::DecodeFromBase64String (Platform::String^)
        // Call using StringReference:
        IBuffer^ buffer = CryptographicBuffer::DecodeFromBase64String(StringReference(s.c_str()));

        //...do something with buffer
    }
}