Megosztás a következőn keresztül:


Sztring (C++/CLI és C++/CX)

A Windows futtatókörnyezet és a közös nyelvi futtatókörnyezet sztringeket jelöl olyan objektumokként, amelyek lefoglalt memóriáját automatikusan kezeli a rendszer. Vagyis nem kell explicit módon elvetnie a sztring memóriáját, ha a sztringváltozó kiesik a hatókörből, vagy az alkalmazás véget ér. Ha azt szeretné jelezni, hogy egy sztringobjektum élettartama automatikusan kezelhető, deklarálja a sztringtípust a leíró-objektum (^) módosítóval.

Windows-futtatókörnyezet

A Windows futtatókörnyezet architektúrájához az String adattípusnak a Platform névtérben kell lennie. Az Ön kényelme érdekében a Visual C++ a string névtér szinonimájaként Platform::Stringdefault szolgáló adattípust is biztosítja.

Szemantika

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

Követelmények

Fordítási lehetőség: /ZW

Common Language Runtime (Közös Nyelvi Futásidő)

A fordításkor /clra fordító a sztringkonstansokat típussztringekké Stringalakítja. A meglévő kóddal való visszamenőleges kompatibilitás megőrzése érdekében ez alól két kivétel van:

  • Kivételkezelés. A sztringkonstans eldobásakor a fordító sztringkonstansként fogja fel.

  • Sablonlevonás. Ha egy sztringkonstanst sablonargumentumként ad át, a fordító nem konvertálja azt String. Vegye figyelembe, hogy az általános argumentumként átadott sztringkonstansok elő lesznek léptetve a következőre String: .

A fordító emellett három operátor beépített támogatását is támogatja, amelyeket felülbírálhat a viselkedésük testreszabásához:

  • System::String^ operátor +( System::String, System::String);

  • System::String^ operátor +( System::Object, System::String);

  • System::String^ operátor +( System::String, System::Object);

Ha átad egy parancsot String, a fordító szükség esetén be lesz jelölve, majd összefűzi az objektumot (ToStringgel) a sztringgel.

Megjegyzés:

A caret ("^") azt jelzi, hogy a deklarált változó egy C++/CLI által felügyelt objektum leírója.

További információ: Sztring és karakterkonstansok.

Követelmények

Fordítási lehetőség: /clr

Példák

Az alábbi példakód a sztringek összefűzését és összehasonlítását mutatja be.

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

Az alábbi minta azt mutatja, hogy túlterhelheti a fordító által biztosított operátorokat, és hogy a fordító a típus alapján String túlterhelt függvényt fog találni.

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

Az alábbi minta azt mutatja, hogy a fordító megkülönbözteti a natív sztringeket és String a sztringeket.

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

Lásd még

Komponensbővítmények .NET-hez és UWP-hez
Sztring és karakterkonstansok
/clr (Common Language Runtime Compilation)