![]() |
|
Модераторы: Partizan, gambit |
![]()
|
|
| Idsa |
|
|||
|
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Участник Сообщений: 2086 Регистрация: 5.12.2006 Где: Томск Репутация: 14 Всего: 62 |
В C# и в Java, любое изменение в объекте класса String достигается путем создания нового объекта. В противовес String как в C#, так и в Java есть класс StringBuilder, который производит преобразования над строками в классическом понимании этого процесса (изменяются только необходимые байты, а создания нового объекта не происходит).
Теперь вопрос: зачем были введены константные строки? В интернете уже не раз обсуждался этот вопрос... но достойного ответа я так и не нашел P. S. Вопрос, конечно, касается, в первую очередь, C#. Java я сюда приписал только для того, чтобы показать, что эта идея - не следствие больной фантазии программистов MicroSoft. |
|||
|
||||
| nerezus |
|
|||
![]() Вселенский отказник ![]() ![]() ![]() ![]() Профиль Группа: Участник Сообщений: 3330 Регистрация: 15.6.2005 Репутация: 1 Всего: 43 |
|
|||
|
||||
| Idsa |
|
|||
|
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Участник Сообщений: 2086 Регистрация: 5.12.2006 Где: Томск Репутация: 14 Всего: 62 |
Быстрее StringBuilder? Создание нового объекта быстрее изменения одного байта (крайний случай... но все же). Это сообщение отредактировал(а) Idsa - 4.3.2007, 13:36 |
|||
|
||||
| ivashkanet |
|
|||
![]() Кодю потиху ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 3684 Регистрация: 23.2.2006 Где: Гомель, Беларусь Репутация: 47 Всего: 149 |
Idsa, проблемма только в том, что все объекты имеют определенный размер (в байтах) и нет эффективного способа увеличить или уменьшить этот размер.
Нужно либо полностью копировать объект в больший (или меньший) блок памяти (класс string), либо оставлять что-то прозапас (StringBuilder). |
|||
|
||||
| Idsa |
|
|||
|
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Участник Сообщений: 2086 Регистрация: 5.12.2006 Где: Томск Репутация: 14 Всего: 62 |
ivashkanet, насколько я понимаю, и String, и StringBuilder справляются с этой проблемой одинаково - в лоб. Я же спрашиваю, в чем их отличия, чтобы понять зачем ввели это разделение.
|
|||
|
||||
| ivashkanet |
|
|||
![]() Кодю потиху ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 3684 Регистрация: 23.2.2006 Где: Гомель, Беларусь Репутация: 47 Всего: 149 |
Idsa, какой лоб? Где лоб?
При изменении стринга всегда создается новый объект, а при изменении билдера новый объект создается только когда его резерв (пустые символы в конце) весь заполнен Добавлено @ 13:56 Я же написал:
|
|||
|
||||
| Idsa |
|
|||
|
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Участник Сообщений: 2086 Регистрация: 5.12.2006 Где: Томск Репутация: 14 Всего: 62 |
ivashkanet, невнимательно прочитал
Если бы отличие было только в этом, то imho оставили бы только класс StringBuilder, который при Capasity, равном реальному размеру строки, в плане выделения памяти вел бы себя подобно String, но при этом не создавал бы нового объекта при изменении определенных символов. Т. е. на мой взгляд, это не единственная причина. |
|||
|
||||
| bend0r |
|
|||
![]() Шустрый ![]() Профиль Группа: Участник Сообщений: 76 Регистрация: 14.9.2005 Репутация: 1 Всего: 2 |
||||
|
||||
| mr.DUDA |
|
|||
|
3D-маньяк ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 8244 Регистрация: 27.7.2003 Где: город-герой Минск Репутация: 110 Всего: 232 |
Неизменяемость строки даёт возможность запихнуть все строковые константы в т.н. intern pool и сравнивать в == не строки а ссылки на них, также раз строка не изменяется - GetHashCode возвращает всегда одно значение, следовательно можем юзать строки как ключи в Hashtable/Dictionary.
Между прочим, в C++/STL строки - тоже неизменяемые (std::string). Добавлено @ 16:56 Вот тебе ссылка: http://www.intuit.ru/department/pl/csharp/14/2.html -------------------- ![]() |
|||
|
||||
| Void |
|
|||
![]() λcat.lolcat ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 2206 Регистрация: 16.11.2004 Где: Zürich Репутация: 25 Всего: 173 |
[К сожалению, ] изменяемые. -------------------- “Coming back to where you started is not the same as never leaving.” — Terry Pratchett |
|||
|
||||
| Idsa |
|
|||
|
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Участник Сообщений: 2086 Регистрация: 5.12.2006 Где: Томск Репутация: 14 Всего: 62 |
Аргументы mr.DUDA оказались куда убедительнее. Действительно, string internal pool - очень полезная штука и через StringBuilder ее не реализуешь. Да и с HashTable тоже красиво получается.
mr.DUDA, +1. |
|||
|
||||
| mr.DUDA |
|
|||
|
3D-маньяк ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 8244 Регистрация: 27.7.2003 Где: город-герой Минск Репутация: 110 Всего: 232 |
Void, а как же string::c_str() ?
-------------------- ![]() |
|||
|
||||
| Void |
|
|||
![]() λcat.lolcat ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 2206 Регистрация: 16.11.2004 Где: Zürich Репутация: 25 Всего: 173 |
mr.DUDA, что string::c_str() ?
У std::string есть методы append, erase, insert и т. д., неконстантный оператор [] в конце концов. -------------------- “Coming back to where you started is not the same as never leaving.” — Terry Pratchett |
|||
|
||||
| Idsa |
|
||||
|
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Участник Сообщений: 2086 Регистрация: 5.12.2006 Где: Томск Репутация: 14 Всего: 62 |
Дык и у шарпового String тоже есть эти методы. Вот, например, рабочий код:
Фишка не в наличии функций, а в их реализации (создание нового объекта или изменение содержимого имеющегося объекта). Добавлено @ 20:12 И, если mr.DUDA все-таки прав, то этот оператор read only. |
||||
|
|||||
| Void |
|
|||
![]() λcat.lolcat ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 2206 Регистрация: 16.11.2004 Где: Zürich Репутация: 25 Всего: 173 |
Хотел оговориться, поленился. Теперь все равно придётся уточнять. Эти методы изменяют исходную строку и, как правило, возвращают на неё ссылку.
Я же сказал, неконстантный. -------------------- “Coming back to where you started is not the same as never leaving.” — Terry Pratchett |
|||
|
||||
![]()
|
| Прежде чем создать тему, посмотрите сюда: | |
|
|
Используйте теги [code=csharp][/code] для подсветки кода. Используйтe чекбокс "транслит" если у Вас нет русских шрифтов. Что делать если Вам помогли, но отблагодарить помощника плюсом в репутацию Вы не можете(не хватает сообщений)? Пишите сюда, или отправляйте репорт. Поставим :) Так же не забывайте отмечать свой вопрос решенным, если он таковым является :) Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, mr.DUDA, THandle. |
| 0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
| 0 Пользователей: | |
| « Предыдущая тема | Общие вопросы по .NET и C# | Следующая тема » |
|
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |