Notitie
Voor toegang tot deze pagina is autorisatie vereist. U kunt proberen u aan te melden of de directory te wijzigen.
Voor toegang tot deze pagina is autorisatie vereist. U kunt proberen de mappen te wijzigen.
Tekst in de Windows Runtime wordt weergegeven in C++/CX door de klasse Platform::String. Gebruik het Platform::String Class moment waarop u tekenreeksen heen en weer doorgeeft aan methoden in Windows Runtime-klassen of wanneer u communiceert met andere Windows Runtime-onderdelen over de grenzen van de binaire interface (ABI) van de toepassing. De Platform::String Class biedt methoden voor verschillende algemene tekenreeksbewerkingen, maar is niet ontworpen als een volledige tekenreeksklasse. Gebruik in uw C++-module standaard tekenreekstypen van C++ zoals wstring voor elke significante tekstverwerking en converteer het uiteindelijke resultaat vervolgens naar Platform::String^ voordat u deze doorgeeft aan of van een openbare interface. Het is eenvoudig en efficiënt om te converteren tussen wstring of wchar_t* en Platform::String.
Snelle pas
In sommige gevallen kan de compiler controleren of deze een Platform::String functie veilig kan samenstellen of doorgeven String aan een functie zonder de onderliggende tekenreeksgegevens te kopiëren. Dergelijke bewerkingen worden snel pass genoemd en ze worden transparant uitgevoerd.
Tekenreeksconstructie
De waarde van een String object is een onveranderbare reeks (alleen-lezen) tekens char16 (16-bits Unicode). Omdat een String object onveranderbaar is, vervangt de toewijzing van een nieuwe tekenreeks letterlijk aan een String variabele het oorspronkelijke String object door een nieuw String object. Samenvoegingsbewerkingen omvatten de vernietiging van het oorspronkelijke String object en het maken van een nieuw object.
Literalen
Een letterlijk teken is een teken dat tussen enkele aanhalingstekens staat en een letterlijke tekenreeks een reeks tekens is die tussen dubbele aanhalingstekens staat. Als u een letterlijke variabele gebruikt om een string^-variabele te initialiseren, gaat de compiler ervan uit dat de letterlijke tekst uit tekens bestaat char16 . Dat wil gezegd, u hoeft niet vooraf te gaan aan de letterlijke waarde met de tekenreeksaanpassing L of de letterlijke waarde in een macro _T() of TEKST(). Zie Unicode Programming Summary voor meer informatie over C++-ondersteuning voor Unicode.
In het volgende voorbeeld ziet u verschillende manieren om objecten te maken String .
// 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());
Bewerkingen voor het verwerken van tekenreeksen
De String klasse biedt methoden en operators voor het samenvoegen, vergelijken van tekenreeksen en andere eenvoudige tekenreeksbewerkingen. Als u uitgebreidere tekenreeksbewerkingen wilt uitvoeren, gebruikt u de String::Data() lidfunctie om de waarde van het String^ object op te halen als een const wchar_t*. Gebruik die waarde vervolgens om een std::wstring, die uitgebreide tekenreeksverwerkingsfuncties biedt, te initialiseren.
// 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];
Tekenreeksconversies
A Platform::String kan alleen char16 tekens of het NULL teken bevatten. Als uw toepassing moet werken met 8-bits tekens, gebruikt u de tekenreeks::D ata om de tekst te extraheren als een const wchar_t*. Vervolgens kunt u de juiste Windows-functies of Standard-bibliotheekfuncties gebruiken om de gegevens te gebruiken en deze weer te converteren naar een wchar_t* of wstring, die u kunt gebruiken om een nieuwe Platform::Stringte maken.
In het volgende codefragment ziet u hoe u een String^ variabele converteert naar en van een wstring variabele. Zie basic_string::replace voor meer informatie over de tekenreeksbewerking die in dit voorbeeld wordt gebruikt.
// 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() );
Tekenreekslengte en ingesloten NULL-waarden
De tekenreeks::Lengte retourneert het aantal tekens in de tekenreeks, niet het aantal bytes. Het afsluitende NULL-teken wordt niet geteld, tenzij u het expliciet opgeeft wanneer u stack-semantiek gebruikt om een tekenreeks te maken.
Een Platform::String kan ingesloten NULL-waarden bevatten, maar alleen wanneer de NULL het resultaat is van een samenvoegbewerking. Ingesloten NULL's worden niet ondersteund in letterlijke tekenreeksen; Daarom kunt u geen ingesloten NULL's op die manier gebruiken om een Platform::String. Ingesloten NULL-waarden in een Platform::String worden genegeerd wanneer de tekenreeks wordt weergegeven, bijvoorbeeld wanneer deze wordt toegewezen aan een TextBlock::Text eigenschap. Ingesloten NULL's worden verwijderd wanneer de tekenreekswaarde wordt geretourneerd door de Data eigenschap.
StringReference
In sommige gevallen ontvangt uw code (a) een std::wstring of wchar_t letterlijke tekenreeks of L-tekenreeks en geeft deze door aan een andere methode die een tekenreeks^ als invoerparameter gebruikt. Zolang de oorspronkelijke tekenreeksbuffer zelf geldig blijft en niet muteert voordat de functie wordt geretourneerd, kunt u de wchar_t* tekenreeks of tekenreeks letterlijk converteren naar een Platform::StringReference en deze doorgeven in plaats van een Platform::String^. Dit is toegestaan omdat StringReference een door de gebruiker gedefinieerde conversie naar Platform::String^. Door te gebruiken StringReference kunt u voorkomen dat u een extra kopie van de tekenreeksgegevens maakt. In lussen waarbij u grote aantallen tekenreeksen doorgeeft of wanneer u zeer grote tekenreeksen doorgeeft, kunt u mogelijk een aanzienlijke prestatieverbetering bereiken met behulp van StringReference. Maar omdat StringReference de oorspronkelijke tekenreeksbuffer in wezen wordt geleend, moet u extreme zorg gebruiken om beschadiging van het geheugen te voorkomen. Geef een asynchrone StringReference methode niet door aan een asynchrone methode, tenzij de oorspronkelijke tekenreeks gegarandeerd binnen het bereik valt wanneer die methode wordt geretourneerd. Een tekenreeks^ die wordt geïnitialiseerd vanuit een StringReference dwingt een toewijzing en kopie van de tekenreeksgegevens af als er een tweede toewijzingsbewerking plaatsvindt. In dit geval verliest u het prestatievoordeel van StringReference.
Houd er rekening mee dat StringReference dit een standaard C++-klassetype is, niet een verwijzingsklasse, u kunt deze niet gebruiken in de openbare interface van verw-klassen die u definieert.
In het volgende voorbeeld ziet u hoe u StringReference gebruikt:
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
}
}