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::Stringbir 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 /clrderlenirken, 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)