Модераторы: Partizan, gambit
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Почему String - константа 
:(
    Опции темы
Idsa
Дата 4.3.2007, 13:11 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Участник
Сообщений: 2086
Регистрация: 5.12.2006
Где: Томск

Репутация: 14
Всего: 62



В C# и в Java, любое изменение в объекте класса String достигается путем создания нового объекта. В противовес String как в C#, так и в Java есть класс StringBuilder, который производит преобразования над строками в классическом понимании этого процесса (изменяются только необходимые байты, а создания нового объекта не происходит).
Теперь вопрос: зачем были введены константные строки?
В интернете уже не раз обсуждался этот вопрос... но достойного ответа я так и не нашел smile.
P. S. Вопрос, конечно, касается, в первую очередь, C#. Java я сюда приписал только для того, чтобы показать, что эта идея - не следствие больной фантазии программистов MicroSoft.


--------------------
Мой блог: alexidsa.blogspot.com
PM MAIL ICQ   Вверх
nerezus
Дата 4.3.2007, 13:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Вселенский отказник
****


Профиль
Группа: Участник
Сообщений: 3330
Регистрация: 15.6.2005

Репутация: 1
Всего: 43



Цитата

Теперь вопрос: зачем были введены константные строки?
 Быстрее они. Кстати в питоне такие же )


--------------------
Сообщество художников Artsociety.ru
PM MAIL WWW   Вверх
Idsa
Дата 4.3.2007, 13:35 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Участник
Сообщений: 2086
Регистрация: 5.12.2006
Где: Томск

Репутация: 14
Всего: 62



Цитата(nerezus @  4.3.2007,  13:23 Найти цитируемый пост)
Быстрее они. Кстати в питоне такие же )

Быстрее StringBuilder? Создание нового объекта быстрее изменения одного байта (крайний случай... но все же).

Это сообщение отредактировал(а) Idsa - 4.3.2007, 13:36


--------------------
Мой блог: alexidsa.blogspot.com
PM MAIL ICQ   Вверх
ivashkanet
Дата 4.3.2007, 13:36 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Кодю потиху
****


Профиль
Группа: Участник Клуба
Сообщений: 3684
Регистрация: 23.2.2006
Где: Гомель, Беларусь

Репутация: 47
Всего: 149



Idsa, проблемма только в том, что все объекты имеют определенный размер (в байтах) и нет эффективного способа увеличить или уменьшить этот размер. 
Нужно либо полностью копировать объект в больший (или меньший) блок памяти (класс string), либо оставлять что-то прозапас (StringBuilder).


PM MAIL WWW ICQ   Вверх
Idsa
Дата 4.3.2007, 13:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Участник
Сообщений: 2086
Регистрация: 5.12.2006
Где: Томск

Репутация: 14
Всего: 62



ivashkanet, насколько я понимаю, и String, и StringBuilder справляются с этой проблемой одинаково - в лоб. Я же спрашиваю, в чем их отличия, чтобы понять зачем ввели это разделение.


--------------------
Мой блог: alexidsa.blogspot.com
PM MAIL ICQ   Вверх
ivashkanet
Дата 4.3.2007, 13:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Кодю потиху
****


Профиль
Группа: Участник Клуба
Сообщений: 3684
Регистрация: 23.2.2006
Где: Гомель, Беларусь

Репутация: 47
Всего: 149



Idsa, какой лоб? Где лоб?

При изменении стринга всегда создается новый объект, а при изменении билдера новый объект создается только когда его резерв (пустые символы в конце) весь заполнен  smile

Добавлено @ 13:56 
Цитата(Idsa @  4.3.2007,  12:47 Найти цитируемый пост)
 в чем их отличия

Я же написал:
Цитата(ivashkanet @  4.3.2007,  12:36 Найти цитируемый пост)
Нужно либо полностью копировать объект в больший (или меньший) блок памяти (класс string), либо оставлять что-то прозапас (StringBuilder).


PM MAIL WWW ICQ   Вверх
Idsa
Дата 4.3.2007, 14:15 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Участник
Сообщений: 2086
Регистрация: 5.12.2006
Где: Томск

Репутация: 14
Всего: 62



ivashkanet, невнимательно прочитал smile.
Если бы отличие было только в этом, то imho оставили бы только класс StringBuilder, который при Capasity, равном реальному размеру строки, в плане выделения памяти вел бы себя подобно String, но при этом не создавал бы нового объекта при изменении определенных символов.
Т. е. на мой взгляд, это не единственная причина.


--------------------
Мой блог: alexidsa.blogspot.com
PM MAIL ICQ   Вверх
bend0r
Дата 4.3.2007, 14:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 76
Регистрация: 14.9.2005

