Ř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
}
}