C# строки String
Строки ссылочный тип, все верно. Всегда происходит только присваивание ссылки на нее, копирования данных не происходит.
спасибо
тут же возник вопрос по поводу String.Split:
Так вот, как выделить подстроку из строки не выделяя при этом память? это вообще возможно в .NET или запрещено как потенциально опасное?
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 или запрещено как потенциально опасное?
а как это можно сделать вообще? о-О
дык вот я и спрашиваю, т.к. нигде (в том числе и в MSDN) ничего не нашел...
А на хрена это вообще нужно?
вообще вопрос не был не в том, нахрена это нужно и проч. А в том - возможно ли вообще такое?
Чтобы не тормозить.
---
"Narrowness of experience leads to narrowness of imagination."
---
"Narrowness of experience leads to narrowness of imagination."
> Так вот, как выделить подстроку из строки не выделяя при этом память?
хорошим способом нельзя
можно через всякие обходные пути, но это уже будет сильно зависит от того, что с этой подстрокой необходимо сделать дальше.
хорошим способом нельзя
можно через всякие обходные пути, но это уже будет сильно зависит от того, что с этой подстрокой необходимо сделать дальше.
нехорошим, это подразумевается через функцию, преобразовывающуд в массив символов?
п.с. жаль, что нельзя.. ладно, тогда тему закрываем...
п.с. жаль, что нельзя.. ладно, тогда тему закрываем...
Строки по определению immutable, для чего есть весьма веские основания.
Хочешь быстро - юзай StringBuilder, если мне не изменяет память, где-то над ним даже слайсы (то что ты хотел) были, или их можно было быстро написать.
Хочешь быстро - юзай StringBuilder, если мне не изменяет память, где-то над ним даже слайсы (то что ты хотел) были, или их можно было быстро написать.
У меня возник вопрос. А как .NET вообще хранит строки в памяти?
на x86, разумеется
на x86, разумеется
4 байта длина и дальше двухбайтовые символы
В виде массива 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.
и это:
upd: Хотя нет, возможно я ошибаюсь, т.к. полагал что ToCharArray возвращает то, что действительно находится внутри string-объекта и через него можно менять содержимое. Сейчас проверил - это не так....
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.
Чувак, почитай лучше что-нибудь про объектно-ориентированное программирование 
Как насчёт скрипта для переименования файлов?
---
...Я работаю антинаучным аферистом...
---
...Я работаю антинаучным аферистом...
Ничего против скрипта не имею 

я просто подумал, что если бы хранить строку как структуру так: указатель на начало данных и их длину, а данные хранить отдельно, то можно было бы нахаляву получить подстроку без выделения доп памяти
Смысл в том, что твой метод предполагает на один уровень косвенности больше, что чревато тормозами на коде вроде
Кроме того, никто не мешает сделать так:
По сути ты получаешь тот же функционал, только навернутый над быстрой реализацией string.
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.
думается любой оптимизатор закатает для цикла ссылку в регистр. Зато удобнее и большая экономия памяти
Про оптимизатор согласен. В принципе, если найдутся важные приложения фичи "дешевой" подстроки, то так и сделают. Поскольку никто не завязывается на внутреннее строение string, никто не мешает его изменить. Для этого лишь необходимо, чтобы этого захотел МС. А захочет он этого, если его попросить хорошо и аргументировано. Просить можно тут
В правильных системах это уже делают не менее десятка лет.
---
"Расширь своё сознание!"
---
"Расширь своё сознание!"
в каких? о-О
Думаю, что это появилось ещё в системах, выросших
из творения Лаксена и Перри (Laxen & Perry F83
если не у них самих.
По крайней мере, в F-PC (Zimmer, Bawd, Ting & al.) это уже есть.
Версия 3.5 относится к ноябрю 89-го.
---
...Я работаю антинаучным аферистом...
из творения Лаксена и Перри (Laxen & Perry F83
если не у них самих.
По крайней мере, в F-PC (Zimmer, Bawd, Ting & al.) это уже есть.
Версия 3.5 относится к ноябрю 89-го.
---
...Я работаю антинаучным аферистом...
Оставить комментарий
oleg1331
Если я не ошибаюсь, то string является ссылочным классом? (Addison Wesley - CSharp Primer A Practical Approach) Тогда вопрос:Будут ли копироваться сами строки (т.е. создаваться дубликаты) при такой инициализации, или же ArrayList будет работать с теми же экземплярами строк, что и в words?
Ну и аналогично - происходит ли копирование данных при вызове функции aKeys.Add(string str)?