Почему в C# не любят кастомные операторы?
От: Shmj Ниоткуда  
Дата: 19.01.23 21:32
Оценка:
Вот в С++ любят. И ведь приятнее же написать

stringBuilder += "test" чем stringBuilder.Append("test") ?

Вроде бы и поддерживаются на уровне кода, но не пошло... Почему?
Re: Почему в C# не любят кастомные операторы?
От: gandjustas Россия http://blog.gandjustas.ru/
Дата: 19.01.23 22:12
Оценка: +2
Здравствуйте, Shmj, Вы писали:

S>Вот в С++ любят. И ведь приятнее же написать

В C++ вообще любят извращения.

S>stringBuilder += "test" чем stringBuilder.Append("test") ?


stringBuilder += "test" эьо stringBuilder = stringBuilder + "test", он должен возвращать новый объекти не изменять старый. Поэтому stringBuilder.Append

S>Вроде бы и поддерживаются на уровне кода, но не пошло... Почему?

Потому что C++ можно отдельно переопределить += и + и сделать их несогласованными, в C++ слава богу нельзя.

Да и в целом со стрингбилдером крайне редкий кейс, чтобы для него вводить такое в язык.
Re: Почему в C# не любят кастомные операторы?
От: Baiker  
Дата: 19.01.23 22:16
Оценка: +3
Здравствуйте, Shmj, Вы писали:

S>Вот в С++ любят. И ведь приятнее же написать


S>stringBuilder += "test" чем stringBuilder.Append("test") ?


Писать — приятно, СОПРОВОЖДАТЬ ХРЕНОВО!
Сидишь, в ус не дуешь, как вдруг:

door += mochalka * kaktus;


И сидишь, охреневаешь — что это за безумная арифметика и каким боком тут вообще всё?!
Перегрузка операторов хороша для весьма специфичных и крупных задач — если, к примеру, ВСЯ твоя прога состоит из вычислений комплексных чисел. Тогда насочинял операторов и всё у тебя ништяк! В реальной проге проще вызвать ОЧЕВИДНЫЙ метод, чем неочевидный крючок типа "@" — вот что он означает?

stringBuilder — это вообще позорное пятно библиотеки — наглядный пример безалаберности разрабов. Не умеете компилировать в быстрый код — вообще не беритесь за языки.
Re[2]: Почему в C# не любят кастомные операторы?
От: gandjustas Россия http://blog.gandjustas.ru/
Дата: 19.01.23 22:22
Оценка: -3
Здравствуйте, Baiker, Вы писали:

B>stringBuilder — это вообще позорное пятно библиотеки — наглядный пример безалаберности разрабов. Не умеете компилировать в быстрый код — вообще не беритесь за языки.

А были какие-то вариант? Во времена .NET1 даже генериков не было, поэтому стрингбилдер и появился. Сейчас он не нужен от слова совсем.
Во времена .NET2 стринбилдер был уже не так нужен, хотя по инерции его использовали там, где не надо.
Re[3]: Почему в C# не любят кастомные операторы?
От: Baiker  
Дата: 19.01.23 23:10
Оценка:
Здравствуйте, gandjustas, Вы писали:

G>Здравствуйте, Baiker, Вы писали:


B>>stringBuilder — это вообще позорное пятно библиотеки — наглядный пример безалаберности разрабов. Не умеете компилировать в быстрый код — вообще не беритесь за языки.

G>А были какие-то вариант? Во времена .NET1 даже генериков не было, поэтому стрингбилдер и появился.

Не понял связи SB и дженериков.

G> Сейчас он не нужен от слова совсем.


ВОТ! Про что и речь. Ума содрать жабу и выдать за C# — хватило, а написать эффективный манипулятор строками — нет. Потому и позорное пятно. Да ещё и книжек с библиотеками понаписали, где юзается SB. Новичок читает и не понимает, за каким фигом для строк требуется ещё и отдельный "эффективный класс".
Re[3]: Почему в C# не любят кастомные операторы?
От: Igorxz  
Дата: 19.01.23 23:50
Оценка: +4
Здравствуйте, gandjustas, Вы писали:

G>Здравствуйте, Baiker, Вы писали:


B>>stringBuilder — это вообще позорное пятно библиотеки — наглядный пример безалаберности разрабов. Не умеете компилировать в быстрый код — вообще не беритесь за языки.

G>А были какие-то вариант? Во времена .NET1 даже генериков не было, поэтому стрингбилдер и появился. Сейчас он не нужен от слова совсем.
G>Во времена .NET2 стринбилдер был уже не так нужен, хотя по инерции его использовали там, где не надо.

что-то я не понял, какие альтернативы стрингбилдеру, если нужно собирать большой текст из кусков (и таскать его по приложению)?
Re[2]: Почему в C# не любят кастомные операторы?
От: fk0 Россия https://fk0.name
Дата: 19.01.23 23:59
Оценка: +2 -2
Здравствуйте, gandjustas, Вы писали:

S>>stringBuilder += "test" чем stringBuilder.Append("test") ?


G>stringBuilder += "test" эьо stringBuilder = stringBuilder + "test", он должен возвращать новый объекти не изменять старый.


Кому должен? Что мешает вернуть референс на модифицированный старый?
Re[4]: Почему в C# не любят кастомные операторы?
От: pilgrim_ Россия  
Дата: 20.01.23 00:28
Оценка: +2
Здравствуйте, Baiker, Вы писали:

B>Не понял связи SB и дженериков.

+1

B>ВОТ! Про что и речь. Ума содрать жабу и выдать за C# — хватило, а написать эффективный манипулятор строками — нет. Потому и позорное пятно. Да ещё и книжек с библиотеками понаписали, где юзается SB. Новичок читает и не понимает, за каким фигом для строк требуется ещё и отдельный "эффективный класс".


Дык SB и есть тот самый "эффективный манипулятор строками", нет? Какую альтернативу ты ему видишь?
Re: Почему в C# не любят кастомные операторы?
От: vaa  
Дата: 20.01.23 01:38
Оценка:
Здравствуйте, Shmj, Вы писали:

S>Вот в С++ любят. И ведь приятнее же написать


S>stringBuilder += "test" чем stringBuilder.Append("test") ?


S>Вроде бы и поддерживаются на уровне кода, но не пошло... Почему?


потому что есть string и интерполяция строк. в корке все это есть(+) и работает.
билдер стоит рассматривать как низкоуровневый код(см реализацию интерполяции).
☭ ✊ В мире нет ничего, кроме движущейся материи.
Re[4]: Почему в C# не любят кастомные операторы?
От: gandjustas Россия http://blog.gandjustas.ru/
Дата: 20.01.23 10:12
Оценка: +1
Здравствуйте, Baiker, Вы писали:


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 авторы книжек толкали идею что "строки плохо и медленно, стрингбилдер хорошо" и это тянется до сих пор. До смешного бывает: я вижу код, где вместо конкатенации трех строковых переменных люди городят стрингбилдеры.
Отредактировано 26.01.2023 17:02 VladD2 . Предыдущая версия .
Re[3]: Почему в C# не любят кастомные операторы?
От: gandjustas Россия http://blog.gandjustas.ru/
Дата: 20.01.23 10:17
Оценка: +2 -1
Здравствуйте, fk0, Вы писали:

fk0>Здравствуйте, gandjustas, Вы писали:


S>>>stringBuilder += "test" чем stringBuilder.Append("test") ?


G>>stringBuilder += "test" эьо stringBuilder = stringBuilder + "test", он должен возвращать новый объекти не изменять старый.


fk0> Кому должен? Что мешает вернуть референс на модифицированный старый?


Здравый смысл мешает. Что например должно вернуть выражение x + x + x, если плюс модифицирует первый аргумент?
Re: Почему в C# не любят кастомные операторы?
От: Serginio1 СССР https://habrahabr.ru/users/serginio1/topics/
Дата: 20.01.23 13:34
Оценка:
Здравствуйте, 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

и солнце б утром не вставало, когда бы не было меня
Отредактировано 20.01.2023 13:42 Serginio1 . Предыдущая версия .
Re[5]: Почему в C# не любят кастомные операторы?
От: Baiker  
Дата: 20.01.23 19:43
Оценка: -1
Здравствуйте, pilgrim_, Вы писали:

_>Дык SB и есть тот самый "эффективный манипулятор строками", нет? Какую альтернативу ты ему видишь?


Что мешает внутри САМИХ СТРОК иметь тот "эффективный код" для сборки множества строк в одну??
У канпелятора МОРЕ инфы! Например, что строка конкатенируется в цикле. Или большом методе. Вот и подставляйте туда "эффективный код"!
Re[6]: Почему в C# не любят кастомные операторы?
От: gandjustas Россия http://blog.gandjustas.ru/
Дата: 20.01.23 21:59
Оценка: +2
Здравствуйте, Baiker, Вы писали:

B>Здравствуйте, pilgrim_, Вы писали:


_>>Дык SB и есть тот самый "эффективный манипулятор строками", нет? Какую альтернативу ты ему видишь?


B>Что мешает внутри САМИХ СТРОК иметь тот "эффективный код" для сборки множества строк в одну??

B>У канпелятора МОРЕ инфы! Например, что строка конкатенируется в цикле. Или большом методе. Вот и подставляйте туда "эффективный код"!

Потому что для совместимости с апи ОС строка должна быть массивов двухбайтных символов. А стринбилдер устроен совсем не так, там массив сегментов и хитрая логика их перестроения при редактировании. Построение массива байт из него — затратная операция.

Кроме того строки в .net иммутабельны, что сильно облегчает их использование в многопоточном окружении.
Re: Почему в C# не любят кастомные операторы?
От: vaa  
Дата: 23.01.23 02:33
Оценка:
Здравствуйте, Shmj, Вы писали:

S>Вот в С++ любят. И ведь приятнее же написать

Безумцы!
S>stringBuilder += "test" чем stringBuilder.Append("test") ?

S>Вроде бы и поддерживаются на уровне кода, но не пошло... Почему?


Ответ:
bool? x = null; if(!x.HasValue)    Console.WriteLine("Hello, World!");


Читоб? у нас же x нал! следующая инструкция должна отстрелить ногу(?). но нет.
из-за чертовой магии оно работает! теперь посчитаем кол-во таких фишек компилятора которые нужно знать.
да ну нафиг, лучше уж F#, common lisp и zig, чем гребанные операторы.
☭ ✊ В мире нет ничего, кроме движущейся материи.
Re[2]: Почему в C# не любят кастомные операторы?
От: Ночной Смотрящий Россия  
Дата: 23.01.23 16:25
Оценка: -1
Здравствуйте, vaa, Вы писали:

vaa>из-за чертовой магии оно работает! теперь посчитаем кол-во таких фишек компилятора которые нужно знать.


Это фишка рантайма, емнип.
... << RSDN@Home 1.3.17 alpha 5 rev. 62>>
Re[3]: Почему в C# не любят кастомные операторы?
От: vaa  
Дата: 24.01.23 02:06
Оценка: +1
Здравствуйте, Ночной Смотрящий, Вы писали:

НС>Здравствуйте, vaa, Вы писали:


vaa>>из-за чертовой магии оно работает! теперь посчитаем кол-во таких фишек компилятора которые нужно знать.


НС>Это фишка рантайма, емнип.


Разве?
Вроде ж, компилятор это
bool? x = null;

заменяет на это
Nullable<bool> x = default;

иначе с чего бы у x можно было бы дергать методы в рантайме?
☭ ✊ В мире нет ничего, кроме движущейся материи.
Re[4]: Почему в C# не любят кастомные операторы?
От: rameel https://github.com/rsdn/CodeJam
Дата: 24.01.23 07:40
Оценка: +2
Здравствуйте, vaa, Вы писали:

Фишка рантайма в работе с Nullable<> — боксинг и анбоксинг
... << RSDN@Home 1.0.0 alpha 5 rev. 0>>
Re[2]: Почему в C# не любят кастомные операторы?
От: Философ Ад http://vk.com/id10256428
Дата: 24.01.23 07:58
Оценка:
Здравствуйте, Baiker, Вы писали:

B>stringBuilder — это вообще позорное пятно библиотеки — наглядный пример безалаберности разрабов. Не умеете компилировать в быстрый код — вообще не беритесь за языки.


Ничего подобного! Код должен делать то, что ты написал, а не что-то ещё. Сложение строк порождает новую строку, и это правильно. Более эффективно это сделать нельзя, и ничего позорного в этом нет.
Хочешь эффективно собирать множество строк — таскай за собой SB: далеко не все собирают HTML или отчёты генерируют, иногда нужно просто сложить 2 строки и на этом остановиться.
Всё сказанное выше — личное мнение, если не указано обратное.
Re[4]: Почему в C# не любят кастомные операторы?
От: Ночной Смотрящий Россия  
Дата: 24.01.23 08:07
Оценка:
Здравствуйте, Baiker, Вы писали:

B>Не понял связи SB и дженериков.


По идее если к List<string> добавить немного сахарку (работу с платформозависимым newline в основном), то результат будет примерно тот же.
... << RSDN@Home 1.3.17 alpha 5 rev. 62>>
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.