Sobes.tech
Back to questions
Middle+
5

Задача со строками: что будет выведено? Как перегружен оператор == для строк? Что такое пул интернирования строк?

Companies where asked
Core outstaff

Answer from AI

sobes.tech AI

В C# оператор == для строк перегружен так, что сравнивается не ссылка на объект, а содержимое строк — их последовательность символов. Это значит, что две разные строковые переменные с одинаковым текстом при сравнении через == вернут true.

Пул интернирования строк — это специальное хранилище в памяти, где хранятся уникальные экземпляры строковых литералов. Когда создаётся строка литералом, CLR проверяет пул: если такая строка уже есть, возвращается ссылка на неё, иначе строка добавляется в пул. Это позволяет экономить память и ускорять сравнения строк, так как одинаковые литералы ссылаются на один объект.

Пример:

string a = "hello";
string b = "hello";
string c = new string(new char[] {'h','e','l','l','o'});

Console.WriteLine(a == b); // True, содержимое одинаковое
Console.WriteLine(object.ReferenceEquals(a, b)); // True, обе ссылаются на пул
Console.WriteLine(a == c); // True, содержимое одинаковое
Console.WriteLine(object.ReferenceEquals(a, c)); // False, c создана явно, не из пула

Таким образом, оператор == сравнивает содержимое строк, а пул интернирования обеспечивает переиспользование одинаковых строковых литералов.