Подтвердить что ты не робот

Создает ли .NET сетевой пул строк для каждой сборки?

У меня есть ситуация, когда я буду сталкиваться со множеством повторяющихся строк, которые будут сохраняться в памяти в течение длительного времени. Я хочу использовать String.Intern, но я не хочу вторгаться в какие-либо потенциальные ресурсы приложения, так как мой проект является библиотекой. Как это работает?

4b9b3361

Ответ 1

Внутренняя таблица для строк Область CLR:

Во-первых, память, выделенная для интернированных объектов String, маловероятна освобождаться до тех пор, пока общая среда выполнения CLR не завершится. причина в том, что ссылка CLR на интернированный объект String может сохраняться после вашего приложения или даже вашего домена приложения, завершается.

Таким образом, не только внутренняя таблица не зависит от конкретной сборки, но и может пережить вашу сборку. Хорошей новостью является то, что дублированные строки не будут проблемой, поскольку такие же литературные строки существуют с одной и той же ссылкой после интернирования. Рекомендуется Intern ing:

Общая среда выполнения в режиме реального времени сохраняет хранилище строк, поддерживая table, называемый междоменным пулом, который содержит единственную ссылку на каждая уникальная литеральная строка, объявленная или созданная программно в вашей программы. Следовательно, экземпляр литеральной строки с конкретное значение существует только один раз в системе.

string s1 = "MyTest"; 
string s2 = new StringBuilder().Append("My").Append("Test").ToString(); 
string s3 = String.Intern(s2); 
Console.WriteLine((Object)s2==(Object)s1); // Different references.
Console.WriteLine((Object)s3==(Object)s1); // The same reference.