Я наткнулся на "CorruptedString" (решение). Ниже приведен код программы из книги:
var s = "Hello";
string.Intern(s);
unsafe
{
fixed (char* c = s)
for (int i = 0; i < s.Length; i++)
c[i] = 'a';
}
Console.WriteLine("Hello"); // Displays: "aaaaa"
Почему в этой программе отображается "aaaaa"? Я понимаю эту программу следующим образом:
- CLR резервирует "привет" в стаже пула (я изображаю пул-пул как набор строк).
-
string.Intern(s)
фактически ничего не делает, потому что CLR зарезервировал строку "Hello" - он просто возвращает адрес зарезервированной строки "Hello" (объект s имеет тот же адрес) - Программа изменяет содержимое строки "Hello" с помощью указателя
- ??? Строка Hello должна отсутствовать в первом пуле, и это должно быть ошибкой! Но все в порядке; программа выполняется успешно.
Как я понимаю, пул-пул, это как какой-то словарь строки для строки. Или, может быть, я что-то пропустил?