C# строки String

oleg1331

Если я не ошибаюсь, то string является ссылочным классом? (Addison Wesley - CSharp Primer A Practical Approach) Тогда вопрос:


Hashtable words; // заполнено парами, где ключ имеет тип string
ArrayList aKeys = new ArrayList(words.Keys);


Будут ли копироваться сами строки (т.е. создаваться дубликаты) при такой инициализации, или же ArrayList будет работать с теми же экземплярами строк, что и в words?

Ну и аналогично - происходит ли копирование данных при вызове функции aKeys.Add(string str)?

Helga87

Строки ссылочный тип, все верно. Всегда происходит только присваивание ссылки на нее, копирования данных не происходит.

oleg1331

спасибо

oleg1331

тут же возник вопрос по поводу String.Split:




The methods allocate memory for the return value array object and a String object for each array element. If managing memory allocation is critical in your application, consider using the method, and optionally the method, to locate a substring within a string.
If you are splitting a string at a separator character, use the IndexOfAny method to locate a separator character in the string. If you are splitting a string at a separator string, use the IndexOfAny method to locate the first character of a separator string. Then use the Compare method to determine whether the characters after that first character are equal to the remaining characters of the separator string.

Так вот, как выделить подстроку из строки не выделяя при этом память? это вообще возможно в .NET или запрещено как потенциально опасное?

agaaaa

а как это можно сделать вообще? о-О

oleg1331

дык вот я и спрашиваю, т.к. нигде (в том числе и в MSDN) ничего не нашел...

evgen5555

А на хрена это вообще нужно?

oleg1331

вообще вопрос не был не в том, нахрена это нужно и проч. А в том - возможно ли вообще такое?

Ivan8209

Чтобы не тормозить.
---
"Narrowness of experience leads to narrowness of imagination."

Dasar

> Так вот, как выделить подстроку из строки не выделяя при этом память?
хорошим способом нельзя
можно через всякие обходные пути, но это уже будет сильно зависит от того, что с этой подстрокой необходимо сделать дальше.

oleg1331

нехорошим, это подразумевается через функцию, преобразовывающуд в массив символов?

п.с. жаль, что нельзя.. ладно, тогда тему закрываем...

bleyman

Строки по определению immutable, для чего есть весьма веские основания.
Хочешь быстро - юзай StringBuilder, если мне не изменяет память, где-то над ним даже слайсы (то что ты хотел) были, или их можно было быстро написать.

agaaaa

У меня возник вопрос. А как .NET вообще хранит строки в памяти?
на x86, разумеется

Helga87

4 байта длина и дальше двухбайтовые символы

oleg1331

В виде массива char[] я полагаю. Исходя их следующих цитат следует так вроде бы:
 

 
 String members
public char[] ToCharArray
 Return Value: A Unicode character array whose elements are the individual characters of this instance . If this instance is an empty string, the returned array is empty and has a zero length.
 
 
и это:
 

 
 
A String object is called immutable (read-only) because its value cannot be modified once it has been created. Methods that appear to modify a String object actually return a new String object that contains the modification. If it is necessary to modify the actual contents of a string-like object, use the System.Text.StringBuilder class.
upd: Хотя нет, возможно я ошибаюсь, т.к. полагал что ToCharArray возвращает то, что действительно находится внутри string-объекта и через него можно менять содержимое. Сейчас проверил - это не так....

evgen5555

Чувак, почитай лучше что-нибудь про объектно-ориентированное программирование

Ivan8209

Как насчёт скрипта для переименования файлов?
---
...Я работаю антинаучным аферистом...

gusli

Ничего против скрипта не имею

agaaaa

я просто подумал, что если бы хранить строку как структуру так: указатель на начало данных и их длину, а данные хранить отдельно, то можно было бы нахаляву получить подстроку без выделения доп памяти

Helga87

Смысл в том, что твой метод предполагает на один уровень косвенности больше, что чревато тормозами на коде вроде
 

int [] a = new int[str.Length];
for (int i = 0; i < str.Length; i++)
{
a[i] = str[i] + 1;
}

Кроме того, никто не мешает сделать так:
 
public class Substring
{
private string str;
private int start;
private int length;
public Substring(string str, int start, int length) {...}
public char this[int position] { get { ... }}
}

По сути ты получаешь тот же функционал, только навернутый над быстрой реализацией string.

agaaaa

думается любой оптимизатор закатает для цикла ссылку в регистр. Зато удобнее и большая экономия памяти

Helga87

Про оптимизатор согласен. В принципе, если найдутся важные приложения фичи "дешевой" подстроки, то так и сделают. Поскольку никто не завязывается на внутреннее строение string, никто не мешает его изменить. Для этого лишь необходимо, чтобы этого захотел МС. А захочет он этого, если его попросить хорошо и аргументировано. Просить можно тут

Ivan8209

В правильных системах это уже делают не менее десятка лет.
---
"Расширь своё сознание!"

agaaaa

в каких? о-О

Ivan8209

Думаю, что это появилось ещё в системах, выросших
из творения Лаксена и Перри (Laxen & Perry F83
если не у них самих.
По крайней мере, в F-PC (Zimmer, Bawd, Ting & al.) это уже есть.
Версия 3.5 относится к ноябрю 89-го.
---
...Я работаю антинаучным аферистом...
Оставить комментарий
Имя или ник:
Комментарий: