Share via


String (C++/CLI dan C++/CX)

Runtime Windows dan runtime bahasa umum mewakili string sebagai objek yang memorinya dialokasikan dikelola secara otomatis. Artinya, Anda tidak diharuskan untuk secara eksplisit membuang memori untuk string ketika variabel string keluar dari cakupan atau aplikasi Anda berakhir. Untuk menunjukkan bahwa masa pakai objek string akan dikelola secara otomatis, deklarasikan jenis string dengan pengubah handle-to-object (^).

Windows Runtime

Arsitektur Windows Runtime mengharuskan String tipe data berada di Platform namespace layanan. Demi kenyamanan Anda, Visual C++ juga menyediakan string jenis data, yang merupakan sinonim untuk Platform::String, di default namespace layanan.

Sintaks

// 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!";

Persyaratan

Opsi pengkompilasi: /ZW

Runtime Bahasa Umum

Saat mengkompilasi dengan /clr, pengkompilasi akan mengonversi literal string menjadi string jenis String. Untuk mempertahankan kompatibilitas mundur dengan kode yang ada, ada dua pengecualian untuk ini:

  • Penanganan pengecualian. Ketika string harfiah dilemparkan, pengkompilasi akan menangkapnya sebagai string harfiah.

  • Pengurangan templat. Ketika string literal diteruskan sebagai argumen templat, pengkompilasi tidak akan mengonversinya menjadi String. Catatan, literal string yang diteruskan sebagai argumen generik akan dipromosikan ke String.

Pengompilasi juga memiliki dukungan bawaan untuk tiga operator, yang dapat Anda ambil alih untuk menyesuaikan perilaku mereka:

  • System::String^ operator +( System::String, System::String);

  • System::String^ operator +( System::Object, System::String);

  • System::String^ operator +( System::String, System::Object);

Ketika diteruskan String, pengkompilasi akan kotak, jika perlu, dan kemudian menggabungkan objek (dengan ToString) dengan string.

Catatan

Tanda sisipan ("^") menunjukkan bahwa variabel yang dideklarasikan adalah handel ke objek terkelola C++/CLI.

Untuk informasi selengkapnya, lihat String dan Literal Karakter.

Persyaratan

Opsi pengkompilasi: /clr

Contoh

Contoh kode berikut menunjukkan menggabungkan dan membandingkan string.

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

Sampel berikut menunjukkan bahwa Anda dapat membebani operator yang disediakan kompilator secara berlebihan, dan pengkompilasi akan menemukan fungsi yang kelebihan beban berdasarkan jenisnya String .

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

Sampel berikut menunjukkan bahwa pengkompilasi membedakan antara string asli dan String string.

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

Baca juga

Ekstensi Komponen untuk .NET dan UWP
String dan Literal Karakter
/clr (Kompilasi Runtime Bahasa Umum)