Sdílet prostřednictvím


Řetězce (C++/CX)

Text v prostředí Windows Runtime je reprezentován v jazyce C++/CX třídou Platform::String. Platform::String Class Použijte, když předáte řetězce zpět metodám v prostředí Windows Runtime třídách nebo při interakci s jinými prostředí Windows Runtime komponentami v rámci binárního rozhraní aplikace (ABI). Poskytuje Platform::String Class metody pro několik běžných operací řetězců, ale není navržena jako plnohodnotná třída řetězců. V modulu C++ použijte standardní typy řetězců C++, jako je například wstring pro jakékoli významné zpracování textu, a pak před předáním do nebo z veřejného rozhraní převeďte konečný výsledek na Platform::String^ . Je snadné a efektivní převádět mezi wstring nebo wchar_t* a Platform::String.

Rychlý průchod

V některých případech může kompilátor ověřit, že může bezpečně sestavit Platform::String funkci nebo předat String funkci bez kopírování podkladových řetězcových dat. Tyto operace se označují jako rychlé průchody a dochází k nim transparentně.

Konstrukce řetězců

Hodnota objektu String je neměnná sekvence char16 (jen pro čtení) znaků (16bitové unicode). Vzhledem k tomu, že String objekt je neměnný, přiřazení nového řetězcového literálu proměnné String ve skutečnosti nahradí původní String objekt novým String objektem. Operace zřetězení zahrnují zničení původního String objektu a vytvoření nového objektu.

Literály

Literální znak je znak uzavřený v jednoduchých uvozovkách a literálový řetězec je posloupnost znaků uzavřených v uvozovkách. Pokud k inicializaci proměnné String^ použijete literál, kompilátor předpokládá, že literál se skládá ze char16 znaků. To znamená, že nemusíte před literálem zacházet modifikátorem řetězce "L" nebo uzavřít literál do makra _T() nebo TEXT(). Další informace o podpoře jazyka C++ pro Unicode naleznete v tématu Souhrn programování unicode.

Následující příklad ukazuje různé způsoby vytváření String objektů.

// 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());

Operace zpracování řetězců

Třída String poskytuje metody a operátory pro zřetězení, porovnávání řetězců a další základní řetězcové operace. Chcete-li provádět rozsáhlejší manipulaci s řetězci, použijte String::Data() členské funkce k načtení hodnoty objektu String^ jako .const wchar_t* Pak tuto hodnotu použijte k inicializaci std::wstring, která poskytuje bohaté funkce zpracování řetězců.


 // 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];

Převody řetězců

A Platform::String může obsahovat pouze char16 znaky nebo NULL znak. Pokud aplikace musí pracovat s 8bitovými znaky, použijte řetězec::D ata k extrahování textu jako znaku const wchar_t*. Potom můžete použít příslušné funkce systému Windows nebo funkce standardní knihovny k práci s daty a převést je zpět na wchar_t* řetězec nebo wstring, který můžete použít k vytvoření nového Platform::String.

Následující fragment kódu ukazuje, jak převést proměnnou String^ na proměnnou wstring a z proměnné. Další informace o manipulaci s řetězci, která se používá v tomto příkladu, najdete v tématu 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() ); 

Délka řetězce a vložené hodnoty NULL

Řetězec ::Length vrátí počet znaků v řetězci, nikoli počet bajtů. Ukončující znak NULL není počítán, pokud ho explicitně nezadáte při použití sémantiky zásobníku k vytvoření řetězce.

Hodnota A Platform::String může obsahovat vložené hodnoty NULL, ale pouze v případě, že hodnota NULL je výsledkem operace zřetězení. Vložené seznamy NUL nejsou podporovány v řetězcových literálech; proto nelze použít vložené NULly tímto způsobem k inicializaci Platform::String. Vložené hodnoty NULL v objektu se Platform::String při zobrazení řetězce ignorují, například při přiřazení k TextBlock::Text vlastnosti. Vložené hodnoty NUL se odeberou, když je řetězcová hodnota vrácena Data vlastností.

StringReference

V některých případech váš kód (a) obdrží řetězec std::wstring, nebo wchar_t řetězcový literál nebo L", a právě ho předá jiné metodě, která přebírá String^ jako vstupní parametr. Dokud původní vyrovnávací paměť řetězce sama zůstane platná a neztlumí před vrácením funkce, můžete převést wchar_t* řetězec nebo řetězcový literál na Platform::StringReference a předat ho Platform::String^místo . To je povoleno, protože StringReference má uživatelem definovaný převod na Platform::String^. StringReference Použitím tohoto nástroje se můžete vyhnout vytvoření dodatečné kopie řetězcových dat. Ve smyčce, ve kterých předáváte velký počet řetězců nebo při předávání velmi velkých řetězců, můžete potenciálně dosáhnout významného zlepšení výkonu pomocí StringReference. Protože si StringReference ale v podstatě půjčí původní vyrovnávací paměť řetězce, musíte použít extrémní péči, abyste se vyhnuli poškození paměti. Neměli byste předávat StringReference asynchronní metodě, pokud není zaručeno, že původní řetězec bude v oboru, když tato metoda vrátí. Řetězec^ inicializovaný z StringReference vynutí přidělení a kopii řetězcových dat, pokud dojde k druhé operaci přiřazení. V tomto případě ztratíte výhodu výkonu StringReference.

Všimněte si, že StringReference jde o standardní typ třídy C++, nikoli třídu ref, nemůžete ji použít ve veřejném rozhraní tříd ref, které definujete.

Následující příklad ukazuje, jak používat 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
    }
}