Pull to refresh

Comments 16

Работа проделана безусловно большая и качественно, но… есть ведь уже замечательная книга CLR via C# Джеффри Рихтера, с хорошим переводом.
В книге Рихтера описано множество тонких моментов работы CLR. Но на сколько я помню, вопросу интернирования строк уделилось не так и много места. В этой же статье довольно ясно и лаконично обьясняется работа фреймворка именно в этом аспекте. Думаю, что после прочтения двух книг, Вы поймёте, почему я посчитал необходимым перевести эту статью.
Спасибо.
CLR via C# Джеффри Рихтера — это библия .net. Но в этой статье имхо интернирование строк раскрыто очень увлекательно и более детально.
Если ничего не путаю, то Рихтер советовал не надеяться на интернирование строк, это внутренняя реализация тeкущей версии CLR. Важно понимать, что строки immutable, а есть интернирование или нет не должно влиять на ваш код.
Особенно если не заметить в проекте такое:
[assembly:CompilationRelaxations(CompilationRelaxations.NoStringInterning)]
Опять же e Рихтера написано, что даже если явно отключить интернирование, то это вовсе не означает, что строки не будут интернироваться.
Они могут не интернироваться, но в текущих реализациях интернируются почти всегда.
Никогда не понимал зачем такое спрашивать на собеседованиях. Разве что узнать насколько чувак любознателен, или читал ли он Рихтера от корки до корки.
Ну надо же как-то на собеседовании продемонстрировать собственное превосходство и сбить ваши ожидания относительно себя, дабы не просили большую зарплату.
Не уверен, что это стоит спрашивать на собеседовании, но многие не понимают почему в длинной строке нельзя поменять n-й символ без пересоздания объекта. Или почему при активном изменении строки лучше использовать StringBuilder.
Ну я так и спрашиваю. Например чем плохо вот такое:
var s = ""; for(var n = 0; n < 100500; n++) { s += n.ToString(); }
Бывают не знают, да. Бывает что заодно рассказывают и про String.Builder, и про String.Concat/Join, и до GC разговор доходит. Но начинать с вопроса «как работает интернирование строк» — это снобизм чистой воды.
очень хорошая и полезная статья! побольше бы таких вещей, о которых мало где упоминается. Только тогда можно стать профессионалом своего дела
Спасибо за статью. Очень интересно было почитать и узнать многое новое.

Но у меня немного не сошлось с вашим описанием. Возможно я что-то путаю, но ildasm показывает, что интерация «xyz» для строчки

Console.WriteLine(object.ReferenceEquals("xyz", s));


не запускается в начале

Код IL



интерация

Все же интернирование, ибо Ваш вариант больше похож на итерацию.
не запускается в начале

Имеется ввиду не наличие строки ldstr «abc» в самом начале кода, ибо в примере из статьи, судя по IL коду,
идет речь о методе Main из одной строчки:
Console.WriteLine("x" + "y" + "z");


По факту — компилятор «прочухал», что WriteLine-у скармливают константную строку («x»+«y»+«z» всегда то же самое, что «xyz»), а уже CLR автоматом добавит эту строку в пул интернирования еще до первой инструкции метода Main.
Sign up to leave a comment.

Articles