У меня есть ситуация, когда я буду сталкиваться со множеством повторяющихся строк, которые будут сохраняться в памяти в течение длительного времени. Я хочу использовать String.Intern
, но я не хочу вторгаться в какие-либо потенциальные ресурсы приложения, так как мой проект является библиотекой. Как это работает?
Создает ли .NET сетевой пул строк для каждой сборки?
Ответ 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.