Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Общие вопросы по .NET и C# > Почему String - константа


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

Автор: nerezus 4.3.2007, 13:23
Цитата

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

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

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

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


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

Автор: ivashkanet 4.3.2007, 13:54
Idsa, какой лоб? Где лоб?

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

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

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


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

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

при удалении или вставки строк быстрее выделить память чем перемещать их по памяти.
все зависит от поставленой задачей соотвествено и используют тот класс который нужен.

Автор: mr.DUDA 4.3.2007, 16:49
Неизменяемость строки даёт возможность запихнуть все строковые константы в т.н. intern pool и сравнивать в == не строки а ссылки на них, также раз строка не изменяется - GetHashCode возвращает всегда одно значение, следовательно можем юзать строки как ключи в Hashtable/Dictionary.

Между прочим, в C++/STL строки - тоже неизменяемые (std::string).

Добавлено @ 16:56 
Вот тебе ссылка:
http://www.intuit.ru/department/pl/csharp/14/2.html

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

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

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

mr.DUDA, +1.

Автор: mr.DUDA 4.3.2007, 19:53
Void, а как же string::c_str() ?  smile 

Автор: Void 4.3.2007, 20:05
mr.DUDA, что string::c_str() ? smile

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

Автор: Idsa 4.3.2007, 20:11
Цитата(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.

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

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

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)