Megjegyzés
Az oldalhoz való hozzáféréshez engedély szükséges. Megpróbálhat bejelentkezni vagy módosítani a címtárat.
Az oldalhoz való hozzáféréshez engedély szükséges. Megpróbálhatja módosítani a címtárat.
A Windows futtatókörnyezetben lévő szöveget a Platform::Sztring osztály C++/CX formátumban jeleníti meg. Ha sztringeket Platform::String Class ad át oda-vissza a Windows futtatókörnyezeti osztályok metódusainak, vagy amikor más Windows-futtatókörnyezeti összetevőkkel kommunikál az alkalmazás bináris interfészének (ABI) határán. A Platform::String Class metódusok számos gyakori sztringművelethez használhatók, de nem teljes értékű sztringosztályként lett kialakítva. A C++ modulban használjon szabványos C++ sztringtípusokat, például a wstringet bármilyen jelentős szövegfeldolgozáshoz, majd alakítsa át a végeredményt Platform::String^ formátumra, mielőtt nyilvános felületre vagy felületről továbbítja azt. Könnyen és hatékonyan konvertálható a kettő között wstring vagy wchar_t*Platform::Stringközött.
Gyors áthaladás
Bizonyos esetekben a fordító ellenőrizheti, hogy képes-e biztonságosan létrehozni vagy Platform::String átadni egy String függvényt a mögöttes sztringadatok másolása nélkül. Az ilyen műveleteket gyors áthaladásnak nevezzük, és transzparensen történnek.
Sztringek felépítése
Az objektum értéke String nem módosítható (írásvédett) (16 bites Unicode) karaktersorozat char16 . Mivel egy String objektum nem módosítható, egy új sztringkonstans változóhoz való String hozzárendelése valójában egy új String objektumra cseréli az eredeti String objektumot. Az összefűzési műveletek magukban foglalják az eredeti String objektum megsemmisítését és egy új objektum létrehozását.
literálok
A literális karakterek egy idézőjelek közé zárt karakterek, a literális sztring pedig kettős idézőjelek közé zárt karakterek sorozata. Ha egy string^ változó inicializálásához literálist használ, a fordító feltételezi, hogy a literál karakterekből áll char16 . Vagyis nem kell megelőznie a literálist az "L" sztringmódosítóval, és nem kell a literálist _T() vagy TEXT() makróba ágyaznia. A Unicode C++ támogatásáról további információt a Unicode programozási összefoglalásában talál.
Az alábbi példa az objektumok létrehozásának String különböző módjait mutatja be.
// 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());
Sztringkezelési műveletek
Az String osztály metódusokat és operátorokat biztosít a sztringek összefűzésével, összehasonlításával és egyéb alapszintű sztringműveletekkel. A sztringek szélesebb körű kezeléséhez használja a String::Data() tag függvényt az objektum const wchar_t*értékének lekéréséhezString^. Ezután ezt az értéket használva inicializálhat egy std::wstring, gazdag sztringkezelési függvényeket biztosító függvényt.
// 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];
Sztringkonvertálások
A karakterek Platform::String csak char16 karaktereket vagy karaktereket NULL tartalmazhatnak. Ha az alkalmazásnak 8 bites karakterekkel kell dolgoznia, a Sztring::D ata használatával bontsa ki a szöveget const wchar_t*. Ezután használhatja a megfelelő Windows-függvényeket vagy standard kódtárfüggvényeket az adatok kezeléséhez, és visszakonvertálja azokat egy wchar_t*vagytöbbre, amellyel létrehozhat egy újat Platform::String.
Az alábbi kódrészlet bemutatja, hogyan konvertálhat változót String^ változókká és változókból wstring . A példában használt sztring-kezelésről további információt a basic_string::replace című témakörben talál.
// 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() );
Karakterlánc hossza és beágyazott NULL értékei
A karakterlánc::A hossz a sztringben szereplő karakterek számát adja vissza, nem pedig a bájtok számát. A végződő NULL karakter csak akkor számít bele, ha explicit módon adja meg, amikor veremszemantikát használ egy sztring létrehozásához.
A Platform::String függvény beágyazott NULL értékeket tartalmazhat, de csak akkor, ha a NULL összefűzési művelet eredménye. A beágyazott NULL-ek sztringkonstansokban nem támogatottak; ezért nem használhat beágyazott NULL-eket ilyen módon egy Platform::String. A beágyazott NULL értékek figyelmen Platform::String kívül lesznek hagyva, amikor a sztring megjelenik, például egy tulajdonsághoz TextBlock::Text rendelve. A beágyazott NULL-ek törlődnek, ha a tulajdonság visszaadja a sztringértéket Data .
StringReference
Bizonyos esetekben a kód (a) egy std::wstring vagy wchar_t sztring vagy L" sztringkonstanst kap, és csak átadja egy másik metódusnak, amely bemeneti paraméterként egy String^ karakterláncot használ. Mindaddig, amíg maga az eredeti sztringpuffer érvényes marad, és nem mutálódik a függvény visszatérése előtt, a sztringet vagy sztringkonstanst platform::StringReference értékre konvertálhatjawchar_t*, és a függvény helyett Platform::String^ezt adja át. Ez azért engedélyezett, mert StringReference a felhasználó által definiált átalakítással rendelkezik.Platform::String^ A használatával StringReference elkerülheti a sztringadatok további másolatának készítését. Olyan hurkokban, ahol nagy számú sztringet ad át, vagy ha nagyon nagy sztringeket ad át, a használatával StringReferencejelentős teljesítménybeli javulást érhet el.
StringReference Mivel azonban lényegében az eredeti sztringpuffert kölcsönkéri, a memória sérülésének elkerülése érdekében rendkívül körültekintően kell elkényeztetnie magát. Csak akkor adjon át aszinkron metódusnak, StringReference ha az eredeti sztring biztosan hatókörben van a metódus visszatérésekor. A StringReference-ből inicializált String^ függvény kényszeríti a sztringadatok lefoglalását és másolatát, ha egy második hozzárendelési művelet történik. Ebben az esetben elveszíti a teljesítmény előnyeit StringReference.
Vegye figyelembe, hogy StringReference ez egy standard C++ osztálytípus, nem pedig ref osztály, nem használható az Ön által definiált ref-osztályok nyilvános felületén.
Az alábbi példa a StringReference használatát mutatja be:
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
}
}