Репутация: 1
Всего: 2



Цитата(Idsa @  4.3.2007,  13:35 Найти цитируемый пост)
Быстрее StringBuilder?

при удалении или вставки строк быстрее выделить память чем перемещать их по памяти.
все зависит от поставленой задачей соотвествено и используют тот класс который нужен.
PM MAIL   Вверх
mr.DUDA
Дата 4.3.2007, 16:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


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


--------------------
user posted image
PM MAIL WWW   Вверх
Void
Дата 4.3.2007, 18:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


λcat.lolcat
****


Профиль
Группа: Участник Клуба
Сообщений: 2206
Регистрация: 16.11.2004
Где: Zürich

Репутация: 25
Всего: 173



Цитата(mr.DUDA @  4.3.2007,  18:49 Найти цитируемый пост)
Между прочим, в C++/STL строки - тоже неизменяемые (std::string).

[К сожалению, ] изменяемые.


--------------------
“Coming back to where you started is not the same as never leaving.” — Terry Pratchett
PM MAIL WWW GTalk   Вверх
Idsa
Дата 4.3.2007, 19:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Участник
Сообщений: 2086
Регистрация: 5.12.2006
Где: Томск

Репутация: 14
Всего: 62



Аргументы mr.DUDA оказались куда убедительнее. Действительно, string internal pool - очень полезная штука и через StringBuilder ее не реализуешь. Да и с HashTable тоже красиво получается.

mr.DUDA, +1.


--------------------
Мой блог: alexidsa.blogspot.com
PM MAIL ICQ   Вверх
mr.DUDA
Дата 4.3.2007, 19:53 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


3D-маньяк
****


Профиль
Группа: Экс. модератор
Сообщений: 8244
Регистрация: 27.7.2003
Где: город-герой Минск

Репутация: 110
Всего: 232



Void, а как же string::c_str() ?  smile 


--------------------
user posted image
PM MAIL WWW   Вверх
Void
Дата 4.3.2007, 20:05 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


λcat.lolcat
****


Профиль
Группа: Участник Клуба
Сообщений: 2206
Регистрация: 16.11.2004
Где: Zürich

Репутация: 25
Всего: 173



mr.DUDA, что string::c_str() ? smile

У std::string есть методы append, erase, insert и т. д., неконстантный оператор [] в конце концов.



--------------------
“Coming back to where you started is not the same as never leaving.” — Terry Pratchett
PM MAIL WWW GTalk   Вверх
Idsa
Дата 4.3.2007, 20:11 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Участник
Сообщений: 2086
Регистрация: 5.12.2006
Где: Томск

Репутация: 14
Всего: 62



Цитата(Void @  4.3.2007,  20:05 Найти цитируемый пост)
У std::string есть методы append, erase, insert и т. д., неконстантный оператор [] в конце концов.

Дык и у шарпового String тоже есть эти методы. Вот, например, рабочий код:
Код

      String s = "a";
      s = s.Insert(0, "b");

Фишка не в наличии функций, а в их реализации (создание нового объекта или изменение содержимого имеющегося объекта).

Добавлено @ 20:12 
Цитата(Idsa @  4.3.2007,  20:11 Найти цитируемый пост)
неконстантный оператор []

И, если mr.DUDA все-таки прав, то этот оператор read only.


--------------------
Мой блог: alexidsa.blogspot.com
PM MAIL ICQ   Вверх
Void
Дата 4.3.2007, 20:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


λcat.lolcat
****


Профиль
Группа: Участник Клуба
Сообщений: 2206
Регистрация: 16.11.2004
Где: Zürich

Репутация: 25
Всего: 173



Хотел оговориться, поленился. Теперь все равно придётся уточнять. Эти методы изменяют исходную строку и, как правило, возвращают на неё ссылку.
Цитата(Idsa @  4.3.2007,  22:11 Найти цитируемый пост)
этот оператор read only. 

Я же сказал, неконстантный.


--------------------
“Coming back to where you started is not the same as never leaving.” — Terry Pratchett
PM MAIL WWW GTalk   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Прежде чем создать тему, посмотрите сюда:
mr.DUDA
THandle

Используйте теги [code=csharp][/code] для подсветки кода. Используйтe чекбокс "транслит" если у Вас нет русских шрифтов.
Что делать если Вам помогли, но отблагодарить помощника плюсом в репутацию Вы не можете(не хватает сообщений)? Пишите сюда, или отправляйте репорт. Поставим :)
Так же не забывайте отмечать свой вопрос решенным, если он таковым является :)


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, mr.DUDA, THandle.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Общие вопросы по .NET и C# | Следующая тема »


 




[ Время генерации скрипта: 0.0570 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.