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::String
ile 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::wstring
baş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::String
oluş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::String
baş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 StringReference
elde 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ı StringReference
kaybedersiniz.
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
}
}