Есть ли в CLR интернирование строковых констант? - PullRequest
0 голосов
/ 13 февраля 2019

В последнее время я читал о том, как работает внутренний пул строк.Однако я не смог найти ответ на этот вопрос.

Если я объявлю постоянную строковую переменную, такую ​​как const string STR = "foo";, это также будет добавлено в таблицу интернов?

Ответы [ 2 ]

0 голосов
/ 13 февраля 2019

Вы можете узнать:

const string STR = "foo";

string internedFoo = String.IsInterned("foo");    
if (internedFoo != null)  // yes it is !

Ответ будет положительным в любой версии платформы, которую вы можете найти, но это зависит от реализации.И существует скрытая настройка для отключения интернирования.

0 голосов
/ 13 февраля 2019

Просто чтобы прояснить ситуацию ... CLR не участвует в интернировании строк.Interning - это концепция времени компиляции, а R в CLR - среда выполнения.

Кроме того, строковые переменные не интернированы.Строка литералы интернированы.Строковый литерал - это материал справа, например

var variable = "This is a literal.";

Когда компилятор замечает, что в вашем коде есть строковый литерал, он должен добавить его в таблицу ресурсов, встроенную в вашу сборку.Когда он добавляет его, он проверяет, существует ли он, и если он делает, он просто использует существующую запись.После завершения компиляции вся таблица отправляется в сборку, где она может быть прочитана вашим кодом во время выполнения.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...