Комментарии 16
Работа проделана безусловно большая и качественно, но… есть ведь уже замечательная книга CLR via C# Джеффри Рихтера, с хорошим переводом.
+7
В книге Рихтера описано множество тонких моментов работы CLR. Но на сколько я помню, вопросу интернирования строк уделилось не так и много места. В этой же статье довольно ясно и лаконично обьясняется работа фреймворка именно в этом аспекте. Думаю, что после прочтения двух книг, Вы поймёте, почему я посчитал необходимым перевести эту статью.
Спасибо.
Спасибо.
+2
deleted
0
Если ничего не путаю, то Рихтер советовал не надеяться на интернирование строк, это внутренняя реализация тeкущей версии CLR. Важно понимать, что строки immutable, а есть интернирование или нет не должно влиять на ваш код.
+2
Особенно если не заметить в проекте такое:
[assembly:CompilationRelaxations(CompilationRelaxations.NoStringInterning)]
[assembly:CompilationRelaxations(CompilationRelaxations.NoStringInterning)]
+1
Никогда не понимал зачем такое спрашивать на собеседованиях. Разве что узнать насколько чувак любознателен, или читал ли он Рихтера от корки до корки.
+4
Ну надо же как-то на собеседовании продемонстрировать собственное превосходство и сбить ваши ожидания относительно себя, дабы не просили большую зарплату.
+2
Не уверен, что это стоит спрашивать на собеседовании, но многие не понимают почему в длинной строке нельзя поменять n-й символ без пересоздания объекта. Или почему при активном изменении строки лучше использовать StringBuilder.
+1
Ну я так и спрашиваю. Например чем плохо вот такое:
Бывают не знают, да. Бывает что заодно рассказывают и про String.Builder, и про String.Concat/Join, и до GC разговор доходит. Но начинать с вопроса «как работает интернирование строк» — это снобизм чистой воды.
var s = "";
for(var n = 0; n < 100500; n++) {
s += n.ToString();
}
Бывают не знают, да. Бывает что заодно рассказывают и про String.Builder, и про String.Concat/Join, и до GC разговор доходит. Но начинать с вопроса «как работает интернирование строк» — это снобизм чистой воды.
+2
В продолжение этой статьи, для заглянувших, не забудьте посмотреть эти статьи тоже (не мои), они очень хороши.
habrahabr.ru/post/165597/
habrahabr.ru/post/137680/
habrahabr.ru/post/172627/
habrahabr.ru/post/165597/
habrahabr.ru/post/137680/
habrahabr.ru/post/172627/
0
очень хорошая и полезная статья! побольше бы таких вещей, о которых мало где упоминается. Только тогда можно стать профессионалом своего дела
0
Спасибо за статью. Очень интересно было почитать и узнать многое новое.
Но у меня немного не сошлось с вашим описанием. Возможно я что-то путаю, но ildasm показывает, что интерация «xyz» для строчки
не запускается в начале
Но у меня немного не сошлось с вашим описанием. Возможно я что-то путаю, но ildasm показывает, что интерация «xyz» для строчки
Console.WriteLine(object.ReferenceEquals("xyz", s));
не запускается в начале
Код IL
0
интерация
Все же интернирование, ибо Ваш вариант больше похож на итерацию.
не запускается в начале
Имеется ввиду не наличие строки ldstr «abc» в самом начале кода, ибо в примере из статьи, судя по IL коду,
идет речь о методе Main из одной строчки:
Console.WriteLine("x" + "y" + "z");
По факту — компилятор «прочухал», что WriteLine-у скармливают константную строку («x»+«y»+«z» всегда то же самое, что «xyz»), а уже CLR автоматом добавит эту строку в пул интернирования еще до первой инструкции метода Main.
0
Зарегистрируйтесь на Хабре, чтобы оставить комментарий
String.Intern делает строки ещё интереснее