| Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
| Форум программистов > Общие вопросы по .NET и C# > Почему String - константа |
| Автор: Idsa 4.3.2007, 13:11 |
| В C# и в Java, любое изменение в объекте класса String достигается путем создания нового объекта. В противовес String как в C#, так и в Java есть класс StringBuilder, который производит преобразования над строками в классическом понимании этого процесса (изменяются только необходимые байты, а создания нового объекта не происходит). Теперь вопрос: зачем были введены константные строки? В интернете уже не раз обсуждался этот вопрос... но достойного ответа я так и не нашел P. S. Вопрос, конечно, касается, в первую очередь, C#. Java я сюда приписал только для того, чтобы показать, что эта идея - не следствие больной фантазии программистов MicroSoft. |
| Автор: nerezus 4.3.2007, 13:23 | ||
|
| Автор: Idsa 4.3.2007, 13:35 |
Быстрее StringBuilder? Создание нового объекта быстрее изменения одного байта (крайний случай... но все же). |
| Автор: ivashkanet 4.3.2007, 13:36 |
| Idsa, проблемма только в том, что все объекты имеют определенный размер (в байтах) и нет эффективного способа увеличить или уменьшить этот размер. Нужно либо полностью копировать объект в больший (или меньший) блок памяти (класс string), либо оставлять что-то прозапас (StringBuilder). |
| Автор: Idsa 4.3.2007, 13:47 |
| ivashkanet, насколько я понимаю, и String, и StringBuilder справляются с этой проблемой одинаково - в лоб. Я же спрашиваю, в чем их отличия, чтобы понять зачем ввели это разделение. |
| Автор: Idsa 4.3.2007, 14:15 |
| ivashkanet, невнимательно прочитал Если бы отличие было только в этом, то imho оставили бы только класс StringBuilder, который при Capasity, равном реальному размеру строки, в плане выделения памяти вел бы себя подобно String, но при этом не создавал бы нового объекта при изменении определенных символов. Т. е. на мой взгляд, это не единственная причина. |
| Автор: bend0r 4.3.2007, 14:58 |
при удалении или вставки строк быстрее выделить память чем перемещать их по памяти. все зависит от поставленой задачей соотвествено и используют тот класс который нужен. |
| Автор: 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 |
[К сожалению, ] изменяемые. |
| Автор: 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() ? |
| Автор: Void 4.3.2007, 20:05 |
| mr.DUDA, что string::c_str() ? У std::string есть методы append, erase, insert и т. д., неконстантный оператор [] в конце концов. |
| Автор: Idsa 4.3.2007, 20:11 | ||||
Дык и у шарпового String тоже есть эти методы. Вот, например, рабочий код:
Фишка не в наличии функций, а в их реализации (создание нового объекта или изменение содержимого имеющегося объекта). Добавлено @ 20:12 И, если mr.DUDA все-таки прав, то этот оператор read only. |
| Автор: Void 4.3.2007, 20:50 |
| Хотел оговориться, поленился. Теперь все равно придётся уточнять. Эти методы изменяют исходную строку и, как правило, возвращают на неё ссылку. Я же сказал, неконстантный. |