Здравствуйте, Shmj, Вы писали:
S>Вот в С++ любят. И ведь приятнее же написать
В C++ вообще любят извращения.
S>stringBuilder += "test" чем stringBuilder.Append("test") ?
stringBuilder += "test" эьо stringBuilder = stringBuilder + "test", он должен возвращать новый объекти не изменять старый. Поэтому stringBuilder.Append
S>Вроде бы и поддерживаются на уровне кода, но не пошло... Почему?
Потому что C++ можно отдельно переопределить += и + и сделать их несогласованными, в C++ слава богу нельзя.
Да и в целом со стрингбилдером крайне редкий кейс, чтобы для него вводить такое в язык.
Здравствуйте, Shmj, Вы писали:
S>Вот в С++ любят. И ведь приятнее же написать
S>stringBuilder += "test" чем stringBuilder.Append("test") ?
Писать — приятно, СОПРОВОЖДАТЬ ХРЕНОВО!
Сидишь, в ус не дуешь, как вдруг:
door += mochalka * kaktus;
И сидишь, охреневаешь — что это за безумная арифметика и каким боком тут вообще всё?!
Перегрузка операторов хороша для весьма специфичных и крупных задач — если, к примеру, ВСЯ твоя прога состоит из вычислений комплексных чисел. Тогда насочинял операторов и всё у тебя ништяк! В реальной проге проще вызвать ОЧЕВИДНЫЙ метод, чем неочевидный крючок типа "@" — вот что он означает?
stringBuilder — это вообще позорное пятно библиотеки — наглядный пример безалаберности разрабов. Не умеете компилировать в быстрый код — вообще не беритесь за языки.
Здравствуйте, Baiker, Вы писали:
B>stringBuilder — это вообще позорное пятно библиотеки — наглядный пример безалаберности разрабов. Не умеете компилировать в быстрый код — вообще не беритесь за языки.
А были какие-то вариант? Во времена .NET1 даже генериков не было, поэтому стрингбилдер и появился. Сейчас он не нужен от слова совсем.
Во времена .NET2 стринбилдер был уже не так нужен, хотя по инерции его использовали там, где не надо.
Здравствуйте, gandjustas, Вы писали:
G>Здравствуйте, Baiker, Вы писали:
B>>stringBuilder — это вообще позорное пятно библиотеки — наглядный пример безалаберности разрабов. Не умеете компилировать в быстрый код — вообще не беритесь за языки. G>А были какие-то вариант? Во времена .NET1 даже генериков не было, поэтому стрингбилдер и появился.
Не понял связи SB и дженериков.
G> Сейчас он не нужен от слова совсем.
ВОТ! Про что и речь. Ума содрать жабу и выдать за C# — хватило, а написать эффективный манипулятор строками — нет. Потому и позорное пятно. Да ещё и книжек с библиотеками понаписали, где юзается SB. Новичок читает и не понимает, за каким фигом для строк требуется ещё и отдельный "эффективный класс".
Здравствуйте, gandjustas, Вы писали:
G>Здравствуйте, Baiker, Вы писали:
B>>stringBuilder — это вообще позорное пятно библиотеки — наглядный пример безалаберности разрабов. Не умеете компилировать в быстрый код — вообще не беритесь за языки. G>А были какие-то вариант? Во времена .NET1 даже генериков не было, поэтому стрингбилдер и появился. Сейчас он не нужен от слова совсем. G>Во времена .NET2 стринбилдер был уже не так нужен, хотя по инерции его использовали там, где не надо.
что-то я не понял, какие альтернативы стрингбилдеру, если нужно собирать большой текст из кусков (и таскать его по приложению)?
Здравствуйте, gandjustas, Вы писали:
S>>stringBuilder += "test" чем stringBuilder.Append("test") ?
G>stringBuilder += "test" эьо stringBuilder = stringBuilder + "test", он должен возвращать новый объекти не изменять старый.
Кому должен? Что мешает вернуть референс на модифицированный старый?
Здравствуйте, Baiker, Вы писали:
B>Не понял связи SB и дженериков.
+1
B>ВОТ! Про что и речь. Ума содрать жабу и выдать за C# — хватило, а написать эффективный манипулятор строками — нет. Потому и позорное пятно. Да ещё и книжек с библиотеками понаписали, где юзается SB. Новичок читает и не понимает, за каким фигом для строк требуется ещё и отдельный "эффективный класс".
Дык SB и есть тот самый "эффективный манипулятор строками", нет? Какую альтернативу ты ему видишь?
Здравствуйте, Shmj, Вы писали:
S>Вот в С++ любят. И ведь приятнее же написать
S>stringBuilder += "test" чем stringBuilder.Append("test") ?
S>Вроде бы и поддерживаются на уровне кода, но не пошло... Почему?
потому что есть string и интерполяция строк. в корке все это есть(+) и работает.
билдер стоит рассматривать как низкоуровневый код(см реализацию интерполяции).
B>Не понял связи SB и дженериков.
Подавляющая часть использования стрингбилдера в прикладных программах — склейка массива строк в одну. Для этого есть string.Join и он даже чуть быстрее работает, чем цикл в билдере. Но до .NET 3.5 примерно приходилось писать циклы и перекладывать строки из какогонить datatable в массив руками. Linq эту задачу значительно оптимизировал, появился string.Join(IEnumerable<T>) и количество использований стрингбилдера упало до нормального уровня.
B>ВОТ! Про что и речь. Ума содрать жабу и выдать за C# — хватило, а написать эффективный манипулятор строками — нет. Потому и позорное пятно. Да ещё и книжек с библиотеками понаписали, где юзается SB. Новичок читает и не понимает, за каким фигом для строк требуется ещё и отдельный "эффективный класс".
Нет, речь не про это. Стрингбилдер это эффективный низкоуровневый инструмент. Он всегда таким был. На некоторых сценариях он обгонял std:string из C++ еще во времена .NET 2.0
Стрингбилдер помогает когда надо генерировать текст из объектов — HTML, сериализация, кодогенерация итд. Но это в основном внутренний инструмент для разработчика фреймворка.
Для прикладной программы сейчас лучше использовать интерполяцию или string.join (ЧСХ оба внутри используют стрингбилдеры), а если надо много и быстро, то Memory<char> и ручное копирование если это подходит.
Единственное что плохо, что с самого начала .NET авторы книжек толкали идею что "строки плохо и медленно, стрингбилдер хорошо" и это тянется до сих пор. До смешного бывает: я вижу код, где вместо конкатенации трех строковых переменных люди городят стрингбилдеры.
Здравствуйте, fk0, Вы писали:
fk0>Здравствуйте, gandjustas, Вы писали:
S>>>stringBuilder += "test" чем stringBuilder.Append("test") ?
G>>stringBuilder += "test" эьо stringBuilder = stringBuilder + "test", он должен возвращать новый объекти не изменять старый.
fk0> Кому должен? Что мешает вернуть референс на модифицированный старый?
Здравый смысл мешает. Что например должно вернуть выражение x + x + x, если плюс модифицирует первый аргумент?
Здравствуйте, Shmj, Вы писали:
S>Вот в С++ любят. И ведь приятнее же написать
S>stringBuilder += "test" чем stringBuilder.Append("test") ?
S>Вроде бы и поддерживаются на уровне кода, но не пошло... Почему?
В С++ шаблоны это генерация текста. А так как хочется, что бы разные типы обрабатывали операторы правильно вот и придумали через перегрузку операторов.
При этом операторы инлайнятся.
У них например >> хрен поймешь что в итоге делает.
В C# кстати сделали аналог через Поддержка универсальной математики
There are several language features that enable generic math support:
static virtual members in interfaces
checked user defined operators
relaxed shift operators
unsigned right-shift operator
и солнце б утром не вставало, когда бы не было меня
Здравствуйте, pilgrim_, Вы писали:
_>Дык SB и есть тот самый "эффективный манипулятор строками", нет? Какую альтернативу ты ему видишь?
Что мешает внутри САМИХ СТРОК иметь тот "эффективный код" для сборки множества строк в одну??
У канпелятора МОРЕ инфы! Например, что строка конкатенируется в цикле. Или большом методе. Вот и подставляйте туда "эффективный код"!
Здравствуйте, Baiker, Вы писали:
B>Здравствуйте, pilgrim_, Вы писали:
_>>Дык SB и есть тот самый "эффективный манипулятор строками", нет? Какую альтернативу ты ему видишь?
B>Что мешает внутри САМИХ СТРОК иметь тот "эффективный код" для сборки множества строк в одну?? B>У канпелятора МОРЕ инфы! Например, что строка конкатенируется в цикле. Или большом методе. Вот и подставляйте туда "эффективный код"!
Потому что для совместимости с апи ОС строка должна быть массивов двухбайтных символов. А стринбилдер устроен совсем не так, там массив сегментов и хитрая логика их перестроения при редактировании. Построение массива байт из него — затратная операция.
Кроме того строки в .net иммутабельны, что сильно облегчает их использование в многопоточном окружении.
Здравствуйте, Shmj, Вы писали:
S>Вот в С++ любят. И ведь приятнее же написать Безумцы! S>stringBuilder += "test" чем stringBuilder.Append("test") ?
S>Вроде бы и поддерживаются на уровне кода, но не пошло... Почему?
Ответ:
bool? x = null; if(!x.HasValue) Console.WriteLine("Hello, World!");
Читоб? у нас же x нал! следующая инструкция должна отстрелить ногу(?). но нет.
из-за чертовой магии оно работает! теперь посчитаем кол-во таких фишек компилятора которые нужно знать.
да ну нафиг, лучше уж F#, common lisp и zig, чем гребанные операторы.
Здравствуйте, Ночной Смотрящий, Вы писали:
НС>Здравствуйте, vaa, Вы писали:
vaa>>из-за чертовой магии оно работает! теперь посчитаем кол-во таких фишек компилятора которые нужно знать.
НС>Это фишка рантайма, емнип.
Разве?
Вроде ж, компилятор это
bool? x = null;
заменяет на это
Nullable<bool> x = default;
иначе с чего бы у x можно было бы дергать методы в рантайме?
Здравствуйте, Baiker, Вы писали:
B>stringBuilder — это вообще позорное пятно библиотеки — наглядный пример безалаберности разрабов. Не умеете компилировать в быстрый код — вообще не беритесь за языки.
Ничего подобного! Код должен делать то, что ты написал, а не что-то ещё. Сложение строк порождает новую строку, и это правильно. Более эффективно это сделать нельзя, и ничего позорного в этом нет.
Хочешь эффективно собирать множество строк — таскай за собой SB: далеко не все собирают HTML или отчёты генерируют, иногда нужно просто сложить 2 строки и на этом остановиться.
Всё сказанное выше — личное мнение, если не указано обратное.