Dize (C++/CLI ve C++/CX)
Windows Çalışma Zamanı ve ortak dil çalışma zamanı, ayrılan belleği otomatik olarak yönetilen nesneler olarak dizeleri temsil eder. Diğer bir deyişle, dize değişkeni kapsam dışına çıktığında veya uygulamanız sona erdiğinde bir dize için belleği açıkça atmanız gerekmez. Dize nesnesinin ömrünün otomatik olarak yönetildiğini belirtmek için, dize türünü tanıtıcıdan nesneye (^) değiştirici ile bildirin.
Windows Çalışma Zamanı
Windows Çalışma Zamanı mimarisi, veri türünün ad alanında Platform
bulunması gerekirString
. Size kolaylık olması için Visual C++, ad alanında default
için Platform::String
bir eş anlamlı olan veri türünü de sağlarstring
.
Sözdizimi
// compile with /ZW
using namespace Platform;
using namespace default;
Platform::String^ MyString1 = "The quick brown fox";
String^ MyString2 = "jumped over the lazy dog.";
String^ MyString3 = "Hello, world!";
Gereksinimler
Derleyici seçeneği: /ZW
Ortak Dil Çalışma Zamanı
ile /clr
derlenirken, derleyici dize değişmez değerlerini türünde Stringdizelere dönüştürür. Mevcut kodla geriye dönük uyumluluğu korumak için bunun iki özel durumu vardır:
Özel durum işleme. Bir dize değişmez değeri oluşturulduğunda, derleyici bunu dize değişmez değeri olarak yakalar.
Şablon kesintisi. Bir dize değişmez değeri şablon bağımsız değişkeni olarak geçirildiğinde, derleyici bunu öğesine Stringdönüştürmez. Genel bağımsız değişken olarak geçirilen dize değişmez değerleri olarak yükseltileceğine Stringdikkat edin.
Derleyici ayrıca, davranışlarını özelleştirmek için geçersiz kılabileceğiniz üç işleç için yerleşik desteğe sahiptir:
System::String^ işleci +( System::String, System::String);
System::String^ işleci +( System::Object, System::String);
System::String^ işleci +( System::String, System::Object);
bir Stringgeçirildiğinde, derleyici gerekirse kutulanır ve nesneyi (ToString ile) dizeyle birleştirir.
Not
Şapka işareti ("^") bildirilen değişkenin C++/CLI yönetilen nesnesinin tanıtıcısı olduğunu gösterir.
Daha fazla bilgi için bkz. Dize ve Karakter Değişmez Değerleri.
Gereksinimler
Derleyici seçeneği: /clr
Örnekler
Aşağıdaki kod örneği, dizeleri birleştirmeyi ve karşılaştırmayı gösterir.
// string_operators.cpp
// compile with: /clr
// In the following code, the caret ("^") indicates that the
// declared variable is a handle to a C++/CLI managed object.
using namespace System;
int main() {
String^ a = gcnew String("abc");
String^ b = "def"; // same as gcnew form
Object^ c = gcnew String("ghi");
char d[100] = "abc";
// variables of System::String returning a System::String
Console::WriteLine(a + b);
Console::WriteLine(a + c);
Console::WriteLine(c + a);
// accessing a character in the string
Console::WriteLine(a[2]);
// concatenation of three System::Strings
Console::WriteLine(a + b + c);
// concatenation of a System::String and string literal
Console::WriteLine(a + "zzz");
// you can append to a System::String^
Console::WriteLine(a + 1);
Console::WriteLine(a + 'a');
Console::WriteLine(a + 3.1);
// test System::String^ for equality
a += b;
Console::WriteLine(a);
a = b;
if (a == b)
Console::WriteLine("a and b are equal");
a = "abc";
if (a != b)
Console::WriteLine("a and b are not equal");
// System:String^ and tracking reference
String^% rstr1 = a;
Console::WriteLine(rstr1);
// testing an empty System::String^
String^ n;
if (n == nullptr)
Console::WriteLine("n is empty");
}
abcdef
abcghi
ghiabc
c
abcdefghi
abczzz
abc1
abc97
abc3.1
abcdef
a and b are equal
a and b are not equal
abc
n is empty
Aşağıdaki örnek, derleyici tarafından sağlanan işleçleri aşırı yükleyebileceğinizi ve derleyicinin türüne göre String bir işlev aşırı yüklemesi bulacağını gösterir.
// string_operators_2.cpp
// compile with: /clr
using namespace System;
// a string^ overload will be favored when calling with a String
void Test_Overload(const char * a) {
Console::WriteLine("const char * a");
}
void Test_Overload(String^ a) {
Console::WriteLine("String^ a");
}
// overload will be called instead of compiler defined operator
String^ operator +(String^ a, String^ b) {
return ("overloaded +(String^ a, String^ b)");
}
// overload will be called instead of compiler defined operator
String^ operator +(Object^ a, String^ b) {
return ("overloaded +(Object^ a, String^ b)");
}
// overload will be called instead of compiler defined operator
String^ operator +(String^ a, Object^ b) {
return ("overloaded +(String^ a, Object^ b)");
}
int main() {
String^ a = gcnew String("abc");
String^ b = "def"; // same as gcnew form
Object^ c = gcnew String("ghi");
char d[100] = "abc";
Console::WriteLine(a + b);
Console::WriteLine(a + c);
Console::WriteLine(c + a);
Test_Overload("hello");
Test_Overload(d);
}
overloaded +(String^ a, String^ b)
overloaded +(String^ a, Object^ b)
overloaded +(Object^ a, String^ b)
String^ a
const char * a
Aşağıdaki örnekte, derleyicinin yerel dizeler ile String dizeler arasında ayrım yaptığı gösterilmektedir.
// string_operators_3.cpp
// compile with: /clr
using namespace System;
int func() {
throw "simple string"; // const char *
};
int func2() {
throw "string" + "string"; // returns System::String
};
template<typename T>
void func3(T t) {
Console::WriteLine(T::typeid);
}
int main() {
try {
func();
}
catch(char * e) {
Console::WriteLine("char *");
}
try {
func2();
}
catch(String^ str) {
Console::WriteLine("String^ str");
}
func3("string"); // const char *
func3("string" + "string"); // returns System::String
}
char *
String^ str
System.SByte*
System.String
Ayrıca bkz.
.NET ve UWP İçin Bileşen Uzantıları
Dize ve Karakter Değişmez Değerleri
/clr (Ortak Dil Çalışma Zamanı Derlemesi)