Aracılığıyla paylaş


Dizeler (C++/CX)

Windows Çalışma Zamanı içindeki metin, Platform::String Sınıfı tarafından C++/CX biçiminde gösterilir. Platform::String Class Windows Çalışma Zamanı sınıflarındaki yöntemlere dizeleri ileri geri geçirirken veya uygulama ikili arabirimi (ABI) sınırındaki diğer Windows Çalışma Zamanı bileşenleriyle etkileşim kurarken kullanın. çeşitli Platform::String Class yaygın dize işlemleri için yöntemler sağlar, ancak tam özellikli bir dize sınıfı olacak şekilde tasarlanmamıştır. C++ modülünüzde, önemli metin işleme işlemleri için wstring gibi standart C++ dize türlerini kullanın ve genel bir arabirime veya bir ortak arabirimden geçirmeden önce nihai sonucu Platform::String^ olarak dönüştürün. veya wchar_t*Platform::Stringile arasında wstring dönüştürme yapmak kolay ve verimlidir.

Hızlı geçiş

Bazı durumlarda derleyici, temel dize verilerini kopyalamadan güvenli bir şekilde bir Platform::String oluşturabildiğini veya bir işleve geçirebileceğini String doğrulayabilir. Bu tür işlemler hızlı geçiş olarak bilinir ve saydam olarak gerçekleşir.

Dize yapısı

Nesnenin String değeri sabit (salt okunur) bir dizi (16 bit Unicode) karakterdir char16 . Bir String nesne sabit olduğundan, bir değişkene yeni bir dize değişmez değeri atanması String aslında özgün String nesneyi yeni String bir nesneyle değiştirir. Birleştirme işlemleri özgün String nesnenin yok edilmesini ve yeni bir nesnenin oluşturulmasını içerir.

Değişmez Değerler

Değişmez değer karakteri , tek tırnak içine alınmış bir karakterdir ve değişmez değer dizesi de çift tırnak içine alınmış bir karakter dizisidir. String^ değişkenini başlatmak için değişmez değer kullanırsanız, derleyici değişmez değerin karakterlerden char16 oluştuğu varsayılır. Yani, değişmez değerin önüne 'L' dize değiştiricisi almanız veya sabit değeri bir _T() veya METNEÇEVİr() makrosunun içine almanız gerekmez. Unicode için C++ desteği hakkında daha fazla bilgi için bkz . Unicode Programlama Özeti.

Aşağıdaki örnekte nesneleri oluşturmanın String çeşitli yolları gösterilmektedir.

// 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());

Dize işleme işlemleri

sınıfı String dizeleri ve diğer temel dize işlemlerini birleştirmek, karşılaştırmak için yöntemler ve işleçler sağlar. Daha kapsamlı dize işlemeleri gerçekleştirmek için üye işlevini kullanarak String::Data() nesnesinin String^ değerini olarak const wchar_t*alın. Ardından zengin dize işleme işlevleri sağlayan bir std::wstringbaşlatmak için bu değeri kullanın.


 // 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];

Dize dönüştürmeleri

A Platform::String yalnızca char16 karakter veya NULL karakter içerebilir. Uygulamanızın 8 bit karakterlerle çalışması gerekiyorsa, metni olarak const wchar_t*ayıklamak için String::D ata kullanın. Ardından uygun Windows işlevlerini veya Standart Kitaplık işlevlerini kullanarak veriler üzerinde çalışabilir ve yeni bir Platform::Stringoluşturmak için kullanabileceğiniz veya wchar_t*wstring'e dönüştürebilirsiniz.

Aşağıdaki kod parçası, bir değişkenin değişkene ve değişkenden String^wstring nasıl dönüştürüldüğünü gösterir. Bu örnekte kullanılan dize işleme hakkında daha fazla bilgi için bkz . 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() ); 

Dize uzunluğu ve eklenmiş NULL değerleri

String::Length, bayt sayısını değil dizedeki karakter sayısını döndürür. Bir dize oluşturmak için yığın semantiği kullandığınızda bunu açıkça belirtmediğiniz sürece sonlandırıcı NULL karakter sayılmaz.

, Platform::String katıştırılmış NULL değerleri içerebilir, ancak yalnızca NULL birleştirme işleminin sonucu olduğunda. Eklenmiş NUL'ler dize değişmez değerlerinde desteklenmez; bu nedenle, bir Platform::Stringbaşlatmak için eklenmiş DLL'leri bu şekilde kullanamazsınız. dize görüntülendiğinde, örneğin bir TextBlock::Text özelliğe atandığında, içindeki Platform::String eklenmiş NULL değerleri yoksayılır. Ekli NUL'ler, dize değeri özelliği tarafından Data döndürülürken kaldırılır.

StringReference

Bazı durumlarda kodunuz (a) bir std::wstring veya wchar_t dize veya L"" dize değişmez değerini alır ve bunu yalnızca giriş parametresi olarak String^ alan başka bir yönteme geçirir. Özgün dize arabelleğinin kendisi geçerli kaldığı ve işlev döndürmeden önce sessize alınmadığı sürece, dizeyi veya dize değişmez değerini Platform::StringReference'a dönüştürebilir wchar_t* ve bunu yerine Platform::String^geçirebilirsiniz. kullanıcı tanımlı bir dönüştürmeye Platform::String^sahip olduğundan StringReference buna izin verilir. kullanarak StringReference , dize verilerinin ek bir kopyasını oluşturmaktan kaçınabilirsiniz. Çok sayıda dize geçirdiğiniz döngülerde veya çok büyük dizeler geçirirken kullanarak önemli bir performans geliştirmesi StringReferenceelde edebilirsiniz. StringReference Ancak temelde özgün dize arabelleği ödünç olduğundan, bellek bozulmasını önlemek için aşırı dikkatli olmanız gerekir. Özgün dizenin bu yöntem döndürdüğünde kapsam içinde olacağı garanti edilmediği sürece zaman uyumsuz bir yönteme geçirmemelisiniz StringReference . StringReference'tan başlatılan String^ ikinci bir atama işlemi gerçekleşirse dize verilerinin ayırmasını ve kopyasını zorlar. Bu durumda, 'nin performans avantajını StringReferencekaybedersiniz.

StringReference Ref sınıfı değil standart bir C++ sınıf türü olduğunu, bunu tanımladığınız başvuru sınıflarının genel arabiriminde kullanamayacağınızı unutmayın.

Aşağıdaki örnekte StringReference'ın nasıl kullanılacağı gösterilmektedir:

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