String (C++/CX)
Teks dalam Windows Runtime diwakili dalam C++/CX oleh Platform::Kelas String. Platform::String Class
Gunakan saat Anda meneruskan string bolak-balik ke metode di kelas Windows Runtime, atau ketika Anda berinteraksi dengan komponen Windows Runtime lainnya di seluruh batas antarmuka biner aplikasi (ABI). menyediakan Platform::String Class
metode untuk beberapa operasi string umum, tetapi tidak dirancang untuk menjadi kelas string berfungsi lengkap. Dalam modul C++ Anda, gunakan jenis string C++ standar seperti wstring untuk pemrosesan teks yang signifikan, lalu konversikan hasil akhir menjadi Platform::String^ sebelum Anda meneruskannya ke atau dari antarmuka publik. Mudah dan efisien untuk mengonversi antara wstring
atau wchar_t*
dan Platform::String
.
Pass cepat
Dalam beberapa kasus, pengkompilasi dapat memverifikasi bahwa pengkompilasi dapat dengan aman membuat Platform::String
atau meneruskan String
ke fungsi tanpa menyalin data string yang mendasar. Operasi tersebut dikenal sebagai pass cepat dan terjadi secara transparan.
Konstruksi string
Nilai String
objek adalah urutan yang tidak dapat diubah (baca-saja) dari char16
karakter (Unicode 16-bit). String
Karena objek tidak dapat diubah, penetapan string baru harfiah ke String
variabel benar-benar mengganti objek asli String
dengan objek baruString
. Operasi penggalian melibatkan penghancuran objek asli String
dan pembuatan objek baru.
Literal
Karakter harfiah adalah karakter yang diapit dalam tanda kutip tunggal, dan string harfiah adalah urutan karakter yang diapit dalam tanda kutip ganda. Jika Anda menggunakan literal untuk menginisialisasi variabel String^, pengkompilasi mengasumsikan bahwa literal terdiri dari char16
karakter. Artinya, Anda tidak perlu mendahului literal dengan pengubah string 'L' atau mengapit literal dalam makro _T() atau TEXT(). Untuk informasi selengkapnya tentang dukungan C++ untuk Unicode, lihat Ringkasan Pemrograman Unicode.
Contoh berikut menunjukkan berbagai cara untuk membuat String
objek.
// 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());
Operasi penanganan string
Kelas ini String
menyediakan metode dan operator untuk menggabungkan, membandingkan string, dan operasi string dasar lainnya. Untuk melakukan manipulasi string yang lebih luas, gunakan String::Data()
fungsi anggota untuk mengambil nilai String^
objek sebagai const wchar_t*
. Kemudian gunakan nilai tersebut untuk menginisialisasi std::wstring
, yang menyediakan fungsi penanganan string yang kaya.
// 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];
Konversi string
Hanya Platform::String
boleh berisi char16
karakter, atau NULL
karakter. Jika aplikasi Anda harus bekerja dengan karakter 8-bit, gunakan String::D ata untuk mengekstrak teks sebagai const wchar_t*
. Anda kemudian dapat menggunakan fungsi Windows yang sesuai atau fungsi Pustaka Standar untuk beroperasi pada data dan mengonversinya kembali ke wchar_t*
atau wstring, yang dapat Anda gunakan untuk membangun baru Platform::String
.
Fragmen kode berikut menunjukkan cara mengonversi String^
variabel ke dan dari wstring
variabel. Untuk informasi selengkapnya tentang manipulasi string yang digunakan dalam contoh ini, lihat 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() );
Panjang string dan nilai NULL yang disematkan
String::Length mengembalikan jumlah karakter dalam string, bukan jumlah byte. Karakter NULL yang mengakhiri tidak dihitung kecuali Anda secara eksplisit menentukannya saat Anda menggunakan semantik tumpukan untuk membuat string.
Platform::String
dapat berisi nilai NULL yang disematkan, tetapi hanya ketika NULL adalah hasil dari operasi perangkaian. NULL yang disematkan tidak didukung dalam literal string; oleh karena itu, Anda tidak dapat menggunakan NULL yang disematkan dengan cara itu untuk menginisialisasi Platform::String
. Nilai NULL yang disematkan dalam Platform::String
diabaikan saat string ditampilkan, misalnya, ketika ditetapkan ke TextBlock::Text
properti. NULL yang disematkan dihapus saat nilai string dikembalikan oleh Data
properti .
StringReference
Dalam beberapa kasus, kode Anda (a) menerima string std::wstring, atau wchar_t string atau L"" secara harfiah dan hanya meneruskannya ke metode lain yang mengambil String^ sebagai parameter input. Selama buffer string asli itu sendiri tetap valid dan tidak bermutasi sebelum fungsi kembali, Anda dapat mengonversi wchar_t*
string atau string literal ke Platform::StringReference, dan meneruskan itu alih-alih Platform::String^
. Ini diizinkan karena StringReference
memiliki konversi yang ditentukan pengguna ke Platform::String^
. Dengan menggunakan StringReference
Anda dapat menghindari pembuatan salinan tambahan data string. Dalam perulangan di mana Anda melewati sejumlah besar string, atau ketika melewati string yang sangat besar, Anda berpotensi mencapai peningkatan performa yang signifikan dengan menggunakan StringReference
. Tetapi karena StringReference
pada dasarnya meminjam buffer string asli, Anda harus menggunakan perawatan ekstrem untuk menghindari kerusakan memori. Anda tidak boleh meneruskan StringReference
ke metode asinkron kecuali string asli dijamin berada dalam cakupan ketika metode tersebut kembali. String^ yang diinisialisasi dari StringReference akan memaksa alokasi dan salinan data string jika operasi penetapan kedua terjadi. Dalam hal ini, Anda akan kehilangan manfaat performa dari StringReference
.
Perhatikan bahwa StringReference
adalah jenis kelas C++ standar, bukan kelas ref, Anda tidak dapat menggunakannya di antarmuka publik kelas ref yang Anda tentukan.
Contoh berikut menunjukkan cara menggunakan 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
}
}