Иллюстрированный самоучитель по Architecture .NET

Класс System::string (Система::Строка)

Результат работы программы приведен ниже. Заметьте, что метод ToString можно вызывать явно как аргумент перегруженного метода WriteLine объекта String (Строка), а можно вызвать перегруженный метод WriteLine объекта String (Строка), который сам вызовет метод ToString. Заметьте также, что даже управляемый массив (который, на самом деле, является управляемым типом) поддерживает метод ToString.

3
3
SomeClass – override SomeClass – override ClassNoToString
ClassNoToString System.Int32[] System.Int32[]

Все идентичные строковые литералы типа String (Строка) автоматически представляются указателями на объекты, являющиеся экземплярами одного класса String (Строка). Это справедливо для объектов, представленных строковыми литералами типа string (Строка), – такие объекты задаются с помощью взятой в кавычки строки. Однако это не справедливо для строковых объектов String (Строка), явно создаваемых с помощью оператора new (создать). Следующий пример подтверждает это. В нем сравниваются два указателя на объект String (Строка), созданных с помощью оператора new (создать).

Выведенные на консоль результаты подтверждают, что два идентичных строковых объекта string (Строка), определенных как взятые в кавычки одинаковые последовательности символов, являются одним и тем же объектом (выражение pstr1==pstr2 истинно для строковых объектов String (Строка)). С другой стороны, два одинаковых строковых объекта string (Строка), созданных с помощью оператора new (создать), являются на самом деле разными объектами (выражение pstrl==pstr2 имеет значение false (ложь)).

//StringLiteral.срр
#using <mscorlib.dll>
using namespace System;
// использовать пространство имен Система;
void main(void) {
String *pstrl; // Строка
String *pstr2; // Строка
// сравнение объектов – строковых литералов типа String
pstr1 = S"hello"; // привет
pstr2 = S"hello"; // привет
if (pstrl › Equals(pstr2)) // если (pstrl › Равняется (pstr2))
Console::WriteLine("equal"); // равны – выполнен else
Console::WriteLine("not equal"); // не равны – не выполнен
 if (pstrl==pstr2) // если (pstrl == pstr2)
Console::WriteLine("equal"); // равны – выполнен else
Console::WriteLine("not equal"); // не равны – не выполнен
// сравнение новых объектов String (не литералов)
pstr1 = new String("hello"); // pstr1 = новая Строка ("привет");
pstr2 = new String("hello"); // pstr2 = новая Строка ("привет");
if (pstrl › Equals(pstr2)) // если (pstrl › Равняется (pstr2))
Console::WriteLine("equal"); // равны – выполнен else
Console::WriteLine("not equal"); // не равны – не выполнен
if (pstrl==pstr2) // если (pstrl == pstr2)
Console::WriteLine("equal"); // равны – не выполнен else
Console::WriteLine("not equal"); // не равны – выполнен }

Программа напечатает:

equal equal equal not equal

Вот перевод [Добавлен редактором русского перевода. – Прим. ред.]:

равны
равны
равны
не равны

Управляемые строковые литералы String (Строка) и неуправляемые строковые литералы ASCII и Unicode (благодаря автоматической упаковке) можно использовать в выражениях, в которых ожидается использование управляемого строкового объекта String (Строка). Однако управляемый строковый объект String (Строка) нельзя использовать там, где ожидается появление переменных неуправляемых типов. Следующий пример доказывает это. Обратите внимание на закомментированные строки. Не будучи закомментированными, они привели бы к сообщению об ошибке при компиляции.

//MixingStringTypes.срр
fusing <rascorlib.dll>
using namespace System;
// использовать пространство имен Система;
tinclude <wchar.h> // для wchar_t
void ExpectingManagedString(String *str){} // Строка *str void ExpectingASCII
String(char *str){} // символ *str void ExpectingUnicode
String(wchar_t *str){} void main(void) {
// ожидается управляемый тип
ExpectingManagedString(S"hello"); // полное соответствие
// привет ExpectingManagedString("hello"); // нет ошибки
// привет
ExpectingManagedString(L"hello"); // нет ошибки
// привет
// ожидается неуправляемый тип
ExpectingASCIIString("hello"); // полное соответствие
// привет //ExpectingASCIIString(S"hello"); // ошибка!
// привет ExpectingUnicodeString(L"hello"); // полное соответствие
// привет //ExpectingUnicodeString(S"hello"); // ошибка!
// привет }
Если Вы заметили ошибку, выделите, пожалуйста, необходимый текст и нажмите CTRL + Enter, чтобы сообщить об этом редактору.