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