3. WinForms или WPF? Зависит от задачи. Для небольших проектов, скорее всего, будет достаточно винформочек. В случае, если разрабатываемое приложение достаточно серьёзное, то возможно его стоит писать с использованием WPF. WPF очень хорошо работает с паттерном MVVM ( https://ru.wikipedia.org/wiki/Model-View-ViewModel ), и позволяет пилить очень кастомизированные интерфейсы с помощью XAML, что в случае с WinForms делать намного сложнее.
4. Мне тут знакомый_нейм сказал, что C# умирает, это правда? Может не стоит его учить? Неправда. C# активно развивается, недавно вышел .NET 5 и С# 9.0. Дотнет стал полностью опенсорсным и кроссплатформенным. В том же энтерпрайзе он очень даже востребован.
5. Какую IDE выбрать? Для Windows самым очевидным вариантом будет Visual Studio ( https://visualstudio.microsoft.com/ru/downloads/ ). Бесплатной Community-версии более, чем достаточно для большинства задач. Также есть версия для macOS. Кроссплатформенный полуредактор/полуIDE VS Code ( https://code.visualstudio.com/ ). Кроссплатформенный IDE Rider ( https://www.jetbrains.com/rider/ ). Также существуют C#-плагины для Atom и Sublime Text, но функциональность там достаточно сильно урезана.
>>2399284 (OP) Кто нибудь запускал юнит тесты .NET 6 VS 2022 на линуксе? Чего-то нихера у меня не пашет, пишет якобы среда WSL не сконфигурирована хотя вроде все по инструкцции сделал. Более того, до этого из студии на той же WSL собирал сишный проект на CMake и все сходу завелось, студия сама предложила доустановить на линукс недостающие компоненты.
>>2399294 На днях тестовое на ждуна делал - с прокторингом (запись камеры, микро и экрана) разбирал, что выведет непотокобезопасный отвратительный говнокод и кучку задачек на логику
>>2399435 Там типа обычная очередь из квадратов чисел от 0 до 9999 И по количеству ядер запускаются потоки, которые берут числа из очереди и суммируют в общую переменную
>>2399505 В то время на джаве никто ни с какими пространствами в анусах не заморачивается, когда на ассемблер# надо заебываться с такими низкоуровневыми вещами, как инклюды.
>>2399735 Там только проекты входящие в решение прописываются, ебушек. Если ты закинешь .cs файл с классом в каталог любого проекта, то он спокойно подхватится и будет добавлен в сборку проекта без какого-либо пердолинга
>>2399785 Между DLL и неймспейсами прямой связи нет. DLL соответствует сборке (assembly). В одной сборке может быть несколько неймспейсов. С другой стороны, классы принадлежащие одному неймспейсу могут располагаться в разных сборках.
>>2399744 Пространства имеют отношение к инкапсуляции. В джаве может это как-то иначе называется, но суть должна быть таже. Поэтому нет смысла катить бочку на неймспейсы.
>>2399785 Смотря как и смотря где. Если ты юзаешь управляемый ресурс, то может заругаться еще на стадии конпиляции, но это больше относится к классам и методам. Но так-то название dll это тоже часть пути, то заругаться может и не может.
Какой-то очень странный этот ваш ООП и крайне сомнительный в плане удобства. Делаешь всякие экземпляры там и сям, а потом часами сидишь ебешься с тем, чтобы все это друг с другом как-то связать, передать нужные данные через конструктор, параметры метода, хуй, пизду. Хочешь статики - дяди сеньоры грят иди нахуй, это не по ООПовски, потом все это не протестировать нормально. В итоге получаются ебучие макароны, где пятьсот раз приходится повторять одно и то же, чтобы ебучую цифру перекинуть из одного экземпляра класса в метод в другом. Все погромирование в целом ощущается как решение головоломки "как говно а передать в говно б". Может я что-то не так делаю?
>>2400025 Любая предметная область сводится к связыванию сущностей и передаче данных через что-то, и не важно, статики или параметры методов. Пиши хоть процедурно, хоть объектно, хоть функционально - одно и то же говно.
>>2400085 > Сколько книжек и каких надо прочитать чтобы можно было устроиться на работу? По самому языку хотя бы одну, ещё пару по всяким технологиям, алгоритмам, подходам. Но практика куда важнее книжек. > Почему не на гитхаб? Да хоть на чёрта лысого. Ты пишешь код в первую очередь для себя, чтобы оттачивать свои скиллы. На гитхабе чужие хеллоуворлды мало кому интересны, у каждого и так есть своя свалка учебных проектов.
>>2400085 >Сколько книжек и каких надо прочитать чтобы можно было устроиться на работу? У тебя не возникало желания написать приблуду, которая бы облегчила тебе работу? Может тебе не нравится как работает какой нибудь софт? Пробовал хотя бы делать моды для игр? Тебе нужна движуха, пусть идиотская с точки зрения КПД для немедленного обогащения, но решение какой либо задачи заставит тебя использовать определенные инструменты.
Читать книжки просто так — самая тупейшая идея, если ты не гений.
>2400054 >И как в этом всём разобраться? По-моему все легко. У тебя есть N задач, выполнение которых не зависит друг от друга. Например массив строк, которые нужно распарсить. Совершенно очевидно, что парсинг второй строки может выполняться независимо от парсинга первой.
Но если у тебя B-задача не может начать работу без результатов A-задачи, то мультитрединг не подойдет, офкос. Если задачи А и Б блокируют что-то еще, то вот тут уже используется асинхронность — на скорость выполнения А и Б не повлияет, но задо даст дорогу другим задачам. Как-то так.
>>2400029 В процедурке я могу объявить переменную в самом начале и потом без костылей обращаться к ней хоть со 100000-й строки кода. Понятно, что процедурка энивей неюзабельное и неподдерживаемое говно, но ООП тоже то еще мозгоебство. Создай экземпляр класса, в нем экземпляры остальных классов, из которых ты потом хуй вызовешь параметры из экземпляра основного класса, потом появляются другие сторонние классы, все это запутывается и здравствуй макаронная фабрика с огромным объемом кода и строками, вылезающими за границы экрана с постоянными проверками миллионов условий для того, чтобы сделать один пук.
>>2400159 Ну как бы да. Ты платишь всей этой сложностью за то, что у тебя появляется возможность сделать так, чтобы пук был чуть другой тональности просто подминив один из объектов на другой с таким же интерфейсом на этапе сборки этого дерева объектов.
>>2400159 > Создай экземпляр класса, в нем экземпляры остальных классов, из которых ты потом хуй вызовешь параметры из экземпляра основного класса, потом появляются другие сторонние классы Читай про dependency injection.
>>2400174 А, эта хуйня именно для того, чтобы упростить этот процесс? А я-то думал это какая-то сложная залупа для сеньоров, чтобы кучу разных технологий вместе склеивать.
>>2400209 Недавно работал с неуправляемой библиотекой, у которой ref аргумент функции — это указатель по сути. А он еще с стринговый, а каждая манипуляция со стрингами в C# создает новый экземпляр, а не переписывает данные по текущему адресу.
>>2399941 > Пространства имеют отношение к инкапсуляции. Давай определимся с терминологией? Инкапсуляция - это когда участок кода "капсула" делает одну вещь, делает её хорошо, и ей (капсуле) не нужны другие участки кода, таким образом код in-capsule. Неймспейсы же не имеют отношения к инкапсуляции в том виде, в котором я только что задефайнил. Неймспейсы позволяют нескольким "капсулам" обмениваться данными, что имеет отношение к интерфейсам, которые опять же не имеют отношения к ООП.
Поясните за unmanaged ресурсы а именно что ими является. Про потоки понятно (хотя не понятно нахрена после .Close() вызывать .Dispose()). За чем ещё приходится подчищать?
>>2400268 В первую очередь это какие-либо дескрипторы ОС. Даже если ты дёрнул Close и вернул их ОС, то дергать Dispose нужно на случай, если в классе реализован финализатор с Dispose паттерном. В таком случае, если класс грамотно написан, в методе Dispose дернется SuppressFinalize для объекта и сборка мусора пройдет быстро и безболезненно. А если не дернешь, то сборка мусора пойдет длинным путем с вызовами финализаторов в отдельном тредике и возможностью для программы развалится нахуй, если финализатор кривой, так как исключения выбрашенные в финализаторе обработать никакой возможности нет.
>>2400292 >>2400237 Как говорится заставь дурака инкапсулировать, он абсолютно все спрячет и будет связывать интерфейсами. Инкапсуляция позволяет применять имена методов и полей только в пределах своей среды обитания. Инкапсуляция, прежде всего это возможность что-то скрыть.
А у тебя суперфанатичная крайность: ну вот передо мной топор, я буду им и дрова рубить и кашу готовить.
>>2400425 >По сути просят готового спеца Самые обычные требования к бэковику. >в соло тащить небольшой проект, под видом джуна. Обычная практика для мелких галер. Но опыт даёт ебейший, по сравнению с работой в команде все 2-2.5х. Если лояльно к проёбам на начальных этапах будут относиться то вообще всё норм.
>>2400499 >>2400509 А для чего эти изъёбы если и для поля можно сгенерить геттер-сеттер? Это же по-идее и память дополнительную занимает или оно всегда в компайлтайме резолвится?
>>2400511 Не для каждого поля нужно публичное свойство, но для каждого свойства нужно поле. В C# сахар делает то, что ты бы сделал руками, памяти занимает настольк незначительно, что вообще похуй
>>2400555 > Какое "сейчас"? Такое "сейчас", что раньше "is null" и "is not null" не было. Теперь "== null" и "!= null" можно полностью заменить. Но тут вопрос этого ли добивались майкрасофты или же они добавили "is null" / "is not null" для других целей.
>>2400566 >"is null" и "is not null" да хуй знает, я бесикоблядь, у нас это было всегда. Если структура, то использовали "=", если ссылочный, то "is".
>добивались майкрасофты C# и бейсик объединяют. С моей точки зрения, такое различие дает визуально понять, что сравнение идет по значению или по ссылке. Сам проебывал порой, если бы не ор студии.
>>2400634 Петушарп является клоном жабы и фактически ничем не отличается, только в некоторых местах петушарп более низкоуровневый, чем джава. А хорошие программисты умеют кодить на любом языке, ведь принципы чистокода везде одинаковые, кроме скриптопараши конечно.
>>2400643 >Чисто в постменчике проверял и нормально. Было дело, все так писали. Благо это был нест который многие грехи пропускает или позволяет на аутистах игнорировать.
>>2400648 Забавно, как петушарперы перемогают картиночками. Прямо как хохлы с пораши. Нарисовали свинью (и то, придумали свинью не сами, а спиздили идею и попытались перефорсить), и думают, что правы.
Хочу сменить свою 1 работу джуном. Устал работать за 20к. Писал чисто бекенд, razor и js не использовал. С базой работал только через entity . Не сказал бы, чтобы прям очень многое умею, но что-то сделать сам смогу. 7 месяцев жидкого стажа, иногда могу плохо написать большой запрос к базе на linq. У меня есть вообще хоть какие-то шансы?
>>2400656 >Писал чисто бекенд >иногда могу плохо написать большой запрос к базе на linq >чегоблядь.jpg А так подтягиваешь текущие знания, учишь фронтенд, получаешь лычку фуллстака и на ~80к можешь расчитывать.
>>2400660 Да просто писал запрос на 10 строчек кода и в итоге написал немного неправильно. В общем я жиденький джун, но я знаю людей, которые сильно слабее и получают хоть что-то, а не ебаные 20 тысяч. Лан, спасибо за совет, буду фронт подтягивать. В реакт лучше вкатываться?
>>2400642 >хорошие программисты >ньюфаг 2 месяца Олсо, BCL совершенно другая, фреймворки другие, окружающие технологии другие и так далее. Даже шарпосеньору понадобится пара месяцев для освоения.
>>2400674 Я внимательно слежу за вакансиями на разных источниках и в требованиях 9/10 фронтовых фреймворков - это ангуляр. Вью вообще только один раз видел.
>>2400681 А что по поводу знаний бд? Я нативный sql помню на уровне банальных крудов. На работе особо ничего не делаю на нем. Или моего знания достаточно?
Как его распарсить так, чтобы не полетело все пиздой в зависимости от региона. Эти данные не я генерирую. Может прилететь число как с точкой, так и запятой.
>>2400695 Там в одном классе как минимум два ID, ну тогда понятно зачем. Хотя это тупо — нужно создавать класс департамента, который в себе будет хранить ID, а не засирать им класс Course
>>2400566 >раньше "is null" и "is not null" не было is null появился еще в 7-м шарпе, is not - в 9-м.
>>2400540 >Я правильно понимаю, что сейчас предпочтительнее использовать is null вместо обычного сравнения == null >>2400566 >Но тут вопрос этого ли добивались майкрасофты или же они добавили "is null" / "is not null" для других целей. Операторы == и != могут быть переопределены в классе, а is null и is not null кладут хуй на любые переопределения операторов. Выводы сделаешь сам надеюсь.
>>2400620 >да хуй знает, я бесикоблядь Бейсик еще в 90-х называли языком плодящим умственных инвалидов от программирования. И что после него очень сложно избавиться от хуевых практик построения кода. >>2400620 >С моей точки зрения, такое различие дает визуально понять, что сравнение идет по значению или по ссылке. Это еще раз говорит о том, что приходя на новый стек/язык не стоит проецировать свой предыдущий опыт на него, а то можно знатно объебаться. Лучше прочитать доки и понять, что и зачем.
>>2400741 >Бейсик еще в 90-х называли языком плодящим умственных инвалидов от программирования. И что после него очень сложно избавиться от хуевых практик построения кода.
Сказал сишарпер. Ну так вали из шарпа тоже и полируй неуправляемый код.
>>2400743 Мне то зачем, если мне в шарпах все ок. Это ты уже второй тред ноешь: "Вот в бейсике было о-о-о, а в шарпе фу-фу-фу". Ну и косяк бейсика не в его сахаре или в неуправляемости/управляемости кода.
>>2400772 Eще раз для тупых. Операторы == и != могут быть перегружены в классе. И ты вполне можешь на условие if(item == null) получить true, даже если он по факту не null (ну вот захотелось создателю класса вот так) и наоборот при проверке if(item != null) получить true, хотя объект пустой (если чо, то операторы перегружаются статически, т.е. даже у пустого экземпляра отработает перегрузка, а не оригинал) А при проверке is и is not тебе будет похуй есть там перегрузки или нет. Т.е. если ты уверен, что в классах которыми ты пользуешься нет и не будет таких перегрузок или твоя логика включает в себя такие перегрузки, либо тебе просто похуй, то проверяй на null через == и != А если ты нормальный чел, то поймешь, что проверка через is и is not лучше, т.к. избавляет тебя от вышеописанных головняков.
>>2400823 >release >Ошибок не выдаёт Ну релизные версии не выдадут ошибок даже при запуске отладки из студии. А без запуска отладки даже дебаг версия программы просто закрывается или не запускается.
Может конфигурация сборки другая, может дело в импорте библиотек.
>>2400850 Сама программа консольная, она работает с пдф файлами, на отсутствие библиотек не ругается, просто запускается и быстро завершается, проверок исключений в коде нету
Кучу вариантов перепробовал и посмотрел в интернете, но ответа нету вообще.
>>2400853 Я думаю тогда надо уточнить, мало ли. Библиотека коммерческая. Может ли быть так, что из-за неё программа отказывается работать на других ПК? В смысле, что она отслеживает, что приложение запускается на другом ПК и не работает?
>>2400853 >на отсутствие библиотек не ругается А дело может быть не во отсутствии, а в их несовместимости. Ты можешь хотя бы main на свой код в try завернуть и в случае Catch Exception выдать меседжбокс или записать в txt с информацией об ошибке
>>2400879 >Попробую Попробуй глобальный кетч, как в видео
>Попробую, хотя в первый раз жаловалось на занятость потока для записи в файл Дубина стоеросовая. Ты когда тестировал, небось юзал простенькие файлы, которые быстро записывались и быстро освобождались. И как только этот процесс затянулся, то все пошло по пизде. Еще небось какой нибудь delay приписывал, щоб "наверняка дождаться". Я тебя насквозь вижу.
>Подробнее, ибо под конфигурацией я сходу понимаю железо, ОС и фрамеворк Например процессор: может интел, может амд, может 32, может 64. Читай что такое JIT-компиляция и чем результат отличается от машинного кода.
Есть два блока работающих независимо. Один должен выдать список строк, другой их должен обработать. Напрямую я передать не могу, я могу создать некое место обмена, куда все обращаются.
Есть какие-то решения для этого? Создать вторую переменную, котоаря будет неким семафором? А еще непонятно: в одном случае в листе будет 10 итемов, а в другом случае 40. А что если поступят еще 30, пока не обработаны предыдущие 20? Наверно надо дублировать список и только потом обрабатывать.
>>2400954 >Можно ли как-то в коде поднять права или учесть? Тогда какой был бы смысл в защите, если бы рандомный Васян с малварем сам себе бы повысил права?
>Можно ли как-то в коде поднять права или учесть? Лучше не хранить данные в чувствительных местах. А что ты там такого сделал, что без спросу убивает, почему не делает запрос на админские права?
>В свойствах папки, в безопасности даже всем давал полный доступ Это дерьмо не работало никогда. Даже в антивирусе ставил в исключения, все равно лезет.
>>2400958 Все файлы лежат в специально созданных папках, в системные я не лезу. Задача простая - открыть пдф, найти данные, потом этот файл разбить на страницы, которые сохраняются в отдельную с именем, которое создаётся на основе данных, потом изначальный пдф переносится в отдельную папку.
Путь, в котором это всё лежит задаётся из тхт файла или через аргументы.
В самом лучшем случае он создаёт две папки, но на попытку даже чтения пдф уже ругается.
Так, я прочитал за 5 дней: - The C# Player's Guide - C# 10 and .NET 6 – Modern Cross-Platform Development - Writing High Performance .NET Code Чё там дальше?
>>2401231 - ваши яблоки вкусные? - а зачем тебе яблоки? - да вот захотелось попробовать что-то кроме помидор? - так есть же гавно, иди говна поешь - новый вкус обеспечен
>>2401224 Тем более. В таком случае тебе надо читать строго по страничке в день и внимательно все практиковать, усваивать человеческий язык и избавляться от привычек, приобретенных в языке, который создавали шизофреники.
>>2401240 Разумеется. Петушарп - один из самых стройных и лакончиных языков на данный момент, если вообще не самый. А крестухон - поделие шизофреников, которое сейчас поддерживает сообщество таких же шизофреников. Попытки разобраться в огромной свалке под неприглядным названием С++ приводят к стойким повреждениям психики и требуют длительной реабилитации.
>>2401224 >>2401090 А зачем ты это читаешь? Если любишь читать, я бы посоветовал Чехова, например. Все подобные книги - они для новичков в программировании вообще, а не на языке. Я с куда меньшим чем у тебя бекграундом, когда перекатывался в решетку, не прочитал ни одной книги (ну одну на треть прочитал). Потому что это чудовищная потеря времени. Во-первых, в книгах ни одна тема не раскрывается исчерпывающе, и чтобы ощутить понимание, всё равно приходилось лезть и в документацию языка и исходники дотнета. Во-вторых, основы языка постигаются в первые часы изучения. А дальше уже ты предметно лезешь в доки по своим вопросам, либо гуглишь для своей задачи а как вот это сделать.
>>2401245 Если взять и переписать весь дотнет с нуля, то будет да, так как ты описал. Но огромное количество кода написано и до сих пор используется без всяких типов, с кучей магической рефлексии и атрибутов. WinForms, WFP, ASP и EF, если делать на новом шарпе, могли бы быть прекрасными, но в нынешнем виде - они на уровне джаваскрипта.
А как вам null-допустимость? Мне кажется идея отличная. Но проблема в том, что C# и его фреймворки уже давно сформировался. Поэтому даже на уровне включаемой/отключаемой эта фича сомнительна. Нужен короче новый СИ, который избавится от всего легаси говна. Какой-нибудь Си Некст.
>>2401306 Вся стандартная дотнетовская либа уже давно переписана в стиле новой модной нуллабилити. А помойные ашотобиблиотеки если не поспевают за трендами, то идут нах.
>>2401312 > Вся стандартная дотнетовская либа уже давно переписана в стиле новой модной нуллабилити Хм, и вправду переписана. А может быть такое, что они нуллабилити по умолчанию врубят в будущем? Или такое исключено?
>>2401315 >нуллабилити по умолчанию врубят в будущем? Всё к этому идёт. Хотя Nullable<T> в этой концепции выглядит по-идиотски. Потому что как писать в дженериках T? - это слишком ambiguously. Лучше бы её переписали на Optional<T> и убрали все двусмысленности с null. Впрочем и DBNull тоже мутный класс.
>>2401689 Ты сравниваешь лучшую иде всех времён и народов Студию, написанную на быстрых и лёгких крестами с шарпом, с васянским Райдером на тормознутой прожорливой жабе. Что тебя удивляет?
Сап двач, помоги с решением проблемы. На VBA в экселе макросом нужно из одного листа сравнить порядок ячеек из второго листа и отсортировать их как во втором. Желательно что бы ячейки напротив ячеек которые будем сортировать, так же перемещались с ними. Пик - таблицы. Так же нужно на отдельный лист собрать данные которые будут собираться в таблицу в ворд, а потом выводиться на экран.
На пик3 код, который сейчас сортирует и считает кол-во задач на работника.
(А суть задачи в том, что бы в итоговой таблице в ворде были данные о количестве задач, фамилии сотрудников, и номера отделов. И что бы все было отсортировано по убыванию.)
Цитата задачи: На основании данных книги Data.xlsb написать программу на языке VBA, которая по нажатию на кнопку сформирует и выведет на экран документ "Отчет по загрузке" в MS Word. Требования: Исходные данные и их структура должны сохраниться. Отделы и их сотрудники должны быть расположены в порядке убывания количества задач.
Я тут увидел у жабистов довольно пиздатый гайд по вкату. Почему у нас нету? Во-вторых, куда список книжек проебали при перекате? В-третьих, скоро 11 шарп выйдет, а у вас там до сих пор про 9 написано. В-четвертых, вместо мертвого замарина надо вписать мертворожденный мауи.
Ещё там мельком упоминается Unity. Считаю это большим упущением, потому что это очень крутой и популярный инструмент в данный момент.
Ещё есть очень крутая книжка для самых новичков: Учимся программировать на C# вместе с Джоном Смайли она давно снята с продажи, но её легко можно купить с рук
>>2401982 >Ещё там мельком упоминается Unity. Считаю это большим упущением, потому что это очень крутой и популярный инструмент в данный момент. Популярный - возможно, крутой - не особо.
>>2402002 > крутой - не особо Как минимум для шарпера лучший выбор. Хочешь делай на ПК, хочешь на консоли, хочешь на мобилки, хочешь для ВР (для поплуярного ВР чата контент делается именно на юнити, кста).
Ближайший аналог - Unreal Engine. Но это тяжеловесный монстр для профессиональных команд.
>>2401975 Я знаю только что там должны были быть книги, ну и версии апдейтнуть надо. Главное - гайд. Его я точно не напишу.
>>2401982 >Ты можешь спокойно начать с шарпа 4.0 Это извращение. У нас модный молодежный язык. Зачем пердолить версии, которых даже в легаси уже не найти? Ниже седьмой сидят единицы.
>>2402008 >Но это тяжеловесный монстр для профессиональных команд. Совсем не обязательно. Мегаскансы+блюпринты - и вот ты уже можешь делать внушительные проекты даже в одну харю. На юнити же тебе придется знать шарп (причем специализированный) и много с какими вещами дополнительно заебываться. Но на анриле неудобно делать мобилки и в принципе невозможно делать 2д.
>>2402008 >Как минимум для шарпера лучший выбор. И опять ты не прав. Для шарпера это просто почти единственный выход если он хочет вкатиться в геймдев именно как в профессию. Но в 2К22 вкатываться в проф-геймдев - это хуйня из под коня. Говно в разы хуже галер, еще и платят меньше. А вот если ты хочешь вкатиться просто, чтобы забацать своей индюшатины на C#, то выбор у тебя намного больше. Stride, Godot, FNA, FlatRedBall и т.д.
>>2402040 >Although the compiler doesn't have a separate preprocessor, the directives described in this section are processed as if there were one. You use them to help in conditional compilation. Нету препроцессора. Есть только директивы, которые обрабатываются как будто бы он есть. Алсо, на собесах про такое спрашивают практически никогда. Единственный вариант который еще может быть это про nullable context если ты идешь конкретно на .net6. Но и то мало еще кто понимает как их толком использовать. А за использование остальных директив в коде обычно по ебалу дают, поэтому их можно и не знать.
>>2402014 >Мегаскансы+блюпринты Говно говненого говна. Эта хуйня годится, только чтобы геймдизы могли игровую логику для квестов накидывать. А любой нормальный разраб тебе в ебало нассыт за их использование.
>4. Мне тут знакомый_нейм сказал, что C# умирает, это правда? Может не стоит его учить? Неправда. C# активно развивается, недавно вышел .NET 5 и С# 9.0. Дотнет стал полностью опенсорсным и кроссплатформенным. В том же энтерпрайзе он очень даже востребован.
Вопрос а как вкатиться в шарпы? Шапка конечно интересная, но ответ на этот вопрос не дает. На 1 курсе были шарпы от преподш, которые сами параллельно работали, все следующие курсы прога будет полное говно. И как-то хочется в шарпы, раз я уже что-то знаю. Сами преподы сказали, что нас с руками и ногами возьмут, потому что мы повидали говно. Да вот хуй там. Я читаю, и почти на все джун позиции нужны опыт работы, знание ASP.NET/Какой-то конкретный SQL/JSON/XML/WPF/нужное вставить. Если это веб, то еще просят html js и прочую поебень. Для джуна. Допустим я выучу что-то из этого списка, а что потом? Искать вакансию с этой конкретной фичей? Про SQL вообще нихуя не ясно, он везде разный. Как вкатиться то, если я такой нахуй никому не нужен? Посоветуйте нужную комбинацию вышеупомянутых фич, чтобы гарантированно пойти куда-нибудь
>>2402068 Ты бы хоть инфу по теме поискал. Блюпринты абсолютно охуеннны. Офк, никто и никогда не будет с их помощью делать ААА, а вот индюшатину можно пилить за милую душу.
>>2402079 Я вот тоже вкатун и на безрыбье сделал свой план. Не ебу, насколько он адекватный, может местные мидлы-сеньоры поправят.
1. Основы погромирования+синтаксис+база ООП (я сейчас здесь). 2. Тут планирую пробежаться по первому курсу Нила Каммингса, где он показывает запиливание интернет-магазина на ASP+Angular. Это чтобы представлять устройство системы на поверхностном уровне. 3. После этого думаю подтягивать частные знания: SQL (можно учить любой, проще всего PostgreSQL), EF, как работают интернеты, нахвататься базовых знаний по JS/TS/Angular. HTML и CSS вроде особо не нужны, либо их можно подтянуть потом. 4. Поверхностно потрогать паттерны проектирования, алгоритмы и структуры данных, порешать задачки на Литкоде. 5. Второй курс Нила, где он на том же стеке делает что-то вроде соцсети. Тут я уже буду делать кастомный вариант и применять полученные в п. 3 и 4 знания. 6. Свой жирный пет, который будет нормально задеплоен на VPS и будет представлять собой потенциально коммерческий проект.
Там еще много всяких технологий типа Redis, Kafka, RabbitMQ, всякие системы логов, Докер и так далее. Я в душе не ебу, что это вообще такое, но вроде оно с джуна не требуется.
>>2402106 Хуйня план. Ты так выгоришь очень быстро. Мой тебе совет - освоить фронт, вкатиться работать с ним и уже после по вечерам доучивать шарп и прочую бекодрочь. Так у тебя и на поесть будет, а если не дурак и того больше и мотивация.
>>2402121 Я бы не рекомендовал брать этот план за основу, я ж полный ньюфаг не только в шарпе, но и в кодинге вообще.
>>2402123 Так я в бек хочу, фронт - это в качестве дополнения, накидать что-нибудь на бутстрапе и наговнокодить кнопочек на ангуляре. Просто для понимания как оно устроено и в резюме строчку добавить. А нормально залезать во фронт сейчас ни разу не быстрее бека. И конкуренция там охуевшая. И жс учит плохому.
Два вопроса от ньюфага. 1. Какие паттерны часто используются и их нужно выучить обязательно? Или строго все нужно учить? 2. Несколько раз уже слышал, что из-за того, что сейчас все на микросервисах, наследование практически не используется. Как это устроено? Ведь без наследования мы лишаемся полиморфизма, абстрактных классов, интерфейсов и ООП в целом.
>>2402182 > Несколько раз уже слышал, что из-за того, что сейчас все на микросервисах, наследование практически не используется. Вообще никак не связано. > Как это устроено? Пишешь большое энтерпрайзное приложение и вдруг понимаешь, что иерархия классов для большинства сущностей не нужна, ибо почти все задачи легко решаются без наследования. А там, где нужна, достаточно поля "тип" из какого-то енума + в местах, где надо по-разному обрабатывать разные сущности, делается простой свич. В итоге за счёт отсутствия абстрактных классов всё прозрачно, меньше кода, легче дебажить и тестировать. > Ведь без наследования мы лишаемся полиморфизма, абстрактных классов, интерфейсов и ООП в целом. Класс не наследуется от интерфейса, он его реализует. Большая разница. При отказе от активного использования наследования интерфейсы никуда не деваются. Насчёт "ООП в целом" спорно, ООП все по-разному понимают, и в современном понимании наследование является необязательным элементом.
В общем думаю сделать пэт проект - облако. Сейчас на стадии предварительного планирования есть пара вопросов. 1. Как имитировать платежи? Есть какой-то пакет или сторонний сервис с колбэками, имитирующий платежи? Чтобы примерно понимать вообще, как оно работает. 2. Как сделать маршрутизацию вида ...:5001/files/papka1/govno/jopa, это обрабатывалось одним контроллером и он ловил "/papka1/govno/jopa" в параметр
>>2400293 Это кросс в том числе и линукс и винда. Плюс мобильщина бывает на планшетах а там точно таблицы нужны. Больше похоже что педерасты из МС опять хуйней страдают как было с UWP.
>>2402277 >а там точно таблицы нужны да ну. разве что в специализированном софте аля "таблицы". ибо больше нигде и не видел. А так нужно отделять DataGrid от GridView
>>2402302 Энтерпрайз это специализация дот нета же, в бизнес задачах почти всегда надо табличку показать. DataGrid и GridView это же просто разные названия у разных платформ\производителей того что в винформс называлось DatgaGridView.
>>2401927 1. VB.Net имеет много общего с C#. Но VBA - не имеет ничего общего с C#, так что не в ту дверь ты стучишь. Хотя на шарпе можно написать надстройку в формате VSTO или либу и экспортировать нужные методы в COM, а потом подключить к коду VBA через Tools/References. 2. Допустим у тебя есть таблица сотрудников. У сотрудника есть ID. И есть таблица Порядок сортировки, где каждому ID указан порядок. Тогда ты должен либо формулами Excel (ВПР, ИНДЕКС, ПОИСКПОЗ, СРЗНАЧЕСЛИМН или какой-то другой) привязать значение порядка сортировки из второй таблицы в первую, и по нему сортировать. Никакой VBA тут не нужен. 3. На VBA если делать. Создаешь структуру (Type Sotrudnik... End Type) под твои данные. Читаешь в массив такой структуры данные из таблицы 1, привязываешь к ней данные из таблицы 2, сортируешь массив (ну реализуй функцию, которая сортирует пузырьком, это легко), выводишь на нужный лист уже готовые данные. Type Sotrudnik FIO As String Identifikator As String SortirovochnoeZnachenie As Long End Type
>>2402342 Это иллюстрация что паттерны это развод наперсточников маркетолухов, тупо обозвали глобальную переменную модным словом и типа решили проблему. Вроде еще Луговский говорил что паттерны для дебилов и суть фиговый листочек для прикрытия уёбищности ООП.
>>2402200 >1. DI Это хуйня, а не паттерн, просто кристаллизованный зумерской дебилизм. Передача аргумента в функцию - рррряяяяя, я применил паттерн депенденси инжекшн. Чтение конфиг-файла - рррряяяяя, я применил паттерн депенденси инжекшн.
>>2402278 Инкапсуляция - это объединение данных и операций над этими данными в единую сущность. А скрытие - это скрытие, это отдельный принцип, который за каким-то хуем лепят вместе с инкапсуляцией.
>>2402377 Кто тебе этот бред сказал? Инкапсуляция это именно сокрытие, а объединение данных и операций это вообще класс или тип. Ты даже если не знал как правильно мог бы догадаться построив контпример класса с операциями над открытыми данными.
>>2402436 Зачем ты решаешь дейлики, чел? Как насчёт того, чтобы перестать индульгировать и найти наконец работу? Ну знаешь, там, мать/жену/дочь на курорт свозить, зубы/фигуру пофиксить, мотоцикл купить, etc.?
>>2402381 >Инкапсуляция это именно сокрытие Если что, то сокрытие спокойно реализуется и с помощью наследования и с помощью полиморфизма. Так что ты объебался.
>>2402341 >А синглтон какой-нибудь? Видел где-то список из примерно 4-5 маст-ноу паттернов, но проебал и не могу обратно найти. Синглтон достаточно просто знать, чтобы ответить если спросят. Самому про него лучше не спрашивать. (И кстати те синглтоны, что используются в DI - это не те же самые что в паттерне). Знать хорошо "Фабричный метод" и "Абстрактную фабрику" и чем от них отличаются. Дополнительно неплохо знать "Стратегию", "Цепочку обязанностей", "Команда". Этого в принципе достаточно.
>>2402444 Может для тебя повседневные, а кто-то не знает. Тем более реализация ДИ на уровне проекта не тривиальная задача. Нет, конечно, если готовенькое используешь, то может показать тривиальным.
>>2402418 Я этот гридвью как просто грид в впф встречал. Ну да, это совсем из другой оперы, просто лэйаут а надо имеено экселе-подобную табличку для редактирования и ввода данных.
>>2402538 Я думал, я один так про это думаю, и объяснял это тем, что джунишка и не способен постичь великой мудрости. А можно так на собесах говорить или пидорнут за такое?
>>2402563 Просто самому не надо на собеседовании инициировать рассказ про односложные паттерны. А вероятность того, что тебя спросят рассказать про синглтон, близка к нулю. Ну а спросят — расскажешь.
Но если джуна спрашивают, какие паттерны он знает, и он в пример приводит синглтон, а потом добавляет, что "это хуйня для дебилов", то ясен пень, что в таком контексте его воспримут как шизоида.
>>2402564 А если в одной итерации 10 000 итемов, а в другой 3 итема? Читал где-то, что Clear годится для обработки до 100 000 и если количество данных при каждой итерации не отличается разительно.
>>2402584 >что Clear годится для обработки до 100 000 Ожидание: Clear - это магический метод, которые много всякого проворачивает под капотом. Реальность: public void Clear() { _free_index = 0; }
>>2402538 Ты понимаешь что за этим стоит парадигма программирования? Ты пишешь такой код, который можно легко тестировать, потому что его части абстрагированы друг от друга и через внедрение зависимостей ты можешь быстро заменить реальный сервис на тестовый или отладочный. Зачем ты всё упрощаешь до шуточек для умственно отсталых, клоунидзе?
>>2402463 Это ещё полуправда. Дело усугубляется тем что в фаанг набирают по квотам педерастов, баб и чурбанов вместо толковых белых программеров. Не удивительно что в итоге получается кал.
WPF стили нужно переосмысливать. Чтобы закруглить края, нужно писать километры текста. Чтобы сделать кнопку с иконкой, нужна простыня, которая способна трижды обернуть земной шар.
Мне хочется написать 5 строчек кода, вместо создания стилей. Я нормален? Везде пишут "Чувак, ксамл стили специально созданы для этого", но нет — я думаю, что созданы для страданий.
>>2402660 > усложняет а не помоагает Абстракции ради абстракций действительно только усложняют, хотя некоторые рекомендуют их везде использовать. Но в некоторых случаях это жизненно необходимые вещи. В тех же проектах ASP.NET. Ты же не будешь каждый раз тестировать какой-то функционал с реальными сервисами? Тебе нужно подставить тестовые сервисы как раз через внедрение зависимостей. Или, допустим, в игре у тебя может быть много различных сервисов: первый работает с бекендом; второй с аналитикой; третий с платежами; четвёртый подключает фейсбук и другие социальные сети, загружает друзей; пятый грузит функционал стима; и так далее. Чтобы всё безумие нормально тестировать, тебе потребуется внедрение зависимостей.
>>2402657 Бля, ну это все очевидные вопросы. Зря я стринг в примере использовал. На самом деле возвращал сингл из функции, в которой тупо 2+2. Я очистил код до минимума, чтобы ничего не мешало.
Просто я-то думал, что я в принципе неправильно делаю и что ретёрн напрямую из функции это плохой подход.
Единственное, что я не упомянул, это то, что моя библиотека сконвертирована в unmanaged (просто расставлены точки входа в функции).
Правильно ли я понимаю, что принцип DI говорит о том, что мы все зависимости объявляем в конструкторах классов, а потом вызываем классы и связываем их друг с другом в Program.cs?
>>2402741 Внедрение зависимостей и называется, и выглядит как тупое говно, и им же оно и является, если использовать это понятие в узком смузихлёбном смысле, а не в широком (в широком смысле в каждую функцию при её вызове постоянно внедряются зависимости через аргументы). Диды всё тоже самое делали через define (в шарпе тоже доступно) или через конфиг-файлы, конфиг стринги, да хотя бы просто статик класс или синглтон сделать который скажет инстансу приложения, как и что инициализировать. И всё перечисленное выглядит намного нормальнее и намного менее будет удивлять, чем шизофренический код как слева на картинке.
>>2402882 >Почему в событии OnChecked, несмотря на установленный желтый бэкграунд, у меня какой-то голубой цвет? 1. Забилди проект 2. Посмотри внутри тега 3. Покажи скрытый код в #region
>>2403026 Я лучше подожду, когда эта хуйня издохнет. Надеюсь это будет быстрее, чем скорость ответа на SO. Я бы за потраченное время уже написал миллиард стилей обычным кодом.
Это выше моих сил. Каждый ебаный шаблон имеет свои НЮАНСЫ у каждого элемента, километры соплей вложенных в блевоту - шоб просто изменить цвет рамки. Ну вот если в тексбоксе есть цвет рамки, и в кнопке есть цвет рамки, НУ ТАК СХУЯЛИ шаблоны сука разные должны быть? СХУЯЛИ?
Я не профессиональный анальник, и я эти унижения терпеть не собираюсь!
>>2402738 >WPF стили нужно переосмысливать. Есть такое. Да, есть возможность задать свой дизайн, но это очень многословно. Да еще рукожопы из мс шаблоны контролов сделали жопно. А стили сами по себе неправильные в плане наследования.
>>2402767 >И всё перечисленное выглядит намного нормальнее только работает через жопу. 2 разных экземпляра зависимости - хрен тебе, подменить зависимость - хрен тебе, тестирование - соси хрен, тебе же сказали.
>>2402014 > шарп (причем специализированный) Какой такой специализированный шарп? >>2402053 > Но в 2К22 вкатываться в проф-геймдев - это хуйня из под коня. Нихуя. Если тебе это реально интересно, то работа кайф.
>>2403090 Надо больше джоб секюрити. На контур Recrtangle присваиваешь new SolidColorBrush, а на контур Ellipse — new SolidPizdaMamashy. И чтобы изменить толщину линии эллипса, простое присвоение Thickness хуй тебе поможет (ну и что, что есть такое свойство? Ты охуел?), поэтому ты должен пересобрать класс заново. Вот это я понимаю стандартизация и универсальность.
А может это простой бардак. Алсоу, я сейчас пишу плагин для проги, где похожие сектанты вещают точно так же. У них нельзя удалить 3д-модель клавишей delete, и это типа защита от вкатунов. А внутри все элементы интерфейса захардкожены, внутренние скрипты не умеют работать параллельно — новый убивает процесс текущего, а в самом языке отсутствует возможность написания бесконечных циклов. Но это не жопорукость разработчиков, это джоб секюрити.
>>2403148 > внутренние скрипты не умеют работать параллельно Самое смешное, что в официальном хелпе есть пример написания музыкального плеера, который подразумевает параллельное выполнение на протяжении всей сессии программы. Но добрая часть элементов тоже использует скрипты, поэтому попытка пользоваться программой во время работы плеера к хуям убивает оный. На что разработчики сделали маленькую приписочку, что "из-за однопоточности, работа плеера может вызвать трудности". Вот это вот классическое американское обтекаемое "может вызвать трудности" применимое к полнейшей невозможности.
Решил тут разобраться в аутентификации всякой, но чёт не понял - а где код, за неё отвечающий? Во всяких доках и гайдах пишут, что код можно менять под себя, лежит он в папке Areas/... А там нету нихуя Вот хочу я в юзера поля добавить, группы пользователей поменять или google auth прикрутить, где это можно сделать?
>>2403115 >Какой такой специализированный шарп? Хуево выразился. Шарп офк тот же самый, но в Юнити своя огромная библиотека. Поэтому тот же бекендер с ноги в Юнити не залетит, придется много чего учить.
>>2403182 >>2403190 Интересуюсь что лучше для rest запросов-ответов к использовать с десктопной приложухи HttpClient или WebClient или может что стороннее будет лучше? Какая лучшая практика для этого?
Дополню вопросом про кэш Планирую использовать для кэша sqlite в файлике Но насчет схемы бд решил что пусть будет копией того что на бэке висит + файлы в блоб/байнери хранить Если у клиента в кэше в дб такая же схема как и в дб на бэке это норм или моветон?
>>2403203 да нет связи десктопности с запросами берется что нравится refit например кто любит декларативность, другой рест клиент типа TinyRest или RestSharp или же тупо HttpClient c json расширением. (но это уже все таки low-level) или же HttpClient и ручная работа с json
>>2403203 структура кеша делается для ускорения работы. так что может быть как и "копия бд" аля "работаем оффлайн" (но даже в этом случае нет причин делать 1 к 1), так и вообще "ключ - значение". Все зависит от потребностей.
>>2403203 лично я использую Tiny.RestClient поскольку часто имею дело с рукожопными апи и строгость декларативности меня ограничивает, а опускаться на уровень HttpClient перебор
>>2403093 Ну вот в примере на Java, если тебе надо поменять зависимость, ты правишь файл service.xxx или хранишь несколько таких файлов. Что мешает сделать то же самое с конфиг файлом, с дефайнами или наконец с файлом со статик классом, поставляющим зависимость?
>>2403246 единственность зависимости мешает. А если у меня 2 экземпляра потребителя зависимости и каждому нужно своя имплементация зависмости? А менять статик класс вообще жопа - тут статикотипизированный язык
>>2403262 >них там своя секретная библиотека Думаю да, это же мелкософт, они всю жизнь такие, борьба с конкуренцией.
>>2403264 >На чистом winapi Вангую у мелкософта есть либы нативно встраивающие winapi в шарп, только вам лохам их не дадут, ебитесь прописывая каждый вызов ручками.
>>2403317 Может быть для среднего шарписта-кнопкоскруглятеля winapi и является недоступной магией, но для второсортного байтоёба оно весьма просто, примитивно и понятно.
>>2403377 Дело не в сложности, а втом, что майкрософт не дает нормального доступа из шарпа. Но для себя-то за закрытыми дверями по любому имеет, но другим не дает.
>>2403628 > Тяжело просто, поддержите морально И что ты уже освоил? Что можешь написать? Читать без практики бессмысленно. Нужно постоянно программировать.
>>2403660 Тебе надо учить не отдельные технологии, а программирование. Оно, в свою очередь, учится практикой. Ты мог выучить переменные, условные операторы и циклы с оопом, а после только с помощью этого уже запилить рабочее приложение. Но раз ты уже выучил больше, то пили приложение на асп или на какой стек ты там собрался.
>>2403670 все равно все упрется в "либу что работает с имаджами" из них Bitmap возможно пойдет лесом ибо почти стал win-only еще куча отвалится ибо фреймворк старый
net-vips экономный к памяти и шустрый, но отвалится потому что на линуксе память течет. останется монструозный имаджмаджик и более современный ImageSharp
ну еще есть либы типа opencv, но запускать это на лиунксах как в анекдоте "а теперь попробуем взлететь"
>>2403851 С нуля вкатываться тяжко, а если ты уже понимаешь за основы кодинга и ооп, как оно там вообще устроено, то тебе по сути надо выучить только синтаксис, фреймворк и немного почитать про около технологии.
>>2403934 >Почему ты пользуешься микроконтроллерами? >Почему ты пользуешься серверами? >Почему ты пользуешься телефоном? >Почему ты пользуешься телевизором? >Почему ты пользуешься автомобилем?
А все эти using который автоматом подставляются они разве никак на производительность/финальный размер бандла не влияют? Думается мне лучше ручками прописывать только то, что тебе нужно.
>>2404013 >И с вопросами про производительность/размер иди в C++, здесь всем поебать, запускается и ладно Я и так оттуда. И не вижу ни одной причины чтобы сразу не научиться делать всё правильно и качественно. С хорошо работающим кодом и работать приятно.
>>2404009 Вообще никак не влияет. На размер влияют подключенные библиотеки. Если работаешь в студии, то использую пикрелейтед команду, чтобы держать порядок в коде.
>>2404009 Непроставленный using наоборот может ухудшить производительность, а именно замедлить сборку мусора, так как незачищенный объект, у которого есть финализатор, придется во время сборки мусора финализировать. Лучше задиспозить его сразу.
>>2404109 Проще писать на предназначенном для этого языке, будет правильно и качественно. Так-то и на петухоне можно грузить нативные DLL-ки и ебаться с ними ради перформанса.
Пиздец, блять, вчера весь день писал код и всё было норм. Сегодня открываю и такая хуйня: The type or namespace name 'AspNet' does not exist in the namespace 'Microsoft' (are you missing an assembly reference?) Как это говно пофиксить блять, на со и прочем говне одно говно а не решения.
>>2404211 Студия 2022? Если так, то обнови до последней версии и поотключай все ненужные расширения (лучше вообще все, кроме самых важных). Там есть какая-то ебала, из-за чего она может неожиданно взять и потерять все референсы в проекте.
>>2404246 Закрой VS, открой папку с проектом, удали папку .vs, запусти проект заново. Если нету папки .vs, значит нужно включить отображение скрытых файлов и папок.
>>2403735 >требования выросли Был период бума айти, лет 8-10 назад, когда каждому ИП Гаранян стал нужен свой сайт с интернет-магазином и прочими интеграциями. Тренд подхватили буквально все, от банков до крупных промышленников, все стали набирать айтишников. Спрос был взрывной и чтобы закрывать эти дыры, стали брать в айти кого-попало, кто хоть что-то может. Даже продукты уровня лаба по информатике в 9Б стали продаваться как горячие пирожки. Стало очень выгодно открыть IT-шарагу, набрать туда сброд и пусть они пилят сайты, который хоть как-то можно продать, демпингуя ценой. Но рынок давно уже в стадии остывания, он перенасыщен. Говно - уже не продать. Сложные и уникальные решения под заказ уступают место простоте, минимализму и стандартным решениям. Даже дата-питухам стали показывать на дверь, т.к. во-первых, мало кто из компаний на самом деле имеет достаточное количество данных, а во-вторых, слишком много проходимцев, которые для начальства показывают петухон, а сами втихаря линейные тренды в екселе строят. Как итог, в 2к22 экспресс-вкат в программирование для соответствования рыночным требованиям реально занимает от 2 лет. Даже продавцы курсов уже не обещают вкатить вас за 3 месяца. Реально указывают сроки - 24 месяца. И если почитать отзывы на том же хабре от людей, которые не имели кодерского бекграунда, там реально приходится пахать и не спать ночами, тратя в день по 6-8 часов, что становится невыполнимым квестом при обучении без отрыва от основной работы. По факту мы видим, что рынку больше не нужны IT-джамшуты, а срок обучения программированию до начального профессионального уровня приблизился к сроку обучения в ВУЗе. В принципе, если из программы ВУЗа убрать физкультуру, философию, физику и электронику, основательно почистить математику, основательно почистить абстрактные компьютерные науки, то как раз бакалавриат сократится до 2.5-3 лет, что и имеем сейчас для вката с нуля (не важно, через курсы или самостоятельно). Времена, когда можно было выучить С++ за 21 день и вкатиться, прошли.
>>2403460 >не дает нормального доступа из шарпа Доступ ровно такой же, как из C++. Вот на этом сайте pinvoke (точка) net есть 99% всех WinAPI функций, которые для тупого шарписта прокомментированы и обернуты в шарп AS IS. Я как-то сам подобное делал для себя для одной хитрой задачи, оборачивая нужные WinAPI в нормальном ООП стиле.
>>2404361 Хуя какой ты толстый краб. Если что и перегрето так только веб. А помимо него так-то дохуя других сфер есть в которых конкретный такой голод. Мы к себе в фирму 5 месяц не можем найти годного мидла плюсовика.
>>2404433 Попробуй ещё. Только на этот раз постарайся получше. Я в такой же нищуковой конторе работал и там тех дир точно так же был убежден что условия у него охуенные. По факту было ниже в 2-3 раза средних зп в ДС.
>>2404374 Вот этот птичий язык "не можем найти специалиста", "отрасли не хватает 200 тыщщ айтишников", "на стройках не хватает 500 тыщ специалистов", "на заводах не хватает миллион рабочих рук" означает, что жадный пидор-буржуй не хочет платить рыночную зп, не может удовлетворить свой спрос на труд своим предложением оплаты. За 500к закрывается любая вакансия, так-то. Но капиталист хочет административными методами и мерами принуждения заставить людей работать на кабальных условиях. Если вы не можете на рынке труда найти чела на свою зп, то значит ваше предложение не релевантно. Да и вообще, смысл идти в плюсы в 2к22. Плюсы и так перенасыщенными проперженными токсичными дедами с запредельным ЧСВ, мол, в наше время... а сейчас зумерье-смузихлебы пошли... Так ещё и порог входа в плюсы завышенный, и зп при аналогичном опыте самая низкая по рынку. И язык древний и дышит на ладан. И лапши, и говнокода в нём в разы больше, особенно мелкие васянопроекты, они всегда ужасны. И культура разработки очень часто сугубо локальная и оторванная от мировых трендов. Вышел С++ 23? Не, не слышали, у нас Михал Петрович его не принял, у нас С++ 98. И рынок вакансий максимально уёбищен. На условном JS ты даже в мухосрани всегда будешь иметь выбор работы. А на плюсах скорее всего это будет завод и... всё. Поэтому в плюсы нормис не пойдёт. А если нужен плюсовик, плати х2 от зп на дж на той же позиции. Но ведь никто не будет столько платить. Плюсовик работает медленно, его время очень сложно окупить. Проще выгнать на мороз 3 плюсовиков и нанять одного дотнетчика.
Когда-то давно, лет может 5 назад, был популярен С++ CLI, который мог свободно использовать все дотнетовские либы. И на нём можно было писать более производительный код, полностью совместимый с дотнетом и шарпом. И можно было на нём как самому управлять памятью как в классическом С++, так и делать managed объекты, чтобы GC заботился о них. А как сейчас обстоят дела с С++ CLI? Он давно умер или же жив, актуален, развивается?
>>2404374 А меня возьмут? На плюсах разве что моды делал на сурс движок. Шарю за низкоуровневую архитектуру. Как устроен проц и как работает стэк, куча, указатели. Опыт в Reverse Engineering, чуть ближе к среднему наверное, шарю за виртуальные таблицы. Но в С++ дальше вот виртуальной памяти и написания драйверов не заходил. Знания на С++ можно сказать "поверхностные", потому что работал только с указателями, классами.
На сколько мои знания можно оценить, на джуниора сгожусь?
>>2404927 В штатах от 150К. Ща идет великое ударное переписывание всякого имбед-легаси-говна, на любые процы, которые не в Тайване производятся. От авто и ракет, до вибраторов и унитазов.
>>2404925 >Расскажите мне про три вещи: Это квазиунофантастика, ну то есть всем понятно
>async/await распараллеливает потоки, создает потоки или что? как и Task не имеет НИКАКОГО отношения к потокам. Является сахаром для кода вида (который в языках без асинков выглядит так)
DoSomething().Then(callback)
чтобы код выглядел как будто обычный. Компилятор преобразует метод помеченный async в конечный автомат ака объект с методами, которые он дергает когда приходит их время await (звучит сложно, но на деле тоже очень просто - посмотри на обычную ручную реализацию итератора, подобный подход же, даже в языках без async но с итераторами их и используют как замену)
>>2404927 >на джуниора сгожусь Если ты можешь взять реальную бизнес задачу и начать ее выполнять дрегая своего лида/наставника не более 2-х раз в день на 10 минут максимум, тогда годишься.
>>2404960 >Если ты можешь взять реальную бизнес задачу и начать ее выполнять дрегая своего лида/наставника не более 2-х раз в день на 10 минут максимум, тогда годишься. Ураа, я джун!
А можно как-то на ходу заблокировать параметр, чтобы его невозможно было перезаписать? Т.е. в одном экземпляре класса он у меня ReadOnly, а в другом — нет.
Подойдет блокировка на этапе создания экземпляра т.к. далее меняться не будет.
>>2404962 Да не, я хочу сам бирарь из сореца как-то получить, и сам сорец вклеить, а то бинарь кидать к коду как-то не очень опенсорцно, к тому же в бинаре могут быть бекдоры и трояны всякие, хуй знает что там вшито в этот пре-компиленный бинарь. Код вроде есть, а как сбилдить - хз. Чё, всё моно тянуть, блядь? Ещё и >make get-monolite-latest качает хуй знает что.
Или можно как-то именно это вот Mono.Data.Sqlite, отдельно сделать, чтобы не ебать себе мозг? Сорец вроде полный, но это не точно. И нет ни .csproj, ни .sln файла, блядь. Как создать - хз. Кто-нить может потыкать эту хуйню?
>>2404971 Например вопросы из серии "Почему было использовано именно это решение, а не другое" там где это не очевидно. Например у заказчика было такое желание левой пятки или архитектура смежных процессов навязывает такое решение и т.д. Ну или бывают стандартные вопросы "Чувак тут какой-то чел мне указания дает. Его можно сразу послать нахуй или не стоит, т.к. это гендир?"
>>2405024 >Т.е. в одном экземпляре класса он у меня ReadOnly, а в другом — нет. Ну так сделай его в другом тоже ReadOnly, или через свойство сеттер заблокируй.
>>2405103 Лiл, какой ещё такой гендир? Я удалёнщик, джентельмен удачи. Просыпаюсь в 11AM, кушаю, лениво захожу на доску на которую мне ПМ и точка заботливо залила новых тасок. Пишу код 2 часа, трекаю 6, пишу фронту мол, хуйня готова, чекай свагу. И всё, никаких тебе созвонов, никаких вопросов "а почему?" и т.д. >>2405115 Зачем мне субъективное мнение какого-то хуя, если я могу в интернете прочитать несколько разных точек зрения на вопрос n и выбрать свою позицию?
>>2405131 тебе УЖЕ показали как должно быть и чего от тебя ожидают. И ты достаточно накодился чтобы потом тебе по шапке на ревью не давали. Да и задачи тебе дают под твои скилы. Локфри многопоток с хай лоадом тебя писать не просят.
>>2405133 >тебе УЖЕ показали как должно быть и чего от тебя ожидают. Нихуя мне не показывали, я до этого сам ебашил книги, курсы и практику. С ревью конечно по началу меня ебали, но сейчас все эти моменты я пофиксил. >Да и задачи тебе дают под твои скилы. Самые разные. На мне сейчас 5 проектов. >Локфри многопоток с хай лоадом тебя писать не просят. Это же тааааааааааак сложно.
>>2405137 >С ревью конечно по началу меня ебали, но сейчас все эти моменты я пофиксил. это и есть работа с наставником. Только вместо "пойду спрошу как надо" тебе сами говорят "как надо", просто с матами и затрещинами. Результат одинаков )
>Это же тааааааааааак сложно. Еще как.
А насчет "пойду почитаю мнение" помню читал про volatile и кеши, где читаешь про "запрещает оптимизацию и не будет проблемы что ядро проца закешировало что-то", а потом читаешь кого то из светил шарпа, а он пишет "volatile гарантий таких не дает. и фраза что "но за счет когерентности кешей будет все норм" не является правильной".
>>2405143 >просто с матами и затрещинами. Да нет, обычный рабочий процесс где ты и не дурак, но и не в курсе всех тонкостей. >Еще как. Ну типо, поэтому я и написал "читаю несколько источников" а не принимаю на веру первый попавшийся.
>>2404935 Я не спрашивал как устроен async/await, то что это state machine Task я знаю. Тут вопрос в том как работает сам Task? Вот так мне надо было вопрос поставить. Смотрел на гитхабе что это ThreadPool, но тредпул это что? Он создает потоки? Вижу ты пишешь что нет, тогда что оно делает, как он взаимодействует вообще с потоками, откуда он их берет.
И то что async/await появился первым в сишарпе и об этом знаю.
>>2405196 Ну смотри. Допустим ты запускаешь что то асинхронное и передаешь калбэк, чтобы в конце работы его дернули. Но калбэк неудобен, его нельзя вернуть или поменять его расположение. Поэтому немного изменяется что вместо принятия калбэка асинхронный метод вручает тебе специальный объект и у этого объекта и будет в конце работы изменен статус ну и результат выставлен. И ты можешь подписаться на изменение статуса этого объекта и сам объект передать куда то Вот это и есть Task/Future/Promise/Defer. Это просто обещание что по концу операции там будет нужный статус и результат (если есть) и все.
Он ничего не знает про потоки. Он, как и CancellationToken, всего лишь токен с состоянием и возможностью подписаться на изменение состояния.
А работой в потоках заведуют другие места ThreadPool - создает фоновые потоки в которых выполняет задачи. Создавать потоки дорого, поэтому этот пул потоков их переиспользует. Task.Factory.StartNew и Task.Run() - которые планируют задачу в тредупуле (по дефолту) await, который доверяет решать где выполнять контексту синхронизации иначе пихает в тредпул. TaskCompletionSource - вообще никаких потоков.
>>2404935 >DoSomething().Then(callback) Не понимаю смысла этого кода. Это же то же самое что DoSomething() callback() Ведь пока не отработает DoSomething() всё равно программа будет висеть, поток-то один.
Тут явно что-то не так. Каким образом реализуется параллельность? Если не потоки, тогда должна быть их эмуляция так или иначе.
>>2405494 она будет висеть если DoSomething() блокирующий. Когда говорим про асинхронность - функции неблокирующие (иначе и нет асинхронности). Почему они не блокируют текущий поток - дело десятое.
Даже если один поток в системе (пусть будет жаваскрипт это) то в системе есть неблокирующие I/O. то есть когда читается файл или идет запрос в сеть, то поток не останавливается ждать. Поэтому в твоем примере калбэк будет вызван сразу, а не как продолжение DoSomething()
>>2405504 Легко. На уровне "мне вручили таск и не заблокировали мой поток" знание "почему не заблокировали" не нужно.
Внутри может быть сетевой запрос, отдельный поток (из пула или нет), а может даже отдельный процесс, или таймер с TaskCompletionSource - мне то какое до этого дело? А никакого. Это внутренние детали реализации, а я работаю с контрактом.
>>2405506 >>2405507 Раз уж взялись отвечать на вопросы зелени, так делайте это качественно. А не так, чтобы чувачок потом пришёл, а его хихикая про сабж спрашивают а он потеет и что-то там про рантайм мямлит.
>>2405507 качественно это в инете. Там тонны мануалов но если чел не понял и спрашивает, значит он хочет простое объяснение которое принесет ему понимание. Понимание сути - основа обучения. Если не понял основ - никуда не уедешь, а с основами и гугл научит легко
И я пытаюсь показать на ежиках, а не готовлю к собесу
>>2403086 Godot лучше тем что весит мало и на нем не только игры можно делать, а еще и приложения ага. А еще он лучше тем что открытый исходный код и лицензия MIT.
Так что да, с выходом Godot 4 он может и трахнуть этот ваш unity.
Task (объект) - тупо просто токен как и CancellationToken. Task (концепция) - возьмем кусок кода, который мы хотим ожидать окончания его выполнения, нарекем его таском(задачей) и ассоциируем с ним специальный объект
Они не имеют никакого отношения к потокам. Они говорят про выделение отдельных кусков кода (ака задачи) и ассоциацию с ними специального токена для наблюдения. Для унификации работы с этим. Есть тут где-нибудь хоть намек на то, где и как она будет выполнена? НЕТ
А дальше ведь понятно что их можно запускать, то есть можно "запустить таску", ведь по факту она кусок кода. Есть тут где-нибудь хоть намек на то, где и как она будет выполнена? НЕТ Просто что она будет выполнена, но не как. "запустить таску"==="выполнить таску" а не "выполнить в тредпуле"
Концепция деления на задачи и выполнения этих задач - перпендикулярны.
Task.Run(), несмотря на свое название, всего лишь утилитный метод помещения наших задач в тредпул, то есть сахар, чуть более сладкий чем Task.Factory.StartNew.
>Внутри может быть отдельный поток Да. внутри асинхронного метода, который еще таской называют. Но таской его делает "ты нам верни объект специальный, да сообщи в конце через него че как", а не "выполняется он в потоках или еще как"
>>2405815 Ты пишешь бессмыслицу. >возьмем кусок кода, который мы хотим ожидать окончания его выполнения, нарекем его таском(задачей) и ассоциируем с ним специальный объект В одном потоке только одна нить выполнения кода, поэтому концепции "ожидания выполнения куска кода" не существует. Код просто выполняется, как он написан, линейно сверху-вниз, ты можешь "ждать" только вставив sleep(), но тогда ничего не выполняется, просто твоя нить кода прекращает работу на некоторое время.
"Ожидание" как концепт подразумевает два и более параллельных процессов, иначе, в одном процессе, ожидание не существует как концепт, т.к. есть только один процесс работы, но нет процесса ожидающего наблюдателя.
Таким образом, вся эта кухня имеет САМОЕ ПРЯМОЕ отношение к потокам, потому что так реализуется параллельность в компьютере, не может существовать без потоков или их эмуляции.
Таким образом, ЭТО И ЕСТЬ ПОТОКИ, только не обычные потоки, а специальные синхронизированные потоки под капотом средствами самого языка. Всего лишь сахар НАД ПОТОКАМИ.
А ты говоришь >Task не имеет НИКАКОГО отношения к потокам Чушь.
>>2405846 > вся эта кухня имеет САМОЕ ПРЯМОЕ отношение к потокам >Таким образом, ЭТО И ЕСТЬ ПОТОКИ, только не обычные потоки, а специальные синхронизированные потоки под капотом средствами самого языка нет не имеет. Нет никаких спец потоков. TPL не сахар над потоками. TPL это просто реализация корутин Это концепт определяющий деление кода на блоки, которые работают асинхронно, планирование очередности их выполнения, связи между ними Это просто правила структурирования сопрограм и работы с ними (ожидание, статус, результат)
То есть таски это "вот это должно быть выполнено после этого" и "статус выполнения и результат будут в объекте Task"
Само собой корутины должны не только делиться, а и выполняться. И поэтому в TPL есть дефолтный "выполнятор" - дефолтный TaskScheduler выполняет эти корутины в тредпуле. и утилитные методы Task.Run() и Task.Factory.StartNew()
Но это всего лишь дефолтная реализация выполнения. Концепция корутин никак не затрагивает вопрос "как именно будет выполняться корутина" - ей ПОХЕР. Важно лишь, что она будет вообще выполнена, очередность и возвращает Task
А поэтому отлично работают планировщики в 1 потоке (GUI), ожидания задач запущенных в других процессах. А также >не может существовать без потоков или их эмуляции. TaskCompletionSource никаких потоков не эмулирует. Он всего лишь выставляет статус у Task )
>>2405846 упс. забыл. так что уточню "и работы с ними (ожидание, статус, результат)" следует читать как "и работы с ними (ПРИОСТАНОВКА, ожидание, статус, результат)"
приостановка и продолжение - одна из ключевых частей концепции корутин
>>2405786 >это разный синтаксический сахар, напузыривание всякой хуетой языка, Притом не это само по себе, а то что пытаются притащить всякую хуету из языков со динамической и слабой типизацией.
То есть таски, наоборот, АБСТРАГИРУЮТ от деталей выполнения.
var result = await DoSomething()
абстрагирован от деталей выполнения этого самого DoSomething(). внутри этого метода могут использоваться тредпул, потом заменены на foreground поток, а потом быть заменены на процессы или на таймеры с TaskCompletionSource - `var result = await ` продолжит работать не замечая этих изменений.
Даже .ContinueWith не выбивается из этой канвы "выполнение не мое дело", поскольку не сама занимается выполнением продложения, а доверяет это TaskScheduler-у (который можно подменить просто передав свой)
>>2405861 >корутин >асинхронно >планирование Это и есть потоки. Так они и работают, ведь процессоров на всё явно не хватит, вот и эмулируется выполняя по кускам там и сям, получая искусственную параллельность. Этот "выполнятор" находится в ядре ОС, производя потоки, так же как в C# такой же "выполнятор" делает те же самые потоки. Иначе параллельности просто не бывает, как концепция не может существовать в одной нити выполнения.
Ты ошибочно считаешь за поток только системные потоки от ОС, однако совершенно игнорируешь что C# у себя делает то же самое, та же машина потоков там работает, только обозвано по-другому. Но как поток ни назови, это всё равно поток.
Ну а задание "выполни это после того", это лишь сахар для удобства, ничего особенного, никакой концепцией не является.
>>2405884 Ёбу дал? Это более высокий уровень абстракции позволяющий формально доказывать корректность программы например. У тебя мышление слишком баётоёбское и приземлённое какое-то.
>>2405884 >Это и есть потоки. не вижу тут потоков. Асинхронность - всего лишь обещание не блокировать выполнение в данном месте. Планирование - всего лишь правила очередности чтобы не перепутались корутины - это блоки кода которые могут приостановиться и продолжить свою работу
нет тут никаких потоков. Асинхронные структуры построены на TaskCompletionSource и не используют никаких потоков (даже I/O) Process.WaitForExitAsync() какие потоки использует? Там работает процесс. Продолжение типа будет в потоке? так это уже другая корутина будет. И то, где она будет, тоже можно переопределить (свой TaskScheduler или контекст синхронизации)
>задание "выполни это после того", это лишь сахар для удобства у тебя смешались мухи и котлеты и кони до кучи. как концепция может быть сахаром. "выполни это после того" это сахар для чего?
>>2405889 Никто не спорит, что поток обмазанный синхронизацией под капотом это новый уровень абстракции. Ну и? Потоки никуда не делись, самое прямое к ним отношение.
>>2405891 >всего лишь обещание Еще богу помолись. Компьютер это не обещалка, колдун херов, заклинатель демонов: "сделай мне заебись". Вот результат рекламы программирования среди сброда уличного.
>>2405722 >Когда что юзать? Классы дают больше удобства пользования (для меня) Ну например если ты создашь класс Point со свойствами X и Y, то ты можешь потом присвоить значение отдельно только X или только Y. В то время как со структурами для достижения того же самого, тебе придется перезаписать структуру полностью т.е. new Point(X, Y)
Структуры важны, если необходима скорость. Например мне надо было рисовать динамические кривые безье и там только время создания дефолтного класса Path, который в себе содержал класс PathFigure, который содержал в себе класс BezierSegment и т.д. — все это, т.е. простое создание нового объекта отжирало столько времени, что ФПС падал чуть ли не в нулину, если такие объекты создавать в цикле. А у меня еще своих классов дофига, и все это используется функциями которые ожидают структуры, то я просто не мог добиться нормального фпс. Вот тогда я задумался про структуры, когда у тебя высокая частота обмена данными, какие-то математические расчеты которые провоцируют процесс упаковки и распаковки данных.
Короче, класс хорош, чтобы его один раз создать и потом использовать продолжительное время. Возможно это что-то комплексное и громоздкое. Структуры это такая херь, которая используется в циклах, в мат. расчетах — легко создал, легко забыл. В цикле можно хоть каждую итерацию создавать new Point или new Rect (а по другому и не получится). Попробуй Rect сделать классом — пизда фпс и памяти.
>>2405938 интересно как жависты живут без структур. ну ладно примитивные типы оптимизированы но допустим у меня картинка ARGB Идеально для структуры, вот пример имаджшарпа на пике. структуры удобна
но их нет в жава упаковывают в int что ли или используют шаблон "приспособленец"? или тупо работают с data, data[i+1] - жесть.
>>2405914 А кому это гавно нужно однопоточное? Меня лично бесит этот ваш JS , что с ним можно сделать кроме написания веба? Сишарп намного сложен чем JS и более обширен в применение. Тут даже многопоточность сделать можно.
>>2405958 >что с ним можно сделать кроме написания веба? например запилить "десктопный" софт который будет лагать, занимать кучу памяти и быть унылым говном. И при этом орать "десктоп умер"
>>2405955 Я думаю, что он уже загуглил и получил данный ответ. Но на самом деле я тоже ничего не понимал, потому что и с тем и с другим хеловорлд работал одинаково, пока не приперло.
>>2405944 >> интересно как жависты живут без структур. Используют классы вместо структур, а потом тратят кучу времени на пердолинг с настройками GC и выбивание у начальства серверов с бОльшим кол-вом ОЗУ
Не знаю куда писать. В общем есть приложение, дотпикером, внутри кода есть два интересующих меня блока это ключ для HMAC-SHA256(пик 1) и сам блок хеширования (пик 2), моих знаний не хватает. Собственно вопрос, можно ли узнать ключ с пика 1? И какой точный порядок хеширования? честно запутался и не имел опыта получения хеша в коде
>>2405160 А где ты видишь там .csproj-файл? Там Makefile чтобы make делать на линуксе. А для этого надо билдить весь mono/runtime а чтобы его сбилдить надо запустить >./autogen.sh и ещё и >make get-monolite-latest который качает хуй знает что. Короче пиздос какой пердолинг. Надо тупо код Mono.Data.Sqlite.dll заебенить и ебись оно конём. Как - хз. Я не ебу ваще как пропечатывать, все эти непонятные букаффы англюские, чтобы оно работало норм и не выёбывалось мне.
>>2406205 In C#, classes are always allocated on the heap. Structs are allocated on the stack, if a local function variable, or on the heap as part of a class if a class member.
Частично я оказался прав. Потому что я делал дизассемблирование (cheat engine) и моя структура лежала в стеке, а класс в куче.
>>2406161 Такой штоли есть разве, в .NET 4.0 ? Елси да, то нахуя тогда все эти изъёбства с System.Data.Sqlite.dll и Mono.Data.Sqlite.dll ? Два года уже ебусь с этим всем.
>>2405938 > Ну например если ты создашь класс Point со свойствами X и Y, то ты можешь потом присвоить значение отдельно только X или только Y. В то время как со структурами для достижения того же самого, тебе придется перезаписать структуру полностью т.е. new Point(X, Y) Схуяли. Ты путаешь с иммутабл структурами. > Структуры важны, если необходима скорость. Например мне надо было рисовать динамические кривые безье и там только время создания дефолтного класса Path, который в себе содержал класс PathFigure, который содержал в себе класс BezierSegment и т.д. — все это, т.е. простое создание нового объекта отжирало столько времени, что ФПС падал чуть ли не в нулину, если такие объекты создавать в цикле. А у меня еще своих классов дофига, и все это используется функциями которые ожидают структуры, то я просто не мог добиться нормального фпс. > Вот тогда я задумался про структуры, когда у тебя высокая частота обмена данными, какие-то математические расчеты которые провоцируют процесс упаковки и распаковки данных. > Короче, класс хорош, чтобы его один раз создать и потом использовать продолжительное время. Возможно это что-то комплексное и громоздкое. Структуры это такая херь, которая используется в циклах, в мат. расчетах — легко создал, легко забыл. В цикле можно хоть каждую итерацию создавать new Point или new Rect (а по другому и не получится). Попробуй Rect сделать классом — пизда фпс и памяти. Тут самое важное, что надо отметить - структуры нужны для локальности памяти. Если у тебя List<Point> и поинт это класс, то в списке будут храниться ссылки, и когда ты его будешь проходить в цикле - проц будет переходить по отдельной ссылке в какую-то залупу. А если поинт это структура - то они в памяти будут по порядку лежать, и проу сразу будет наперёд их в кэш подгружать, поэтому всё будет быстро. Ну и конечно структуры лишний раз не создают объекты в куче(хотя их можно закинуть в кучу), поэтому сборщика мусора не ебут.
Если после шарпа закатиться в С++, каких вещей, которые есть в шарпе, но нет в крестах, будет больше всего не хватать в повседневном кодинге? Про GC, атрибуты и скорость компиляции понятно.
>>2406434 >Схуяли. Ты путаешь с иммутабл структурами. Ну я часто сталкивался, что структуры не дают шатать какое-то конкретное свойство: что Point, что Rect. Насчет Size не уверен, кстати.
Если там стоит модификатор иммутабельности, то есть варианты почему так сделали. Я сука заебался с этим дерьмом, проще отдельно иметь переменные X и Y. Даже в функциях аругменты в большинстве случаев запрашивают координаты по отдельности, хотя могли бы поит принимать.
>>2406526 Я пытался вкатиться 10 раз, узнавал что-то новое, а оказывается, что это новое — вариация вывода строки в консоль. На 11 раз вкатываюсь, смотрю — незнакомая команда, гуглю, а это вывод строки на экран.
>>2406526 >Если после шарпа закатиться в С++, каких вещей, которые есть в шарпе, но нет в крестах, будет больше всего не хватать в повседневном кодинге? "Виртуальной машины". Твой код против операционной системы, без посредников
>>2406585 а какая разница где. "создан в каком то потоке" не значит что он и далее живет в этом потоке. Существование объекта в памяти к потоку не привязано.
>>2406527 >Если там стоит модификатор иммутабельности, то есть варианты почему так сделали Вариант один - мутабельные структуры злейшее зло. Заипешься следить за тем чтобы не было создано защитной копии.
>>2406293 А еще есть боксинг. И хз, откуда ты эту парашную цитату вытащил, но где и что аллоцируется будет решать .NET, а не C#, так что на собесе так никогда не говори.
>>2399284 (OP) Хочу установить Visual Studio 2022. Стоит ли гнаться за редакцией Enterprise или будет достаточно Community? Буду писать UWP, WPF и ASP.NET приложения, и возможно мобильные. Реально ли найти ключ для Enterprise в сети? Кое-что находил, но не знаю насколько они рабочие, проверить пока негде. Как вообще юзаете лицензионные VS?
Шарпобояре, подскажите. Сейчас работаю на легаси на winforms, но там есть и веб(подпустят ли меня к нему - хз) и куча всего. Как развиваться в свободное от работы время, что учить и самое главное - как? Опыт промышленной разработки набирается, но в вебе я буду даже через год вряд ли лучше обычного вкатунишки.
>>2406293 Если не играть в unsafe (и еще глубже), то просто нужно помнить стек может ссылаться на кучу (потому локальные ссылки на экземпляры классов в куче лежат в стеке без проблем), а куча на стек нет.
и следствие
- обычный метод, создаем инстанс структуры как локальную переменную будет создана на стеке
- обычный метод, создаем инстанс класса как локальную переменную значение инстанса пойдет в кучу, а значение ссылки на инстанс - в стек
- структура как поле класса. класс сылочный тип и лежит в куче. куча не может ссылаться на стек, а значит хранит все у себя Будет выделен кусок памяти куда одним куском лягут значения всех его полей. Если поля ссылочные, значит лежать будут сылки (они же лонги по факту), если поля значимые, то они сами там и будут лежать. внимание - место выделяется на все поля всегда, даже если они null
- массив значимого типа массив это ссылочный тип, а значит держит структуру у себя. и выше писал что место выделяется сразу А значит var test = new BigStruct[100000000] с радостью отхапает себе кусок в несколько гигов памяти
- массив ссылочного типа типы ссылочные и экземпляры лежат в куче, но сама ссылка на кучу это значение. и место должно быть выделено на сами эти ссылки и var test = new string[1000000000]; (побольше нуликов ибо ссылка всего 8 байт) тоже выжрет несколько гигов, хотя test[100] скажет что в нем null (правда чтобы увидеть ее в диспетчере задач нужно включить колонку "выделеная память", ну и студия сразу покажет тоже)
- боксинг хоть и магия, но ведет себя как класс обертка с полем структурой. Лежит в куче, ничего про стек не знает. А значит боксинг - создается экземпляр, структура копируется в это поле. анбоксинг - копируем это поле в локальную переменную (которая в стеке) и дропаем экземпляр обертки (очевидно мы не можем упаковать ref структуры, которые требуют жить в стеке)
- асинк метод асинк метод преобразуется в структуру конечный автомат (где лежит? хз. внутреннее дело рантайма), где локальные переменные это поля и правила будут как и у класса с полем структурой - все лежит вместе и поэтому ref структуры в async методе нельзя
>>2406637 да. есть полезные шняги. ключ реально. сразу после выхода стало реально ) и тулзы типа решарпера и supercharger подвезли. oz-code проблемен.
Для резюме на джуна/trainee написал простой webapi проект (aspnet, efcore, Mapster, FluentValidation, Serilog, xunit). Js и front-end слабо знаю, попытался на Vue наклепать что-то, но вышло очень примитивно, и боюсь что из-за этого бек будет слабее выглядить)
Как лучше: - давать ссылку на swagger, чтоб там и мапинги, и валидацию было видно - доделать/подучить фронт - оставить так же (в Readme гитхаба есть ссылки и на фронт, и на сваггер)
И вообще на джуна лучше чисто back-end вакансии искать или fullstack? Или через стажировки вкатиться попробовать?
>>2406611 Меня интересует вопрос, что происходит когда я создаю N потоков, ThreadPool за ними тянется и расширяется или он привязан на приложении/процессе или на каждом ядре?
>>2406621 Когда мы перемещаем тип значения в ссылочный тип, данные перемещаются (копируются) из стека в кучу. Когда мы перемещаем ссылочный тип в тип значения, то данные перемещаются (копируются) из кучи в стек.
>>2406757 нет. ты просто их создаешь. Они никак не привязаны к тредпулу тредпул не мифическая сущность это просто класс, который внутри себя создает потоки и перемылывает в них все что дают можешь написать свой тредпул даже
>>2406748 Я для того чтобы на джуна попасть пришел, сказал: Приветик, в общем, такое дело, кушц хочу, готов кодить за еду. Взяли. Шарп на тот момент я не знал, в школе - учил паскаль.
>>2407211 Нужны для тех случаев, когда тебе нужно передать функцию в качестве аргумента другой функции/методу. Посмотри Linq. Это отличный пример их использования. Ну и для механизма событий они необходимы.
>>2407211 > Когда просто так вызвать метод из какого-нибудь DI не вариант? Конечно вариант, просто больше кода надо писать, придётся создавать общий интерфейс, реализовывать его в классе с единственным методом, а в методе-приёмнике вызывать метод этого интерфейса. А с делегатами можно тупо передать метод или лямбду, и в методе-приёмнике её вызвать как обычную функцию. Тебе нравится писать больше кода, когда можно меньше? Даже в жабе заебались так делать и придумали сахарок.
>>2407430 >Много ли я (вкатун) упущу, если прочитаю книгу условного Троелсена о 7 версии? Нет, не много. Можешь вполне спокойно с седьмой версии учить. На освоение действительно значимых нововведений остальных версий языка максимум два дня уходит.
Это нормально что я устраивался на программиста c#, но в итоге пишу раз в неделю на visual basic и всё, прям как в экселе? Ну хоть платят нормально, 60 тысяч
>>2405785 > а еще и приложения ага Причём прямо щас, не дожидаясь четвёрки можно лабать бэк на шарпе и фронт на годоте, который запустится на всех актуальных платформах. Встроенный конструктор форм позволяет легко и привычно лепить адаптивные интерфейсы. Единственный минус, фронт всегда будет работать на опен гл ес, нет способа запустить его в режиме обычной оконной отрисовки без графического ускорения.
Помогите. Смотрите. Есть некие данные. Их нужно читать. У данных могут быть разные типы. Собственно в чем проблема. Я ничего лучше, чем вот такую вот табличку в базе делать - не придумал. Кто знает решение лучше? Просто я думал о какой-нибудь хитровыебанной системе с типа тегами и атрибутами и вот это вот все, а данные просто в строке хранить. Но сразу начинается ебатория, с тем, что нужно теперь делать постоянно запросы к базе, чтобы узнать какой же там тип данных, пропадает возможность сортировку нормальную и фильтрацию делать и вообще. С другой стороны- прикриплейд выглядит кродливо как-то. Короче. Как нормальные люди подобное делают?
>>2407876 То есть ты планируешь хранить такое количество полей, и будешь их грузить при каждом запросе, но не хочешь делать лишние запрос, чтобы узнать тип? Хз. Хранить тип енамкой, значение байтами?
>>2407966 Почему ты думаешь что я буду грузить все поля? Есть отдельная табличка Data в которой как раз енамкой указан тип поля. Собственно план следующий: при запросе каких-то результатов чтения - смотреть в Data какой там тип, и по этому типу - выбирать какие поля подгружать. Этот объект же это модель в базе. В приложение и публичное апи он просачиваться не должен будет.
>>2407996 ты бы еще на ассемблере накидал и спросил, почему в ассемблере жрет 1 кб. Очевидно же что net framework нагружен всякой хуйней и это тащится в сборку скомпилированную.
>>2408030 Так суть-то в том, что из-за разных типов - я могу делать фильтрацию и прочее на стороне базы, плюс использовать индексы, хуиндексы и прочее. Без этого - придется все уже в приложении это реализовывать. Ну, типа если там будет битовый массив - я не смогу просто написать WHERE UInt64Value > 10; WHERE ASCIIStringValue LIKE "Vasya" и т.д.
>>2408024 Ну и что мне делать, если мой руководитель из кожи вон лезет, чтобы на железках с 256МБ оперативки и процом ARM'овским за 2 бакса - запускали .Net? Я просто пытаюсь пояснить, что .NET - прожорливый, у него на все один ответ - вот, мы программулину запустили, она даже работает, жрет всю память, ну дык это потому что никто не умеет с .net'ом работать, а он где-то читал, что вообще на микроконтроллерах .net запускали, значит можно как-то извратиться. Но я как не ебался, не старался - ну минимум для реального использования - это ~150МБ надо, когда такое же приложение на плюсах - уже есть и оно всего 10МБ жрет и нормально работает, сверху даже Nginx запихнуть получилось и PHP и много чего полезного и оно нормально работает, а тут будет одно приложение .NET'овское жить и жрать все для себя. Я не представляю, какие аргументы можно использовать в такой вот ситуации, если все тесты и метрики показывают, что для такого вот слабого железа - .NET противопоказан. Плакать хочется.
>>2408045 Ты учитывай, что с .net 6 программы не отдают память, если в системе ещё че-то остаётся. У меня парочка хуёвин ест 0.85гб от 1гб, но я могу докинуть ещё столько же
>>2407996 ну а как ты хотел виртуальная машина, 1 мегабайт на стековую память по дефолту, GC нужно где то жить, и джиту развернуться, всякие CoreCLR
для таких придумали .NET Micro Framework
"Memory needs of about 300 kB; in contrast, the next smallest .NET implementation, the .NET Compact Framework running on Windows CE, needs about 12 MB"
>>2405553 >Какие недостатки у шарпа или дотнета? Отсутствие нормально оплачиваемой работы, даже в сравнении с JS, Java, про GOвно вообще молчу, там платят еще больше. Ну и тонны легаси с WFC, WebForms и тд Если без этого - один из лучших ООП языков на ровне с котлином
>>2408193 >Отсутствие нормально оплачиваемой работы Пиздишь, просто открой любой сайт с кодерскими вакансиями.
>даже в сравнении с JS, Java Где в два раза больше вакансий, но в десять раз выше конкуренция. Найс. Еще и языки говно.
>GOвно Скучно и перспективы мутные.
>Ну и тонны легаси с WFC, WebForms и тд Очень редко, большинство давно переехало с этого говна или срочно переезжает, потому что с вебформсами меньше чем за 300ккк/наносек никто ебаться не будет, такие вакансии просто сажаскрывают сразу же.
>>2408212 > речь про РФ Речь в первую очередь про штаты и Канаду. Технологичность - пиздец. 14 из 15 легаси, платят копейки. В Бритахе с этим получше, на удивление и новые проекты пилят, но платят все равно смех в сравнении с условным формошлепством на ноде. Германия - пиздец, сплошная жаба, правда с такими тоннами легаси.
>>2408045 пиши не .net 2.0 или 4, выше нет смысла залезать. Чем выше версия .net тем больше потребление памяти и тем больше весит сборка. В общем пообкатывай там разные .net версии и найди разницу.
>>2408304 >Пиздишь, просто открой любой сайт с кодерскими вакансиями. У нас понятия нормально оплачиваемой работы разные. Условные 300к ты можешь и на дотнете получать в РФ. На удаленку контрактором на дяду сэму ты не уйдешь, потому что проекты говно и платят ебучие копейки, я уже весь indeed перерыл, сплошной тухлят. Проекты сплошное говно, выбить условные 50$ в час еще нужно постараться.
>>2408304 >но в десять раз выше конкуренция На конкуренцию похуй.
>>2408304 >Еще и языки говно Говно, но кушать хочется лучше
>>2408304 >Очень редко Очень редко в РФ. В штатах подобного говна навалом, что-то конечно переписывают, но не на дотнет, а на условный питухон (реальный случай знакомого который переписывал вебформы на ноду) | Я только рад оказаться не прав, но это реальность о которой я сужу по вакансиям на indeed. 14 из 15 - говно.
>>2408332 Про забугры я слабо шарю, но по одной свалке вакансий судить точно рано.
>На удаленку контрактором на дяду сэму ты не уйдешь Дык если они ищут удаленщика из страны третьего мира, то очевидно, что это будет говнопроект, который просто надо на кого-то свалить за копейки и хуй бы с ним. Если ищут сотрудника в нормальный проект, то предложат релокацию.
>На конкуренцию похуй. Попробуй устройся на Реакт. Вакансий ёбаное море, куча разных проектов и годные зарплаты. Ты не устроишься.Ориентировочно никогда.
>>2408315 Это ты судишь по таким же удаленкам для третьих стран или это реальная ситуация конкретно на местах? Я от местных в пиндостане слышал, что дотнета там дохуя и больше с годными зарплатами и большинство на коре сидит.
>ноде За этот кусок недобэка с 1% рынка вообще что-то платят? Покажи, я такого чуда еще не видел.
>>2408332 >В штатах подобного говна навалом, что-то конечно переписывают, но не на дотнет, а на условный питухон (реальный случай знакомого который переписывал вебформы на ноду) Олсо, какой нахуй петухон и нода? На них можно развернуть сайтец локальной аптеки или там местного фитнес-клуба с онлайн-записью. Серьезные энтерпрайзы никто на такие технологии переводить не будет, потому что жирные приложения на петухоне и ноде не подлежат поддержке, это технологии для совершенно других задач.
>>2408363 >Дык если они ищут удаленщика из страны третьего мира, то очевидно, что это будет говнопроект, который просто надо на кого-то свалить за копейки и хуй бы с ним
Поддвачну, это действительно так, но на удивление на ноде пару норм вакансий по описанию видел. Я сужу по всему indeed, не только по плашкам remote contractor from anywhere Там большинство вакансий с дотнетом действительно какое-то говно и платят мало. Может этот ресурс у них не котируется, но я из СНГ брезгую на таком за такие деньги работать, в штатах я бы тем более за такие суммы не работал
Не знаю как сейчас, но года полтора назад еще на stackoverflow вакансии смотрел, в среднем по больнице ситуация одинаковая.
>>2408363 >куча разных проектов и годные зарплаты Я все что связано с фронтом не перевариваю, ангуляр еще более-менее, но верстку нахуй.
>>2408363 >реальная ситуация конкретно на местах Это реальная ситуация на аутсорс галере
>>2408363 >недобэка с 1% рынка вообще что-то платят? Платят, любители говностартапов с пердолингом по 8+ часов в сутки оценят. Размеренного темпа с планированием и нормальным Agile процессами там и не пахнет
>>2408369 >Серьезные энтерпрайзы никто на такие технологии переводить не будет Переводили какую-то CRM с вебформ на ноду В сортах говна не разбираюсь, но proof of concept на сколько я знаю заказчику выкатывали на NestJS >>2408369 >ноде не подлежат поддержке Смотря кто пишет, код на дотнете тоже не всегда подлежит поддержке, если его долбаебы писали
>>2408374 А зачем вообще пытаться в эту удаленку с дядей сэмом? Тем более сейчас, когда этот дядя в любой момент тебя нахуй пошлет, дикие проблемы с оплатой и так далее. У нас же локальных годных вакансий дохуя и больше. А если уж к сэму, то имхо надо по-нормальному с релоком.
>>2408380 >А зачем вообще пытаться в эту удаленку с дядей сэмом Платят значительно больше (при условии если идти на нормальные рейты 50$+) на меньше я не согласен >>2408380 > Тем более сейчас, когда этот дядя в любой момент тебя нахуй пошлет, дикие проблемы с оплатой и так далее. У нас же локальных годных вакансий дохуя и больше
Я в РБ, у нас рынок схлопнулся, в условный тинек идти не хочется, а больше толком ничего нет, у меня как раз с локальной галерой контракт заканчивается >>2408380 > А если уж к сэму, то имхо надо по-нормальному с релоком. А я и рыбку съесть и на пенек залезть хочу, релок предлагают аутсорс галеры, но там говно какое-то, ради условных 1500$ в месяц сверху переезжать ну такое
>>2408384 >Я в РБ Так вам вроде в рф устроиться должно быть легко.
>релок предлагают аутсорс галеры Много кто предлагает. Правда с уровня не ниже мидла. Если ты годный специалист (а СНГшные ценятся), то релокнет почти кто-угодно, это не так уж дорого в сравнении с тем, что ты им дашь.
>>2408391 >Много кто предлагает. Правда с уровня не ниже мидла. Если ты годный специалист (а СНГшные ценятся), то релокнет почти кто-угодно, это не так уж дорого в сравнении с тем, что ты им дашь. >>2408391 >Так вам вроде в рф устроиться должно быть легко. Я релок принципиально не хочу, в этом вся проблема.
>>2409215 Если бы я такое увидел на ревью - я бы тебя убил прямо на месте. Даже не просил бы нормально написать. Просто взял и убил прямо там. А показав этот код другим коллегам - думаю они бы помогли от тела избавиться.
>>2400211 Я вижу 2 причины: 1) Неуправляемые сторонние библиотеки 2) Очень тонкое место в системе, где нужно производить дохуя расчетов, при этом чтобы тут не мешался GC. Например это может произойти в какой нибудь системе реального времени, где данные поступают сплошным нескончаемым потоком - и тебе нужно их как-то обработать. Если тут будет GC, то есть шанс, что из-за его работы внезапно подвиснет поток и программа перестанет успевать за входящими данными
>>2404925 Асинхронность, это когда ты например отправил запрос куда-то там и тупо ожидаешь ответа. Например запрос на сервак или в бд. В это время у тебя программа фактически нихуя не делает, просто ждет. Парралелизм, это когда программа всё же делает, что-то считает например, отдавая это сторонним потокам.
Это основное отличие асинхронности от парралелизма.
При async await у тебя вообще таска может никуда не уйти из вызывающего потока, например если быстро выполнилось. Как правило работает это все же иначе. Если есть контекст синхронизации, который обычно объявлен общим по всей приложухе, то после await, выполнение 100% вернется обратно в вызывающий поток. Если контекста синхронизации нету, как в ASP приложениях, то выполнение как нехуй может вернуться уже в другом потоке. Это кстати основная причина того, почему await нельзя засунуть в lock и компилятор пошлет тебя нахуй.
Thread - низкоуровневая хуйня, никогда не создавай её ручками. Используй TPL - там хотя бы всякие тредовые пулы юзаются
>>2409474 >Если есть контекст синхронизации, который обычно объявлен общим по всей приложухе, то после await, выполнение 100% вернется обратно в вызывающий поток
неправда. оно вернется в контекст (который уже сам решит где ему выполнять) и то только если ConfigureAwait(true) - да, эта хрень по дефолту тру, но не у всех - пока мелкие игнорят просьбы сделать выбор на уровне сборки, другие (и я тоже) используют Fody.ConfigureAwait и делают ConfigureAwait(false) по дефолту
>>2409500 Бизнесу вообще программирование нахуй не всралось, ему нужна оптимизация процесса получения прибыли. И как это добьются четырёхглазые макаки из айти, ему насрать, пусть хоть через динамикметоды.
Всем привет. Подскжите, какой набор скиллов и проектов сейчас нужен джуну на позицию asp.net разраба, чтобы его резюме было заметно лучше чем у большинства конкурентов?
>>2409511 это кодогенерация. нужна там, где по какой то причине не хватает expression tree или же генеришь классы на лету. в мапперах всяких или обхода ограничений CLR. То есть в библиотеках. с приходом source generator стало менее нужным Я вот использую в маппере игнорируя CLR проверки на типы понимая возможные последствия конечно.
в обычном программировании нахер не нужно - там есть expressio tree
>>2409518 да да. конечно ) если ты будешь кодить год вместо 2х дней, то ему будет не насрать.
>>2409547 Вкатился недавно. Есть апишка с EF одна на гитхабе, но мне кажется её даже не смотрели. Есть год опыта смежного (не .net, но тоже кодинг). Тестовое делал с многопоточкой и сетями (нужно ковырять их специально глючный сервак по TCP и вытягивать данные). На собесе спросили чутка про подробности ООП и про внутреннее устройство коллекций.
>>2409557 но ты не решишь. Даже будь ты 100000 раз спецом - тупо писать больше. Если бы так решалось, то все бы писали на ассемблерах и высокоуровневые языки бы не родились (а зачем) и шарп бы не родился - а зачем если есть си
>>2409656 >потерял всего 30% по зп. Это ты что, на 700 баксов подписался? Чет совсем дешево, не ценишь ты себя. Я столько имел год назад на заводе стоя за станком (причем по старому курсу)
Есть класс, наследующий Grid. У этого грида есть дочерний элемент — эллипс, у которого есть событие MouseButtonUp.
Так вот, как бы, так сказать, ретранслировать это событие на родительский класс Grid. Я не хочу снаружи иметь доступ к эллипсу. Городить кастомное событие тоже не хочется — там многабукв.
Но я пошёл дальше, и нарыл такие коды: https://github.com/username1565/CSharpServers/tree/TCPUDPChat Короче, можно типа ещё и UDP прихуярить туда, чтобы и TCP и UDP было на одном порту, какбэ. И шо это даст? Казалось бы, нихуя, но... UDP поддерживаеть Multicast: https://metanit.com/sharp/net/5.2.php А значит, можно делать Peer Discovery в LAN, через Multicast, и так искать пиров, в локалке. А потом соединяться с ними по TCP или UDP, и короче добавлять их в Dictionary, дальше уже синхронить список пиров между ними (Peer Exchange).
>>2410282 А как же без TCP, если там HttpServer.cs увязан на TcpServer.cs? Это типа чо, по UDP - HTTP-запросы можно делать, и всякий HTML c JSON'ом передавать? Не, по-моему надо оставить TCP-сервер, как есть, чтобы не перепердоливать всё, нахуй блядь, а то можно вусмерть закрасноглазиться на голом энтузиазме, как я. Поэтому, взбрело в голову заебенить TCP+UDP, какбэ, и вроде как уже протестил, оно пошет, вон код.
Насчет DHT... Ну хуй знает... Хэш - IP, можно сделать в Dictionary, а потом тупо конвертнуть его в JSON, и дальше уже - можно тупо JSON хуярить текстом, в виде байт, по TCP, уже после установки соединения, и так синхронить эту хэш-таблицу с пирами, реализуя Peer Exchange. А уже между пирами, потом синхронить и хэш-таблицу с самой базой данных наноборды (там тоже хэш-таблица, тащемта).
Насчет NAT Hole punching, а он нужен этот пердолинг? Может просто upnp прихуярить туда, чтобы автопроброс порта работал, как-бэ, а дальше уже биндить всю хуйню на 0.0.0.0, чтобы на всех адресах оно пахало, и не выёбывалось. Но да, если только в локалке мультикастом пиров искать будет, то за NAT пиров хуй найдёшь, поэтому можно было бы замкнуть NAT Hole punching на самих пиров, и пока 1 пир есть, чтобы можно было его юзать, как ноды в криптоговнах.
Я думал есть уже пир, но как обычно придётся самозапиливать всю хуйню самостоятельно, ибо ебать какой я элитарий, я же на острие инноваций.
>>2410305 > А как же без TCP, если там HttpServer.cs увязан на TcpServer.cs? Это типа чо, по UDP - HTTP-запросы можно делать, и всякий HTML c JSON'ом передавать? Зачем тебе вообще HTTP? Ну, можешь построить туннель поверх UDP, чтобы он мог передавать HTTP, некоторые P2P-сети поддерживают подобное, оборачивают TCP-трафик в UDP. HTML и JSON можно передавать без HTTP, это просто формат данных, он ничего не знает о протоколе. > Не, по-моему надо оставить TCP-сервер, как есть, чтобы не перепердоливать всё, нахуй блядь, а то можно вусмерть закрасноглазиться на голом энтузиазме, как я. P2P-сети и перепердоливают всё. Там по сути приходится строить все уровни протоколов с нуля., только вместо IP-пакетов UDP-пакеты. > Хэш - IP Ещё IP может быть динамическим. Ещё под одним белым IP может сидеть тысяча узлов с серым локальным IP. 192.168.x.x. Хеш не должен знать о таких нюансах. Возникает другая теоретическая проблема - коллизии хешей, но это крайне редкая ситуация. > Насчет NAT Hole punching, а он нужен этот пердолинг? > Может просто upnp прихуярить туда, чтобы автопроброс порта работал, как-бэ, а дальше уже биндить всю хуйню на 0.0.0.0, чтобы на всех адресах оно пахало, и не выёбывалось. Допустим, проблему с пробросом портов на своём домашнем роутере ты решишь. А что делать с провайдером, который не даёт статический IP и не блокирует входящие соединения по TCP? Те же торренты в безтрекерной сети могут работать и с серыми IP. > Я думал есть уже пир, но как обычно придётся самозапиливать всю хуйню самостоятельно, ибо ебать какой я элитарий, я же на острие инноваций. Есть, те же торренты с API для шарпа. Но многие заточены под специфичные юзкейсы, и если ты собрался писать свою сеть общего назначения типа I2P, большую часть придётся реализовывать самому, потому что массово никому такие задачи решать не приходится, почти всем хватает традиционного клиент-сервера поверх TCP.
>>2410475 Для джуна главное софт скилы, а не знания. Ты можешь плавать в теории, не мочь в асинхронность, но иметь подвешенный язык, и тебя возьмут скорее, чем задрота.
>>2410358 >Зачем тебе вообще HTTP? Потому что наноборда работает по HTTP, а он по TCP, и HttpServer.cs, по коду, увязан на TcpServer.cs
>Ну, можешь построить туннель поверх UDP, чтобы он мог передавать HTTP Это как так? Через UDP HTTP-запросы отправлять, что-ли? >некоторые P2P-сети поддерживают подобное, оборачивают TCP-трафик в UDP. Бля, это ещё пижже, как-бэ, но нахуа? Прикол в то, что UDP пакеты пиздуют не последовательно, а как-бы вразнобой: >UDP использует простую модель передачи, без явных «рукопожатий» для обеспечения надёжности, упорядочивания или целостности данных. Датаграммы могут прийти не по порядку, дублироваться или вовсе исчезнуть без следа, но гарантируется, что если они придут, то в целостном состоянии. UDP подразумевает, что проверка ошибок и исправление либо не нужны, либо должны исполняться в приложении.
В то время как TCP-пакеты пронумерованы, и доставляются последовательно, в потоке (TcpStream). Это если HTTP поверх UDP слать, и если будет пиздатый запрос, то конец запроса может прийти раньше чем начало запроса, короче кусками запрос придёт - и хуй знает как всё это обрабатывать, блядь. Также, и ответ может пиздовать вразнобой, надо походу нумеровать пакеты, а потом их складывать в цепочку, и это будет какая-то задержка типа.
>HTML и JSON можно передавать без HTTP, это просто формат данных, он ничего не знает о протоколе. Ну ясен хуй, что хэш-таблицу нанопостов в виде JSON можно синхронизировать и по TCP и по UDP, между пирами. Как и список пиров, реализуя тем самым Peer Exchange. Но чтобы HTML передавать по HTTP, через UDP или мутить инкапсуляцию TCP over UDP - ну тут уже хуй знает, я такого не видел. TCP годен тем, что там держится коннект, после тройного рукопожатия, и инфа пиздует в потоке, а не вразнобой. Именно поэтому HTTP-сервер работает по TCP. Но TCP не поддерживает multicast, а значит и Peer Discovery. Поэтому я решил объединиь TCP/UDP в один сервер, и приебенить туда мультикаст-группу для поиска пиров. Но всё это в пределах локалки, не за NAT. Это как Tox, например, если в локалке два TOX-клиента поднять, они друг-друга сразу найдут Multicast'ом, и соединятся, и пока есть хотя-бы один коннект - оба пира в сети, и можно общаться даже без интернета. Ну а чтобы за NAT'ом приконнектится, тогда уже можно использовать внешние ноды: https://nodes.tox.chat и там походу есть уже NAT Hole punching или что-то вроде этого, хуй знает, там код на C и питоне - я просто не могу его читать, не зная синтаксис этих языков программирования.
>P2P-сети и перепердоливают всё. Там по сути приходится строить все уровни протоколов с нуля., только вместо IP-пакетов UDP-пакеты. Могу залить тестовый код. Я пока сделал такую хуйню, там короче TCP/UDP сервер вместе, на одном порту поднимаются, и к UDP-серверу присоединяется мультикаст-группа тоже. Затем, клиентская сторона, по таймеру срабатывает регулярно, и шлёт только мультикаст-запросы по UDP, на адрес мультикаст-группы. Если приходит ответ из мультикаст-группы, берётся IP откуда пришёл ответ, ну и порт дефолтный - порт TCP/UDP-сервера. IP:PORT добавляется в HashSet, и сразу выводится, на этот IP:PORT можно будет приконнектиться либо по UDP, либо по TCP. И дальше уже просинхронить этот HashSet, и прочее, когда установится TCP-коннект (так как UDP-пакеты будут идти вразнобой). Всё это, какбэ работает без NAT пока, потому что я не впердоливал upnp и NAT hole punching, ещё.
>Ещё IP может быть динамическим. Тогда надо юзать нечто вроде DDNS, походу, и коннектиться на DomainName:PORT И ещё, вроде как, надо выкидывать подобное говно из HashSet <string> PeersList если нельзя приконнектиться в течении некоего времени. Но это вопрос спорный, тот пир может быть просто отключён на время, а потом включится.
>Ещё под одним белым IP может сидеть тысяча узлов с серым локальным IP. 192.168.x.x. Вот тут надо upnp, или Port Forwarding для порта TCP/UDP-сервера, потому что иначе, порт TCP/UDP сервера может быть закрыт, а клиент может подключаться к разным серверам - с разных портов, которые ещё и меняься будут. Ясное дело, что тысяча узлов не могут прокинуться на один и тот же порт.
>Допустим, проблему с пробросом портов на своём домашнем роутере ты решишь. Так шоб его руками не пробрасывать, надо upnp. Но если ты говоришь тысяча узлов будет сидеть на роутере, то это будет 1000 самых разных портов открытых, и номер порта TCP/UDP-сервера, как-бы, не фиксированный, получается.
>А что делать с провайдером, который не даёт статический IP DDNS. Его - разрезолвить в IP, и на дефолтный TCP/UDP порт как-бы, ломится, туда.
>и не блокирует входящие соединения по TCP? Тут не совсем понял. Ты хотел сказать блокирует? Если провайдер блокирует входящие соединения TCP, значит надо очевиднейший UDP, потому что там нет соединений, как таковых, там просто пакеты летают в разные стороны.
>Те же торренты в безтрекерной сети могут работать и с серыми IP. Они через обмен пирами приходят, походу. И скорее всего там NAT Hole Punching уже реализован. Пикрелейтед. Но это не точно.
>Есть, те же торренты с API для шарпа. >Но многие заточены под специфичные юзкейсы А они на .NET 3.5 будут работать? Может реально заливать тупо в торренты и нанопосты, и аттачи для них, и по magnet-ссылкам вытягивать всё это дело потом? Думал также на IPFS лить всю эту хуйню. Но это будет куча торрент-файлов, блеать, и куча ссылок... А хотелось бы просто файл базы синхронить или три хэш-таблицы (список пиров, список нанопостов, список аттачей).
>и если ты собрался писать свою сеть общего назначения типа I2P, большую часть придётся реализовывать самому, потому что массово никому такие задачи решать не приходится Я изначально подумал следать что-то вроде TOX'а, чтобы можно было просто две наноборды поднять в локалке, и чтобы они сразу друг-друга нашли, и потом сами соединились, и сами просинхрили базу данных - без инета вообще, через роутер, например, и дополнили свои базы данных нанопостами - на обеих пирах. Но тут NAT не учтён, какбэ, да.
>почти всем хватает традиционного клиент-сервера поверх TCP. Ну, в принципе, можно было бы просто сервер поднять, и коннектиться. Но наноборда - это же анонимная имиджборда. А если будет сервер, то будет диванон. Алсо, сервер могут тупо положить дудосом. Поэтому я хочу заебенить пир. А пир - это не просто сервер, это клиент и сервер одновременно, как-бэ. И вот, допустим, удалось объединить TCP-сервер и TCP-клиент воедино, в один пир. И вот два пира поднято - в локалке или в Интернете. И как они друг-друга найдут? TCP не поддерживает multicast - в этом прикол. Значит надо использовать что-то вроде списка addnode, как в криптовалютах, но при таком раскладе, addnode - это по-сути сервера с конкретными IP и проброшенным через Port Forwarding или upnp - портом. А по IP их могут задиванонить и задудосить нахуй, или нагнать маски-шоу и расхуярить всё там, чтобы пересрать всё нахрен, и всю сеть поломать. Потому что без нод, хуй приконнектятся пиры эти ебучие. Я такую ебанину уже заебался зоонаблюдать в криптоговнах, специально цены на криптоговнины роняют в нулину, сложности роняют тоже, майнить и держать говно не выгодно, ноды держать включёнными не выгодно, их отклчают нафиг, а эти мочерские, подментованные пидоры пробивонные, из парочки нод уже могут легко задиванонить криптана, потому что поле поиска резко сужается, когда мало синхнод, блеать. Поэтому, чтобы всей этой ублюдочной хуйни не было, я пришёл к Peer Discovery через UDP Multicast, ибо при таком раскладе, пиры могут быть подняты в локалке, и сразу, автоматически, они могут начать синхрониться, без всяких addnode и публичных серверов, как-бы, которые ещё надо хостить, и хостить на белых IP, и палить их.
А так-то, наноборда, вообще без серверов разрабатывалась, там тупо локальный сервер, как читалка нанопостов, и больше нихуя. Локальный сервер хуй задодосишь, и хуй задиванонишь, потому что он локальный блеать.
Здравствуйте, господа шарписты! Есть ли тут те, кто сидят на линухе и пишут код на шарпе? Пару дней назад я установил линукс на пекарню, чисто по приколу. И значит вспомнил, что я люблю этот ваш C#, и хочется на нём пописать. Так вот вопрос к знатокам линуксойдам - где вы пишите код? Rider норм ваще? Не писать же в VS code?
>>2410642 > Потому что наноборда работает по HTTP, а он по TCP, и HttpServer.cs, по коду, увязан на TcpServer.cs Насколько я помню, наноборда клиент-серверная, хоть и резервных серверов несколько, прямого соединения с другими клиентами нет. Она даже более централизована, чем торрент-трекеры. > Это как так? Через UDP HTTP-запросы отправлять, что-ли? Ну да. > Бля, это ещё пижже, как-бэ, но нахуа? > Прикол в то, что UDP пакеты пиздуют не последовательно, а как-бы вразнобой: IP-пакеты тоже, там нет никакого контроля и никаких гарантий. Это сам TCP, работающий поверх IP, их за тебя выстраивает в правильном порядке, а UDP этого не делает. > Поэтому я решил объединиь TCP/UDP в один сервер, и приебенить туда мультикаст-группу для поиска пиров. Основная проблема TCP - через него невозможно сделать NAT hole punching. Так-то все бы его юзали и не парились. > Но если ты говоришь тысяча узлов будет сидеть на роутере, Не, я имел в виду маршрутизатор самого провайдера, который соединён с твоим домашним роутером. > >Есть, те же торренты с API для шарпа. > >Но многие заточены под специфичные юзкейсы > А они на .NET 3.5 будут работать? Не факт, но попробуй взять релизы постарее.
И много других проблем, по остальному не подскажу, очень специфичная тема.
Анон, помоги разобраться с dependency injection. Весь день курю гуглы и ютубы по теме, но все еще остаются два вопроса. 1. Какой фреймворк для этого дела учить джуну? Одни советуют родной мелкософтовский, другие autofac, третьи еще что-то. Нормальные туториалы нашел только по автофаку. 2. Видел несколько реализаций без фреймворков - там создается отедльный класс с методами, в которых вызываются инстанции классов. И я как-то не понял, это всегда будет работа с новыми инстанциями? А если мне нужен стабильный класс с определенными данными, который постоянно висит в памяти?
>>2411246 >Какой фреймворк для этого дела учить джуну Microsoft DI >Видел несколько реализаций без фреймворков Это каловое говно из жопы. Настоящий DI который юзают в проектах делается не так.
Объясняю на пальцах. У тебя есть интерфейс и его реализация:
interface IPizda { }
class LocalPizda : IPizda { }
Так же, есть класс который ЗАВИСИТ (dependency) от IPizda (т.е в нашем случае IPizda - это dependency/зависимость/залежність):
class Sex { private IPizda _pizda; public Sex(IPizda pizda) { _pizda = pizda; } }
Но, поскольку реализаций может быть много которые будут меняться во время разработки приложения (например LocalPizda - это класс тупо для теста функциональности на локальном ПК, а в будущем будет такой же класс но с более глобальным функционалом) мы не можем нормально передавать в конструктор класса Sex конкретную реализацию (всё таки всё сведется к тому что мы где-то захардкодим new LocalPizda()), так помимо всего этого в класс LocalPizda может еще прийти 100500 таких же зависимостей (которые в себе могут содержать зависимости.. и так до бесконечности).
Чтобы решить проблему ебли с new ConcreteClass(new Dependency1(), new Dependency2(new DependencyDependency1())) где присутствует конкретная реализация, что плохо, придумали такое как внедрение зависимостей. Внутри Microsoft.DependencyInjection происходит следующее: фиксируется интерфейс IPizda и его реализация LocalPizda. Из LocalPizda фиксируются все возможные конструкторы с параметрами и без. После того, как ты зарегаешь все свои зависимости с зависимостями:
IServiceCollection serviceCollection = new ServiceCollection();
И теперь у тебя есть объект LocalPizda (но будет как IPizda), содержащий все нужные ему зависимости, т.е serviceProvider сам сделал конструктор и засунул туда нужные зависимости и сделал для них конструкторы с их зависимостями (ну и так вглубь до конечного результата который тебе нужен в виде IPizda), это помогает как решить new ConcreteClass(new Dependency1(), new Dependency2(new DependencyDependency1()))
Смотри. Вот допустим, у тебя в программе был бы ровно один поток. Так вот. Ты хочешь какую-то долгую операцию выполнить. Допустим - открыть файл в миллион строк и вывести это на экран. Так вот. Поток у тебя все еще один. А значит что? А значит то, что у тебя все будет выполняться последовательно(синхронно), т.е. код дойдет до момента, когда нужно открыть файл. Заблокирует поток. Будет ждать от ОС сигнала о том, что файл есть, его можно открыть, вот тебе хендлер для работы с файлом. Дальше - ты так же синхронно начнешь данные читать/копировать, дальше ты так же синхронно будешь ждать выводить строчки из файла куда тебе там надо. И вот когда все это закончится - только тогда программа будет способна что-то еще делать.
Асинхронщина: Ты вот так же как и раньше, хочешь работать с файлом. Миллион строк. Так вот. Поток доходит до момента, когда нужно открыть файл. Но вместо того чтобы ждать завершения - просит ос открыть файл и идет дальше делать полезные дела. Когда ос пинганет и вернет хендлер - поток узнает об этом механизмами которые придумали разработчики ОС - и можешь что-то полезное сделать, например так же асинхронно почитать из файла, и так же не блокируя поток продолжить выполнение. Благодаря этому - поток может больше полезных операций выполнить, вместо того чтобы ждать пока ос просрется, пока диск ответит и т.д. Развивая мысль - мы можем уже сверху натянуть пулы потоков и всячески наращивать более интенсивное использование ресурсов CPU для полезных вещей, вместо того чтобы тот стоял и нихуя не делал полезного, а пользователь думал, что все зависло.
Так вот. В твоем примере - это сахарок для того чтобы ты не ебался с миллионами коллбеков, AsyncEventHandler'ами и прочей залупистикой, а мог писать как-бы синхронно. Посмотри просто примеры как это говно на ЖС до введения async-await было. Колбек на коллбеке и коллбеком погоняет. Либо еще хуже и у тебя это вот в ООП завернуто. Там у тебя будет пиздец в духе: Хендлер на хендлере и хендлером погоняет. Потому умные люди подумали-подумали и придумали вот такой вот сахарок.
Нужно выполнить кучу относительно медленных запросов, по одному - слишком медленно выходит, все сразу - тоже не получится из-за количества. Причём некоторые могут вообще долго тупить, а некоторые - отвалиться, и нужно чтобы основная масса этих запросов выполнилась как можно скорее. Лучшее, что придумалось - сделать очередь и условно десяток асинхронных "воркеров", которые будут брать из очереди запросы и их выполнять. Каждый воркер берёт из очереди запрос, выполняет его, берёт следующий запрос из очереди. Или, если он слишком медленный - канцелит его, кидает в другую очередь, которая будет выполняться в конце особым образом, с более длительным ожиданием и ретраями.
Но с таким подходом у меня проблема в том, что это как-то дохуя сложного кода выходит, а ещё я хз, как там с очередями работать потокобезопасно, в js с этим как-то проще, асинхронный код в одном потоке работает, всё предсказуемо, а в c# у меня такое ощущение, что Локи, а иногда и асинкавейты в совсем рандомных местах раскиданы, я не понимаю, как это всё писать, чтобы оно заведомо правильно работало с параллелизмом.
Причём задача то звучит как вполне типичная, наверняка где-то лежит её красивое решение с простым кодом, но я чет не могу нагуглить. Хелп.
>>2411413 Нет не лежит. Если ты про запросы к базе - то первое что нужно было смотреть - план запроса и пробовать его сделать более быстрым(индексы-хуиндексы, снизить число циклических обходов размер запрашиваемых из базы данных, если оно не надо). Если запросы какую-то работу выполняют - то +- как ты описал все и делают. Простого решения тут нет. Для работы потокобезопасно с очередями у шарпа есть ConcurrentQueue. Чтобы снаружи это выглядело более пристойно - можешь сделать свой LongRunningTask<T> который будет в очередь помимо задачи - класть семафор и после завершения задачи - отжимать его, чтобы снаружи выглядело как обычная задача с await и всем таким.
Если взять 2 листа: 1 - закинуты объекты "хуй", "говно" 2 - закинуты тысяча объектов, удалены, закинуты объекты "хуй", "говно" У них будут одинаковые хэши? А equals? А сравнение через ==?
>>2411260 Спокуха, щас объясню. Task - это какая-то одна асинхронная операция. Запускается она следующим образом (есть несколько способов, я напишу самый простой): var task = Task.Run(() => Console.WriteLine("method1"));
Данная операция выполнится асинхронно, но вот когда она выполнится - хуй его знает. Чтобы получить результат таски здесь и сейчас - юзаем `await`, т.е:
await Task.Run(() => Console.WriteLine("method2")); Слово await заставляет всех в текущей таске ждать выполнения этого метода. Теперь на примере:
public async Task Method1Async() { var result = await _service.SmthHuitaAsync(); }
public async Task Method2Async() { var result = await _service.SmthHuita2Async(); }
Теперь методы Method1Async и Method2Async можно запустить независимо друг от друга:
public void Pizdec() { var task1 = Method1Async(); var task2 = Method1Async(); }
Выполнение пойдет одновременно и вывод может любой:
>>2411607 >Но ведь прога может завершиться до того как будут выведены сообщения. Если будет какой-то краш проги критический который убьёт нахуй процесс, или выключится свет, то да, ну или если у тебя консольная программа из двух строчек кода которые я написал в методе Pizdec в конце ответа
>>2411270 Два чая, анон, что-то примерно начинает доходить. А где по науке регистрируются все эти зависимости и билдятся в объект? В Program.cs? Олсо, как я потом вызову зависимость из другого класса, если тут тоже используется new ServiceCollection()?
>>2411639 Все зависимости регаются как можно ближе к стартующему приложению классу (но не рядом с Main), обычно в отдельном методе, но не обязательно.
К примеру в WPF регать можно где-то в классе App.cs, так же убрать в App.cs.xaml StartupUri для того, чтобы в классе можно было переопределить метод OnStartup, зарегать там твои зависимости и ViewModel'и поскольку зачастую вьюмоделям нужно что-то передавать в конструктор что делает невозможным еблю с кодом в xaml.
Далее делается публичное свойство в App.cs public static ServiceProvider ServiceProvider { get; set; }
А затем делаешь всё что я описал выше (если что вот так вот объявлять MyWindow через new тоже не стоит, для этого делается класс со словарем который управляет жизненным циклом окна: биндит VW, открывает, закрывает. Для примера в принципе сойдет)
public override void OnStartup() { ConfigureServices();
var mainViewModel = ServiceProvider.GetService<MyViewModel>(); MyWindow w = new MyWindow(mainViewModel); w.Show() }
private void ConfigureServices() { IServiceCollection collection = new ServiceCollection() collection.AddTransient<MyService, IMyService>(); collection.AddTransient<MainViewModel>(); //Допустим, MainViewModel зависит IMyService
Далее из любой точки программы: var service = App.ServiceProvider.GetRequiredService<IMyService>();
В ASP.NET Core в контроллерах, а так же Razor Pages нет нужды обращаться напрямую к ServiceProvider поскольку контроллеры и странички автогенерируемы, и их конструкторы по дефолту будут заполняться нужными зависимостями, достаточно только зарегистрировать их. В NET 6 убрали класс Startup и прочее объединив в один класс:
var builder = WebApplication.CreateBuilder(args); ... builder.Services.AddScoped<MyService, IMyService>();
Чё-то у меня в мухосранске вообще вакансий на C# нет. Есть токо на VB одна и всё. Что у вас с вакансиями? Неужели кроме гейдева на C# ничего не наработаешь?
Linq боги здесь? Есть один список результатов, в котором есть поля: DateTime date; int someintvalue; Как в нем просумировать и вывести среднее int значения по днях? Например в нем может быть n экземпляров с каким-то одним днем, мне нужно вернуть одну экземпляр с этим днем и средним int значением.
>>2411608 Где я их смешивал? Если ты про > можем уже сверху натянуть пулы потоков и всячески наращивать более интенсивное использование ресурсов CPU Это не про таски, а про асинхронность как таковую. Тебе зачастую плевать в каком конкретно потоке будет продолжено выполнение, а потому - делая планировщик - ты можешь брать любой не занятый поток и пихать в него остальную часть твоего асинхронного кода.
>>2412105 >ты можешь брать любой не занятый поток и пихать в него остальную часть твоего асинхронного кода. да не можеш ты блять. зайди в свою ебучую студию и запусти два потока с несколькими тасками (как с await так и без) и посмотри че будет.
>>2411550 Вали оттуда при первой же возможности. Через год ты обнаружишь, что даже вкатун, только что выползший с курсов жидбрейнса, будет намного ценнее тебя на рынке труда.
>>2411917 >>2411928 Я ща подумал, короче я насрал. Во первых, там создаётся анонимный тип, а не один из экземпляров юзается, во вторых, это хуйня не будет работать нормально, если у тебя больше одного месяца в результатах, тому что Day возвращает просто день в месяце. Наверн можно вывернуть как-то в res.date.ToString("dd:MM:yy"), тогда будет работать до конца века. ну или yyyy сделай.
>>2412285 > await HandleClient() не даст работать 2+ подключениям одновременно. Я знаю. Это в данном случае не ошибка, просто я проглядел что MS в старой реализации отпускают ManualResetEvent . В даном случае можно просто таску не эвейтить, ну либо async void делать. >>2412285 При чем тут таски и асинхронность, чел? По твоему таски это единственный способ сделать выполнение кода асинхронным? Ты троллишь? Например. Методы стримов BeginRead, BeginWrite - асинхронные.
>>2412594 Худшее, что можно было только высрать в петухоне. Теперь все срут функциями по 20 аргументов. Лучше уж передавать один объект, заполненный через initializer block.
>>2412594 >и требовать с именами указывать. А что если я все коллекции которые принимаю как параметр метода называю items? А у человека в методе нахуй 5 коллекций которые друг с другом ебутся во все дырки чтобы притащить в моей метод коллекцию с названием items? Лол. У меня порой если метод +- крупный то приходится ебаться с названиями чтобы они попросту не конфликтовали и были читаемы
>>2412596 >Теперь все срут функциями по 20 аргументов. как одно связано с другим. Кто запрещает срать функциями по 20 аргументов в шарпе? там тоже есть именованные параметры.
>>2412598 >А что если я все коллекции которые принимаю как параметр метода называю items? И? о чем ты вообще. В шарпе ЕСТЬ именованные параметры (только без требования "имя опустить нельзя").
>>2412596 >Лучше уж передавать один объект, заполненный через initializer block. у которого кстати НЕТ проверки на заполненность на уровне компилятора ибо required не впилили. Ну можно заполнить через конструктор....ой, а это ж опять те же 20 полей, да без имен )
a, b - НЕЛЬЗЯ использовать с именами. только позиционно. Как следствие ты потом можешь их переименовать и ничего не сломается d, e - использовать только с именами, что люто добавляет читабельности, ведь никто не вызовет foo(1,2,3,4, 5) а будет вынужден писать как foo(1,2,3,d=4, e=5)
в шарпе тоже есть именованные аргументы позволяющие писать так foo(1,2,3,d:4, e:5)
но это нужно иметь культуру "а вдруг кто читать будет после меня" и особо настраивать правила чистилок "не чисти эти имена гад, ну и что что их не является обязательным указывать, я их указал для читабельности", что конечно никто не делает.
>>2412602 Надеюсь это никогда не добавят, щас бы нахуй думать над позиционированием входящих параметров и чето там запрещать. Нахуя? Нет же ни одной объективной ситуации где это могло бы быть нужным. Читаемость даст следующий код:
void Foo(int a, int b, int c, int d, int e)
а не вот этот: def foo(a, b, /, c, , d, e)
Какие-то нахуй слэши, звёздочки, нахуя это всё?
>но это нужно иметь культуру "а вдруг кто читать будет после меня" Вот поэтому этот синтаксис из питона никогда не добавят, мне важнее читаемость в будущем чем какие-то ограничения на параметры
>>2412604 >Какие-то нахуй слэши, звёздочки, нахуя это всё? Это просто способ указания какие параметры какие. их никто не заставляет применять. Можешь не писать в своем коде, а в чужом - опять же пишешь не ты.
>Читаемость даст следующий код: >мне важнее читаемость в будущем я вызываю твой метод Foo(1,2,3,4, 5)
ты потом читаешь этот код. правда сходу понятно что такое 3, а что 4? или все таки нет? ) читабельность уровня "да хз, вроде норм"
или
Foo(true, true, false, true, false)
красота же. Читаемость 10000%
А теперь следи за руками. Никто не требует указывать имена для всех параметров. Используется только для опциональных!!. И в шарпе тоже самое - используется для опциональных.
Только если опциональный параметр ничего не пропускает, то IDE предлагает убрать имена. и получается Foo(true, true, false, true, false)
>>2412615 мышью елозить - это не читабельность. Иначе бы тогда не было претензий к var вместо явного указания типа - "а хули там, мышью навел, какая проблема"
особенно когда читаешь код в каком нибудь diff, где мыши нет.
а по аргументации вот тебе пример
public IEnumerable Product(bool a, bool b, bool c, bool simplify = false, reverse: bool = false)
простой метод, принимающий 3 обязательных параметра и пару опциональных.
и сравни читабельность foreach ... in Product(true, false, false, true, true)
и
foreach ... in Product(true, false, false, simplify: true, reverse: true)
именованные опциональные параметры четко показывают где рабочие параметры, а где опциональные, и, собственно, кто они из себя.
Вот только второй вариант НИКТО не напишет, потому что можно первый вариант, да и IDE задолбает просьбой превратить второе в первое.
заводить для пары опциональных параметров целый класс Options? Так количество параметров в методе не превышает 5, что не является запахом.
и сразу - не нужно про обратную совместимость имен. поскольку любой параметр можно использовать именованно, то шарписты и щас не имеют свободы менять потом имена параметров, поскольку нет гарантии что никто не использовал имя (на деле конечно никто, но это авось, а не гарантия)
Во-первых. Если это касается каких-то флагов или перечислений, то шарпе создатель функции может использовать Enum, чтобы принудить пользователя не использовать вот этот подход (false, -1). В нормальной функции у тебя будет так: (Visibility.Hide, HorizontalAlignment.Left), и пользователю не нужно все это расписывать.
Во-вторых, если это касается каких-то чисел, то я давно не припомню, чтобы я прямо в аугменты функции вписывал что-то подобное (356, 80, 45, 90). Если это не перечисления, то вписываю туда уже существующие переменные, типа (X, Y, Width, Height), которые уже говорят сами за себя. У меня возникает МАЛЕНЬКИЙ вопросик, а какого хуя питоноблядь допустила ситуации, когда она пишет это (356, 80, 45, 90), окромя каки-то быстрых тестов. Как у нее это получилось? Как у нее значения заспавнились в середине тела функции? И почему это захаркодено?
В-третьих. Да, нужно приучать себя создавать перечисления и иметь внутреннюю самоорганизацию. К сожалению, попытка языка покрывать лень пишущего, приводит к чудовищным последствиям, и джава скрипт тому пример — 60% функционала рождены только для того, чтобы осилить\исправить изначальное попустительство в сторону пользователя. И что это дает? Возвращает язык к тому, от чего он бежал, а сам юзер в итоге должен изучать дополнительные 60% информации, чтобы в итоге 24\7 быть начеку, отслеживая всякие "поднятия" и прочую хуйню, которая ни на минуту его не расслабляет и не делает его жизнь легче, хотя сам юзер мог бы приучить себя к самоорганизации и упростить себе жизнь многократно.
>>2412645 >Если это не перечисления, то вписываю туда уже существующие переменные, типа (X, Y, Width, Height), которые уже говорят сами за себя
ты вообще о чем? где ты в ВЫЗОВАХ методов прописываешь имена параметров? В сигнатурах понятно что имена есть, но в В ВЫЗОВАХ ты прописываешь ТОЛЬКО ЗНАЧЕИЯ и ситуация вида (356, 80, 45, 90) вполне норма, если тебя не очень высокоуровневый код, где у каждого параметра обязательно есть именованная переменная.
заводить именованную переменную для каждого true/false и использовать их как константу - дичь, поскольку они сами константы самих себя.
про перечисления не в тему ибо перечисления это перечисления, а флаги это флаги и опциональные параметры - это опциональные парамтры (то есть могут быть не только true/false) Потому и плодят разные Options, а не перечисления заводят.
>>2412647 да пофиг что там есть. он а) замусоривает код (причем настолько что в итоге вырубается нах) б) требует редактора. то есть я не могу с планшета почитать гитхаб. Мне нужно обязательно комп, обязательно клонить проект, поебаться с " у вас не установлено 100 вариантов фреймворков" и " это не грузится потому что вот вам сто ошибок" (товарищ с моно sqlite один из пруфов этого) и только потом нормально читать )
>>2412645 то есть понятно что код должен быть самодокументируемым. но нужно же и меру знать если метод принимает 5 bool то я не буду заводить 5 констант только ради того чтобы передать их в метод и были имена.
к тому же методы пишешь НЕ ТЫ ты их ТОЛЬКО ВЫЗЫВАЕШЬ и хотелки "а вот они должны принимать" можешь отправить разве что в спортлото
я лучше использую именованные параметры, которые использую разве что я, да и IDE с радостью их потрет при первой возможности
>>2412651 >ты вообще о чем? где ты в ВЫЗОВАХ методов прописываешь имена параметров? мда... x int = 100; y int = 200; SetPosition(x, y);
>(356, 80, 45, 90) вполне норма, если тебя не очень высокоуровневый код Я прямо сейчас готов растерзать таких пидорасов, которые вот так и сделали и мне приходится тратить драгоценные часы, чтобы написать пути обхода. Пишу плагин для одной проги, у которой ширины окон железобетонно вбиты.
>про перечисления не в тему ибо перечисления это перечисления, а флаги это флаги и опциональные параметры - это опциональные парамтры Охуенный аргумент: — Ваша мать - шлюха — Моя мать не в тему, потому что мать это мать, отец это отец, бабушка это бабушка.
>>2412658 >SetPosition(x, y); Ну ты так написал, прямо постарался (хотя я не верю что ты так пишешь), скорее так SetPosition(x: 100, y: 200); а 1000 людей так на написали, потому что у них нет такого правила, а у языка нет средств для этого.
>Я прямо сейчас готов растерзать таких пидорасов, которые вот так и сделали как видишь, ТАК ДЕЛАЮТ и ты вынужден это читать (то что это захардкожено и создает тебе проблем - это уже проблемы другого плана и к теме отношения не имеют. ты до сих пор путаешь захардкоженность и читаемость)
>Охуенный аргумент: нормальный аргумент. не все впихивается в перечисления. только флаги. и даже если и можно впихнуть - ну ты впихнул, другие нет - имеют право и это абсолютно нормальный код
>>2412660 >Это уже странно. абсолютно нормально. код начинает пахнуть если больше 5 параметров, а уж про типы ничего не говорит - тут как получится
>>2412669 >Ну ты так написал, прямо постарался Я так и пишу, потому что так или иначе к моменту использования нашей условной функции SetPosition, у меня уже сформируются определенный набор переменных — либо они приходят из аргументов, либо появляются по ходу. Это не я себя заставляю, так получается естественным образом. И чтобы я на самом старте юзал SetPosition(x: 100, y: 200), это один случай на миллион. Это может подходить только к примитивным структурам типа поинта или ректенгла, да и то не всегда.
>как видишь, ТАК ДЕЛАЮТ и ты вынужден это читать Такие пидорасы должны страдать, и судя по тому что Pixolodgic продала свою жопу Maxon, а перед этим мучались в гиене собственного кода, думаю наказание было исчерпывающим. Таких ни джаваскрипт, ни питон не исправит.
>не все впихивается в перечисления Не все перечисления впихиваются в перечисления? Я написал два способа передачи: перечисления и через переменную. Случай с SetPosition(x, y); — это и есть второй вариант. Напрямую значение никто не передает.
>код начинает пахнуть если больше 5 параметров Естественно, но опять же, у тебя естественным образом должны сформироваться переменные к моменту передачи аргументов в функцию. Если это не так, то стоит задуматься, а насколько адаптивен твой код. Ты вот критикуешь сишарп, но ты даже сам не осознаешь проблему, которую ты себе создал питоном.
>>2412596 Ему видите-ли лень писать билдер и хочется здесь и сейчас, а еще ему лень объявлять переменные, поэтому в функцию он передает прямо числа. Там терминальная стадия говнокодинга.
И вот казалось бы, если будет такой волшебный язык, который будет потакать всем его желаниям, то что он получит в итоге? Топорную программу, модули которой не работают сообща.
>>2412711 >SetPosition(x: 100, y: 200), это один случай на миллион именно. обычно так никто не пишет, потому что IDE этому сопротивляется. обычно пишут SetPosition(100, 200, false, true) ты можешь сколько угодно разглагольствовать "а вот я", но я могу открыть рэндомную репку на гитхабе и найти где в функцию прямо передается true/false
И в итоге ты читаешь чужой код а там сплошное SetPosition(100, 200, false, true) и это не является захардкоженым, а деталями реализации. Все так "захардкоженность" подразумевает то потенциальное желание заменить, а это совершенно другое.
>Такие пидорасы должны страдать но страдают не они. страдаешь ТЫ. они пишут - им норм, а заставить писать иначе ты не можешь, да и не хочешь.
> Я написал два способа передачи: перечисления и через переменную. Случай с SetPosition(x, y); — это и есть второй вариант тогда я вообще не знаю о чем ты. покажи мне вызов ЧУЖОГО метода по своему по умному
>у тебя естественным образом должны сформироваться переменные к моменту передачи аргументов в функцию софтистика какая то. какие то проблемы уже питон создает я ВСЕГО ЛИШЬ ПРОШУ писать читаемо и все. И питон на уровне языка дает возможность ЗАПРЕТИТЬ писать вызов функции. Ты сам жалуешься, что другие написали непонятно, но при этом запрещаешь им запретить писать непонятно
Возник еще тупой вопрос про DI. Вот я регаю зависимость <IPizda, Pizda>. А что делать, если у меня несколько имплементаций? Типа BritayaPizda, NebritayaPizda и они мне нужны одновременно, например в конструкторе одного класса одно, а в конструкторе другого другое?
>>2412869 вернее при резолве одного должен быть последний, что очень годно, но это "должен быть", а на деле хз что в реальности в разных IoC контейнерах
>>2412869 > и они мне нужны одновременно возможность указать зависимости по условию поддерживает не каждая либа Если у тебя реализация интерфейса и ты делаешь вторую и тебе не нужен список, а просто хочешь ОДНОМУ классу подсунуть свою реализацию,а другим дефолтную и у тебя либа от мелких - то у тебя проблемы
>>2412889 >так что ...не нужны они тебе одновременно. А как же всякие стандартные случаи, когда например есть интерфейс IEmployee и его дефолтные имплементации типа: Stuff, Clerks, Managers и так далее? Для каждого такого класса делать отдельный интерфейс и наследовать его от IEmployee?
>>2412869 У тебя не должно быть моментов где тебе нужно регистрировать несколько имплементаций. Регистрируешь ты только сервисы, никаких нахуй `IEmpoyee` и прочую хуйню.
>>2412977 Покажи код, что ты регаешь? DI облегчает жизнь только для сложных сервисов зависящих от других сервисов, доменную логику (например класс который чистит папки) зачастую не регают. Регистрируют только сервисы уровня приложения (application services). Сервисы уровня приложения вызывают уже конкретные методы доменной логики
>>2412977 Ну обычно IoC мыслит более фундаментальными вещами. стринги же не регистрируешь. IEmployee все таки не сервис и делать ему в контейнере нечего
Но вообще да, не хватает такой фичи у мелких. Как и в декораторы не умеет нормальные (скрутор это костыль)
>>2413003 ты просто проустил тему, а я там похерил часть предложения воюя с формой (дебильная кнопка стикеров падла)
речь шла про запрет писать
foreach ... in Product(true, false, false, true, true)
чем грешат все, кому не лень, а не лень многим и то, что в теме есть один святоша - проблему не решает а иметь возможность на уровне языка заставить писать так
foreach ... in Product(true, false, false, simplify: true, reverse: true)
>>2413036 >А как тогда быть с зависимостями типа IEmployee? Покажи код, все что не сервисы - передаётся руками.
>Я пока консольки только пишу, написанное тобой для меня - мунспик. Та дропай нахуй, чем сложнее ебатория тем лучше разберешься, тем более судя по всему ты не особо понимаешь что такое эти сервисы. Захуяч какой-нибудь интернет магазин на WPF, сделай всё по канону DDD. Стековерфлоу и двач тебе если надо всё объяснит если будут проблемы.
>>2413036 > Я пока консольки только пишу, написанное тобой для меня - мунспик. Да просто DI нужен только чтобы самые высокоуровневые системы связать, для всякой мелочи нинужон
>>2413333 >>интернет магазин >>WPF Да, согласен. Под конец рабочего дня совсем расплавило мозг. Да на самом деле похуй на чем и где практиковать, везде юзается один подход но конечное говно доходит до заказчика в виде десктоп говна либо в виде сайтика, меняется тока вьюшка.
>>2413340 А насколько мне в будущей работе вообще нужно будет уметь писать какие-то сложные консольные приложения? Спрашиваю не только про уровень джуна, но и дальше.
>>2413333 Почему бы не сделать десктоп приложение для интернет магазина? Охуенная же идея, почему никто еще до такого не додумался? Можно включить автозапуск при старте системы и пихать рекламу в уведомления.
>>2413373 Хотя бы потому, что поисковики не смогут такое проиндексировать, только ссылку на сайт для скачивания клиента. Ну а клиент ставить мало кто захочет, быстрее в другом магазине купить.
>>2413349 Шанс близок к 0. Мне пригодилось консолька 1 раз когда надо было сделать мини-команды по дрочке видео-файлов с помощью fmpeg, но там настолько всё просто что ваще пиздец. олсо юзал чью-то либу под названием CliFx, так что если нужно будет дрочиться с команд-лайн задачкой то вот те в помощь полезная либа. Так же есть от майкрософтов CommandLineApplication, но она конченая и неудобная.
Как не впасть в гордыню, когда сравниваешь свою реализацию с чужой и твоя всем лучше, кроме разве что читаемости? Просто пиздец у меня писька встала, когда сравнил легаси штуку со своей и внезапно оказалось - что мой код работает в 1000 раз быстрее. ТЫСЯЧА, блядь. 10 единовременных активных сессий коммуникации, против 10к. Сука. А сверху - на эти 10 сессий - старое добро жрет 4 гига оперативы, у меня на 10к - гиг. Блядь. Я просто охуеваю с себя. Как же я хорош. Мог бы дотянуться до хуя - сам себе бы отсосал.
>>2413467 Та были бы менеджеры не так запуганы крестами - я бы на крестах и писал. Кек. Другое дело, что на шарпе я реализацию свою сделал за 2 месяца, а думаю с крестами бы пришлось ебаться не меньше полугода.
>>2413563 Любой. Главное сделай его максимально хорошо. В идеале - это должен быть проект который можно было бы взять и начать продавать. Ну, давай с простого. Ты можешь сделать калькулятор. Так вот. Если ты делаешь его на отъебись(в винформах накида кнопок, на каждую повесил обработчик и типа ЗБС)))) - никто не похвалит тебя и брать на работу будут только в случае, если острый дефицит кадров. А можешь сделать - заебок, чтобы и дизайн эргономичный, и код был: ВАХ, КРАСЫВА, и фичей напихать которых часто не хватает(допустим - для программисткого калькулятора часто не хватает фичи с отображением как текст, ну пиздец бесит, мне приходится лезть в гугол и смотреть, либо открывать таблицу ASCII, вот хули никто не сделает?) И при этом сделаешь это быстро(нахуй перфекционистов и прочих мутителей воды в команде, нужен здравый смысл, когда мы понимаем, что нужно сделать фичу и сделать ее нормально, а не уходим в какие-то пространные достижения идеала хуй пойми в чем) Ну и т.д. Суть я думаю ты уловил. Чтобы тебя без реального опыта хотели с руками оторвать - нужно чтобы было видно, что ты не на отъебись и только то что тебе интересно делаешь, а как раз - способен сесть и сделать хорошо, но при этом за разумные сроки.
>>2413584 Да ну какой калькулятор лол, я же не пусси совсем, 2 года суммарно в вебе отпахал, но на жсе. Мне нужен вариант который я за несколько вечеров на связке Рякт+С#+pg/монга/кассандра ебану, задеплою и у меня и всё что я до этого выучил по шарпу устаканится и нихуёвый такой плюсик мол вот я крутой, могу весь проект в соло тащить.
>>2413588 Ну, тогда пили совместное редактирование документов, с разграничением прав, версионированием, чатиком и возможностью отобразить битовую строку как текст.
>>2413595 Это 3 недели ленивой работы для одного человека. Для пета - самое то. Разве что битовую строку как текст - может занять много времени, не зря же ее никто не хочет внедрять.
Бля. Решал сейчас задачку на литкоде. Решил, результаты в районе 30-40% по памяти и времени. Там в одном месте foreach по string.Reverce() По приколу заменил на for с перебором индексов от n-1 до 0 и вытаскивание чара Результаты по времени и памяти 95%+ Ебать я охуел с этого
>>2413634 >>2413637 foreach в принципе не предназначен для вытаскивания чего-либо в определенном порядке. Ну т.е. это можно сделать (причем за счет самой перебираемой коллекции), но он для этого не предназначен от слова совсем.
>>2409499 Да, спасибо что поправил. На сколько мне известно, контекст синхронизации сейчас по сути объявлен только в десктопе, но там ты полюбас вернешься в UI поток. Ещё он раньше был объявлен в старых версиях ASP .NET MVC, но его полностью выпилили из ASP .NET Core
>>2411246 1. Вообще похуй. Начни с MSDI. В ASP .NET Core там один хуй будет фасад поверх контейнера. Разница будет заключаться только лишь в деталях конфигурации.
2. Какую-то хуйню ты видел. Вот этот чувак например реализовал более менее норм DI.
>>2413796 ну. во первых, он не самый умный и мне бывало переписывал в нерабочую конструкцию Во-вторых, он может видеть что у тебя List, а не Ienumerable и можно без проблем шагать от от обратного надеясь на оптимизации но скорее первое
>>2413796 >почему В душе не ебу, я не пользуюсь решарпером. Ну и опять же мой поинт был в том, что цикл foreach предназначен для перебора 'всех элементов коллекции', но он не предназначен для перебора элементов 'в определенном порядке'. Основное его назначение взять каждый элемент коллекции и выполнить тело цикла. Ты не можешь контролировать порядок из самого цикла, т.к. это полностью на стороне перебираемой коллекции. В цикле For можешь (если есть индексатор), в foreach нет. Возможно у тебя в решарпере стоит настройка, что он видит, что твой способ перебора в for кладет хер на порядок и предлагает переделать на вариант с foreach
>>2413790 > foreach в принципе не предназначен для вытаскивания чего-либо в определенном порядке. Предназначен, лол, ты чо рофлишь? Он перебирает в таком порядке, какой IEnumerable даст
>>2413634 Ну как бы в первом случае ты используешь LINQ метод Reverse(this IEnumerable<T>). А он в силу универсальности медленный. У тебя там как минимум одно доп выделение памяти для промежуточного буфера происходит, с копированием строки в него. А скорее всего несколько, так как String не реализует ICollection<T>, а значит нет возможности пойти по быстрому пути и выделить массив памяти нужного размера сразу, а значит он будет пересоздаваться несколько раз, конечно же с копированием из старого в новый. А без материализации в промежуточный буфер нельзя, вдруг ты туда не строку фиксированной длины передавал, а вообще какой-нибудь генератор. Плюс у тебя ещё два енумератора в куче создастся. За тем, чтобы понять какого хуя происходит следует сходить сюда: https://github.com/microsoft/referencesource/blob/master/System.Core/System/Linq/Enumerable.cs
Во втором же случае у тебя просто доступ к элементам массива по индексу, без всяких там выделений памяти, копирований и прочего.
>>2414176 >На эффективность надо дрочить только на С++ Потому что даже самому нишёвому стартапу похуй, будет ли запрос на ручку обрабатываться 5 секунд или 500 мс
Сколько книг, статей, примеров и видео не смотрю/читаю никто не юзает in для передачи параметров в метод. Все хуярят по значению и ни о чём не сожалеют. Вопрос - почему? Вопрос 2 - они ебанаты?
>>2414217 Во-вторых, указав in, вы объявляете о намерении передать аргумент по ссылке. Аргумент, используемый с in, должен представлять расположение, на которое можно сослаться напрямую. Такие же общие правила применяются к аргументам out и ref: вы не можете использовать константы, обычные свойства или другие выражения, возвращающие значения. В противном случае пропуск in в месте вызова сообщает компилятору, что вы разрешите ему создать временную переменную для передачи с помощью ссылки на метод, доступной только для чтения. Компилятор создает временную переменную, чтобы преодолеть некоторые ограничения для аргументов....
>>2414294 >Именно из-за этого карта лояльности в пятёрочке применяется секунд 10 Джвачаю. Очко горит с этих ебаных кодеров на питонах которые приложение банков пишут которые кэширует 500 мб в неделю
>>2414299 >А в Тбилиси есть кассы самообслуживания? Обосрался, ебать ты попустил этого любителя забить хуй на оптимизацию для которого нет разницы в 500 мс и 5 сек
>>2414170 Блять, да хули вы тупые то такие. Еще раз. Используя foreach ты никак не можешь повлиять на порядок обработки элементов внутри самого цикла. Порядком заведует исключительно сама коллекция. Т.е. тебе сначала нужно произвести манипуляции с ней, задав порядок выдачи элементов енумератором и потом уже пихать ее в foreach. В то время как в for ты именно, что сам определяешь этот порядок, без дополнительных манипуляций с самой коллекцией.
>>2414459 Коллекция это коллекция. Она просто хранит. Порядком обхода ведает итератор. Это отдельная сущность. Конечно коллекция имеет дефолтный итератор. но coll.Reverse() выдает свой итератор ReverseIterator<TSource>
Вот только ReverseIterator<TSource> хоть и реверсит, но делает это тупо материализацией во временный буфер с очевидным перераходом памяти на ровном месте.
>>2414459 Че ты несёшь > Используя foreach ты никак не можешь повлиять на порядок обработки элементов внутри самого цикла. Они идут ровно в том порядке, в каком их выдаёт енумератор > Порядком заведует исключительно сама коллекция. Да. > Т.е. тебе сначала нужно произвести манипуляции с ней, задав порядок выдачи элементов енумератором и потом уже пихать ее в foreach Ты же только что выше сказал, что порчдком заведвет сама коллекция(енумератор, который она выдаёт, в случае листа он обходит элементы с первого по последний)
Сап шарп, может кто знает как програмно шарп кодом сгенерить self-extracted .exe или мб какой-то йоба инсталлер библиотеку для этого? Пока что я нашел: 1) https://products.aspose.com/zip/net/ Очень удобно, но гуи на ангельском, конечный юзер может не понять. Хотя на крайний случай я его таки использую. 2) https://devindeep.com/creating-a-self-extracting-executable-in-c-source-code-included/ Вроде годно, простой messagebox с текстом который можно указать. Правда он нихуя не работает. И я абсолютно не понимаю почему. Проект сбилдили на 4.5, в майках на сайте сдк уже нету, обновил до 4.8, правда на что это может влиять я не понимаю т.к. там просто запуск консоли с параметрами путей до 7z либ и екзешников. Конечный exe выдает ошибку 7-zip что файл не найден. Да, я глобальные пути поменял. Еще варианты?
>>2415051 >Сап шарп, может кто знает как програмно шарп кодом сгенерить self-extracted .exe Гуглишь консольные команды для этого говна и делаешь утилиту которая запускается где-нибудь в фоновом режиме. Только сделай условие на текущее ОС, команды могут быть разными.
Можете привести пример случая, где нужно апкастить класс? Делал это только в тестовых проектах при обучении. Там есть помимо явного приведения ключевые слова as, или is, на тот случай, если приведение не получится выполнить, но у меня ещё не случалось такого. Всем спасибо, надеюсь ясно выразился.
>>2415086 К примеру для оптимизации. В реализации многих linq-методов есть попытка апкастнуть IEnumerable к ICollection или IList, так как многие операции можно в таком случае выполнить эффективней (к примеру, при вызове ToArray можно сразу выделить массив нужного размера под все элементы).
>>2415086 Ну, допустим тебе досталась сторонняя библиотека с оч странной архитектурой. Возвращается предок. Но у наследника есть нужный тебе метод, которого нет в родителе и он тебе нужен здесь. Ты точно знаешь что вернулся экземпляр наследника. Ты берешь и апкастишь. Ну и в таком духе штуки. Короче, это примеры реальных кейсов. Можно плеваться, что архитектура плохая и все такое, но ты не весь код на планете пишешь, и тебе никто не даст миллион лет делать адаптеры-хуяптеры и прочее, иногда нужно просто взять и сделать вчера.
>>2415014 Ну а если без шуток то вопрос не имеет смысла
если это только винда, то выбор из Qt или WPF очевиден - WPF (как родной) лучше всяких стороннних приблуд. И даже если не нужна мощь "рисуем впуклые круглые кнопки", то можно взять финформс
А если кросс, то выбор из Qt или WPF очевиден - кто из них кросс
>>2415140 > А если кросс Только кросс! Всегда кросс! >>2415014 > Qt или WPF? Ни тот ни другой. Юзай оверлейные тулкиты, которые на винде выводят твои абстрактные окошки через ВПФ/ВинФормс, на линуксе через КТ/ГТК, на маке через маковское говно. Например, я выбираю графический тулкит Eto.Forms.
>>2415686 > Юзай оверлейные тулкиты, которые на винде выводят твои абстрактные окошки через ВПФ/ВинФормс, на линуксе через КТ/ГТК, на маке через маковское говно. То есть Qt
>>2415710 Я пробовал вкатиться в кют, но к своему стыду не обнаружил нормальных, юзабельных врапперов в шарп. Ткни носом, анончик, какой враппер ты юзаешь?
Есть задача - реализовать этакий прототип хэш таблицы (возможно, используется метод цепочек) На входе дается строка ключа навроде "farhncxs" и строка данных Нужно создать многомерный вложенный список (в данном случае уровень вложенности 8), в котором каждая буква ключа будет является идентификатором вложенного списка, и так до последнего символа В последнем списке будет пара ключ-строка данных Собственно вопрос - как реализовать класс для этой таблицы Пикча как пример, как это должно работать
>>2416140 Нет, для инди-поебени шарп можно учить на отъебись, запомнил базовый синтаксис и копай API юнити. Можно вооьще не учить, там есть какое-то no-code говно для юнити.
>>2416149 Кодить ты будешь 5 минут своего времени, все остальное это рисовать в блендере и накидывать анимации на скелет, а эта та еще ебатория. Большая часть времени уходит в модели, анимации, звуки, левел-дизайн и прочая залупня.
Хз дударь не учит как по мне, он лишь показывает базу, лучше пробуй ссылки в шапке там больше полезного.
А ну тебе еще обязательно надо базово знать тригонометрию, синус/косинус и вот это вот все + вектора и простую арифметику, математики применять будешь оч много.
Тогда да, попробовать можешь.
Я когда в геймдев ударился godot, то ахуел от того скок пришлось учить, потому что в школе не учил вообще ничего, даже не знал кто такой Эйлер и как находить синус.
>>2416140 > чтобы допустим инди поебень как неон вайт сделать? Ты неонвайт в одно омежье ебало не вывезешь. Погугли сколько там народу участвовало в девелопе.
>>2416260 >А ну тебе еще обязательно надо базово знать тригонометрию, синус/косинус и вот это вот все + вектора и простую арифметику, математики применять будешь оч много. Ты забыл еще матрицы и комплексные числа (особенно если в 3Д лезть)
>>2416481 >из него намеренно выпилили линукс. Я когда это осознаю - у меня едет крыша. Вы же в курсе что там под копотом комплится в джаву просто потому что нет поддержки линукса, т.к андроид написан на базе ядра линукс?
>>2416462 > А мауи скомпилится и запустится тоже? Нахуя тебе переобутый в полёте хамарин? Юзай кроссплатформенные тулкиты, которые на каждой из поддерживаемых систем разворачиваются в нативную графическую подсистему, например, в линуксе в ГТК, в шынде шын32, в макоси макошное говно. Например, из таких тулкитов есть Eto.Forms.
>>2416514 > Почему ты не выучишь кресты? Потому что у них омерзительные закорючки и звёздочки вместо человеческого синтаксиса. Я лучше потерплю лишние 500 тактов проца и лишние 300 Мб бинарника, чем полезу в это дерьмо. Нахуя ты крестовыблядок в шарпотред залез? Репортом по айпи уебать?
>>2417074 Конечно. Это по сути та самая ситуация когда чед просто подошел к твоей тян рыночку, агрессивно схватил за пизду, та потекла и пошла с ним ебаться..
>>2417451 Да и вообще, сама идея иде с логином в аккаунт - порочна. Вот майкрософт там что-то заявлял об уходе из России. Ща возьмут и заблочат студию дистанционно. И чо теперь? Так что нет, надо искать альтернативы. В т.ч. на торрентах, хехе
>>2399284 (OP) Есть TcpClient. И есть Networkstream TcpClient.GetStream() И вот есть метод, где обрабатывается запрос и выдаётся ответ. Теперь, вся эта хуйня вызывается в отдельном потоке Parametrized threadStart Дальше, есть много клиентов. На каждого клиента - по потоку. Вот они подключаются, отправляют запросы... И внезапно, соединения закрываются блядь. Второй запрос если отправляется, TcpClient.GetStream() снова вызывается и какая-то хуйня получается - соединение рвётся нахуй.
Кроче, что делать с этой хуйнёй? Надо шоб соединения были открытыми, и активными, и чтобы они держались открытыми и не выёбывались мне.
Как в злоебучем ридере смапить директорию в готовый билд? Вот есть у меня папка www, там несколько html говна, но при билде они не открываются т.к. CurrentDirectory не та.
Когда запускаю модальное окно в WPF, то многие события учитывают родительское окно: MouseLeave, Deactivated.
Грубо говоря, если я увожу мышь с модального окна на родительское, то событие MouseLeave не срабатывает. Но если я увожу в другое место, то событие срабатывает.
Как это убрать? Мне нужно закрыть окно, если пользователь кликает за его пределами.
>>2417635 > TcpClient client = new TcpClient(); > client.Connect(server, port); > NetworkStream stream = client.GetStream(); > > byte[] data = new byte[256]; > StringBuilder response = new StringBuilder(); > >//запрос > byte[] buffer = Encoding.UTF8.GetBytes("request"); > stream.Write(buffer, 0, buffer.Length); >//ответ > do > { > int bytes = stream.Read(data, 0, data.Length); > response.Append(Encoding.UTF8.GetString(data, 0, bytes)); > } > while (stream.DataAvailable); // пока данные есть в потоке > > Console.WriteLine(response.ToString());
В самом верху создаётся новый TcpClient, подключается, а потом с него берётся поток stream. Дальше идёт запрос-ответ, в поток этот и из него. Как повторить эту хуйню, так, чтобы ещё один запрос отправить в поток, и ответ получить из него? Какие-то ёбанные оффсеты надо задать штоле? Как и где их задать, блядь? Постоянно рвётся соединение, сукка. А новый клиент для каждого пука - создавать не резон, потому что куча соединений открывается, блядь, на разных портах. Надо одно соединение и там уже данные гонять по нему, а не хуеву кучу соединений ебучих, от которых весь инет виснет нахуй.
хуй знает, ты скинул два куска, и че то интересное, видимо, происходит между ними. че значит рвётся, какую ошибку то он кидает? там разные бывают, знаешь
>>2418105 Ну, я просто, снова, продублировал код, где запрос и ответ и вместо >byte[] buffer = Encoding.UTF8.GetBytes("request"); написал вот это вот всё: > stream.Close(); > client.Close(); > client = new TcpClient(); > client.Connect(server, port); > stream = client.GetStream(); > response = new StringBuilder(); > buffer = Encoding.UTF8.GetBytes("request2");
Вижу два запроса и два ответа: >REQUEST >REQUEST2 >Запрос завершен...
А теперь думаю, как же можно выкинуть из кода всё это вот, ненужное ??? > stream.Close(); > client.Close(); > client = new TcpClient(); > client.Connect(server, port); > stream = client.GetStream(); Чтобы не открывалось новое соединение с нового TCPClient'a, блеать?
>>2418118 Там, походу, во втором запросе, надо как-то хитрожопо, писать в конец потока, и читать из конца потока. Короче, надо задать оффсет какой-то, смещение, в потоке, или что-то наподобие этого. А как это сделать - хуй знает. А то оно читает аж пока данные есть в потоке. А потом что-то происходит, наподобие EOS (End Of Stream), после чего stream.DataAvailable становится false и софтина выпиздячивает чтение данных из цикла.
А когда открываешь >NetworkStream stream = client.GetStream(); оно по новой хуярит чтение - с начала потока... И как эту хуйню зарулить - хз.
Сломался диск где лежат кеш пакетов, и теперь установщик вообще не видит вижуал студию Можно ли как-то восстановить без переустановки? Хотя даже заново установить не даёт, пишет папка уже занята
>>2418037 причем тут вообщще MVVM до закрытия окна с помощью мыши? Проблема автора вообще никак не лежит в плоскости MVVM даже рядом не лежит, да и за 100 км тоже не валялась.
>>2418029 так просто не делай окно модальным и всего делов. Любой клик на родительское окно все равно должен закрыть - ну так лови там превиев событие и если дочеренее открыто, то закрой его
>>2418029 А еще есть Mouse.Capture() это позволяет ловить клики за пределами там чего то. Так закрываются попапы (например комбобоксы или меню) если кликнуть куда то еще.
Не могу сказать как это работает если больше одного окна
>>2418029 В общем то Mouse.Capture работает, но если тебе не нужно отличать куда кликнули - на родитеьскую форму, на десктоп, на титлбар модального окна иначе тебе придется вычислять куда был клик, что геморно Да еще всякие там textbox любят срывать capture
>>2418133 Чел, у тебя херня мутная пиздец. Ты кидаешь кусок, как ты читаешь, но я не вижу, где ты отправляешь ещё раз запрос туда. Ну и чтения со стороны сервера тоже нет. Ошибку ты не написал, то есть непонятно, кто мудачит. Короче, земля тебе пухом.
Да мне нужно модальное, чтобы ожидать закрытия. Я уже и так сделал через обычный запуск при помощи Await, просто каждый раз есть соблазн использовать модальное окно, типа одной строкой, и каждый раз жую говна с ним.
>>2418459 > Да мне нужно модальное, чтобы ожидать закрытия
Да, делается через await немодальное окно. Это нормально. Я так делал когда у меня несколько немодальных форм и если одна из них откроет диалог, то остальное лочит нахер. Поэтому все через await и Preview события на "заблокированных" окнах
>>2418529 Ух ты, что-то подобное я искал. Только не понял что значит конвертировать. Я Ж 1. создал новый экземпляр TaskCompletionSource 2. в переопределенной функции ShowDialog поставил его на Await 3. в событии Closing использовал TrySetResult.
>непонятно зачем вечный цикл. а разве внутри TaskCompletionSource не сидит какой нибудь цикл или таймер? Как оно там бесконечно ожидает события?
>>2418692 >Только не понял что значит конвертировать Любое асинхронное что угодно можно выразить в Task. В этом и есть смысл Task, как реализации корутин - чтобы была унифицированная работа с любой асинхронщиной.
>а разве внутри TaskCompletionSource не сидит какой нибудь цикл или таймер? нет. это такой же объект как и CancellationTokenSource. Очень простая штука. По просьбе он просто выставляет значение у таски, как CancellationTokenSource у CancellationToken
А смысл существования CancellationTokenSource и TaskCompletionSource - чтобы получатель Task или CancellationToken не могли их изменять. Точно так же с LifetimeDefinition и Lifetime - спец объект холдер для изменения токена.
>Как оно там бесконечно ожидает события? никто никого не ожидает. У Task есть ContinueWith (вернее для внутренних нужд там более лекговесный интерфейс, но суть та же), то есть по факту подписка на изменение состояния. Понимаешь же как работает event в шарпе - никакой разницы нет.
Асинхронно - когда ты дома ждешь посылку, то не бегаешь к окну выглядывать курьера, а он сам тебе позвонит когда приедет.
Так и в тасках - ВСЕ просто подписываются на изменение состояния интересующей их таски (на звонок курьера) и по "звонку" планируют продолжение "позвонил, значит теперь можно делать это". Все эти продолжения планируются с помощью TaskScheduler (дефолтный планирует на тредпуле) на выполнение и потом перемалываются тем, кем запланировано выполнять.
await же просто сахар, где компилятор за тебя пишет многочисленные ContinueWith (на деле конечно не их,а другую более эффективную структуру, но смысл одинаковый)
>>2418709 >Асинхронно - когда ты дома ждешь посылку, то не бегаешь к окну выглядывать курьера, а он сам тебе позвонит когда приедет. Ну аналогии всегда понятны, но непонятно как это работает в коде. Почему же если сделать пустую асинхронную функцию, то она просто выполнит себя и завершится? Для этого она должна что-то ожидать, но мы снова плодим очередную асинхронную функцию, внутри которой пустота и которая так же быстро завершится, если внутри нет цикла.
Правильно ли я понял, что запускается задача, смотрит на условный флаг, если он отрицательный, то программа идет дальше, перешагивая через все, что идет после await? И при каждой итерации будет заглядывать в функцию, прыгать "аля GоTo" в задачу и снова перешагивать код, пока в это задаче не будет положительного флага?
>Понимаешь же как работает event в шарпе - никакой разницы нет. Я это понимаю так, что какая-то функция вызывает событие, которое проходит по списку подписок, которые являются ссылками на функции. Тут мне понятен механизм без циклов. Функция события просто запускает функции по ссылкам и подписчикам не нужен цикл для мониторинга.
>>2418474 Кстати да. Как-то ещё в дельфийские времена читал критику принципа модальности. Типа, если софт слишком сложный, он может выкинуть больше одного модального окна за раз и самозалочиться.
>>2418768 ты как то сложно выразился но в общем - нет никакого цикла для мониторинга. Нет никаких условных флагов
попробую упростить на котиках синхронный метод void Foo(){ MakingTea() WaitForCat() PetTheCat() WaitForDog() PetTheDog() } пока мы внутри чего то ждем, то поток зря блокируем.
Поэтому очевидная мысль - а пусть пока он ждет то не будет блокировать поток. Я пропущу шаг с калбэками, потому что это сразу вырождается в калбэк в калбэке в калбэке в калбэке И сразу перейду к продолжениям (корутинам)
Тут MakingTea() выполняется синхронно, а WaitForCat() уже асинхронная, поэтому тот код который должен выполниться по концу WaitForCat() уходит в Then
Что такое Then? Да это мы пишем либу, которая предоставляет метод Then, который принимает Action и когда action выполнен, то мы выполняем следующий. А пока время не настало (у нас action просто ждет), то и поток не занимаем Как понять, когда action выполнен - заводим токен Defer, который просто токен как и CancellationToken и к нему можно подписку Subscribe сделать. и его возвращает метод Then, и Then по факту подписка на Defer предыдущего action Так мы получаем цепочку продолжений. Заодно делаем пул потоков, где будем выполнять эти продолжения. Вводим сущность taskScheduler, чтобы "а пусть он планирует где выполнять, вдруг юзеру не нужно в пуле потоков, а свое что то". переименовываем Then -> ContinuwWith, Defer -> Task И вот мы изобрели подобие TPL
Как видишь - каждый асинхронный метод выдает объект Task, к которому можно подписаться и выполнить продолжение (который тоже выдает свой Task, к которому можно подписаться и выполнить...) Цепочка подписок и продолжений.
async/await - сахар, что заставляет компилятор написать все продолжения за нас.
MakingTea() выполняется в вызывающем потоке, поскольку он еще не дошел до точки "я ушел в ожидание и вот вам продолжение, выполните его когда нужно"
>сделать пустую асинхронную функцию, пустая асинхронная фукнция является синхронной, потому что нигде в ней нет точек, где "я тут в ожидании и мне поток не нужен" async это маркер, что в коде будут await и потому нужно строить стейт машину с продолжениями. Но если await нет, то и продолжений нет и все выполнится синхронно
Хочу добавить в игру что-то вроде простого сервис локатора. Обычные иок контейнеры, внедрение через конструкторы и прочее - недоступно, потому что движок так устроен.
Хочу через статический класс Context получать ссылки на конфиги и сервисы: Context.Resolve<StorageConfig>(); Context.Resolve<IAccountService>(); Context.Resolve<ILocalizer>();
Устанавливаться сервисы и конфиги будут через Context Installer. Я выбираю в редакторе Production, Staging или Development, и в зависимости от этого подключается нужный инсталлер.
Думаю как бы всё это организовать в плане классов/интерфейсов? Не хотел использовать связку ServiceCollection + ServiceProvider(ServiceCollection collection) по аналогии с asp.net, потому что внутри инсталлеров будут задаваться как сервисы, так и конфиги, поэтому это будет вызывать путаницу, типа: services.AddInstance(UIConfig); services.AddFromPrefab<IPlayerService>(playerServicePrefab);
В общем, набросал пикрелейтед, но что-то мне не нравится. Классы ContextBuilder и ContextContainer будут использоваться только внутри класса Context, а снаружи только интерфейсы IContextInstaller и IContextBuilder.
>>2418410 Чувак, я же скинул всю инфу. >Ты кидаешь кусок, как ты читаешь, но я не вижу, где ты отправляешь ещё раз запрос туда. >>2418092 >stream.Write(buffer, 0, buffer.Length);
>Ошибку ты не написал, то есть непонятно, кто мудачит. Да там разные ошибки, в зависимсти от того, что закомментировать.
>Ну и чтения со стороны сервера тоже нет. Там сервер тупо делает это >TcpListener server = new TcpListener(localAddr, port); >server.Start(); и дальше в бесконечном цикле >TcpClient client = server.AcceptTcpClient(); и потом в >using (NetworkStream stream = client.GetStream()) читает и отвечает той же строчкой, больше нихуя.
Так вот, я продублировал этот юзинг ебучий на сервире, и вижу такую хуйню: >System.InvalidOperationException: Операция не разрешается на неподключенных сокетах. > в System.Net.Sockets.TcpClient.GetStream() А клиент шлёт второй запрос, но нихуя не получает. Там надо что-то вроде stream.Seek stream.Peek или оффсет какй-то блядь задать, походу, чтобы оно нормально читалось этот ебучий запрос.
>>2418907 Это Unity3D. Там своя архитектура, свой подход к написанию кода. Там даже у базового объекта Object переопределены операторы сравнения, чтобы сравнение с null сделать иначе (из-за этого многие начинающие попадаются на трудноуловимые баги)
>>2418982 Кстати вот это синхронное выполнение до первого await иногда портит жизнь. Например HttpClient await http.GetAsync тупо тормозило. Потому что dns запрос выполняется синхронно, а на машине стоял каспер и вызывал тормоза.
Еще можешь увидеть ValueTask. любая асинхронная операция возвращает Task (унифицированный подход), но если ты читаешь из stream, то там у тебя буфер. Ты читаешь из него по 10 байт, а он при первом запросе мог забить буфер на 80кб и далее тебе синхронно отдает из этого буфера. То есть уже при втором запросе он за данными никуда не ходит (они уже у него в буфере), но Task приходится создать на каждый такой запрос чтения. И получается много аллокаций на ровном месте. И тут на сцену выходит ValueTask - GC на него плевать, но получаешь больше копирования ибо это структура.
TaskCompletionSource полезен, когда нужно вернуть Task сейчас и вручную потом установить его состояние. Это примитивный объект холдер. Нельзя чтобы каждый встречный поперечный мог изменить состояние Task. Поэтому Task - риоднли и заводится объект-владелец через который и можно менять. Такой же подход и в CancellationToken, IMemoryOwner и так далее.
Ну и лишний пример для понимания. Вот у тебя класс, который в 1 выделенный поток перемалывает что-то. И у тебя есть внутренняя очередь и есть метод exceсutor.RunAsync(Action action, CancellationToken) который внешний код вызывает. Но этот action может быть сотый в очереди и мы не можем его выполнить сейчас. И мы не можем блокировать в этом месте и поэтому должны вернуть Task Вот тут нам и приходится TaskCompletionSource - мы его создаем и возвращаем его Task, а его самого кладем в очередь вместе с action и когда до action дойдет очередь и он будет выпонлен - мы воспользуемся сохраненным TaskCompletionSource и выставим статус у Task
Так же работают и всякие AsyncQueue - для каждого входящего "await queue.GetNextItemAsync()" создается TaskCompletionSource, кладется во внутренний список `List<TaskCompletionSource> awaiters` и возвращется его Task. Как только в очереди появляется новый элемент, то берется первый TaskCompletionSource из списка awaiters и выставляется SetResult(item)
Ну и часто рядом ходит CancellationToken - тут нужно не забывать подумать про CancellationTokenSource.CreateLinkedTokenSource() Неважно как оно выглядит task.ContinueWith cancellationToken.Register() obj.MyEvent+= подписка есть подписка и можно легко подвесить приличный граф в памяти. вот и на моем пике >>2418705 TaskCompletionSource захватывает child. Это не страшно, поскольку просто создает кольцевую ссылку, но лучше все таки так не захватывать.
Как в 22 студии сделать горизонтальный скролл с шифтом? Там есть аддон для этого, но он выдает ошибку при установке понятно, что надо использовать райдер, но на работе мы используем VS
В треде есть блейзор-зумеры? Как на кестреле(!) завести content compression? Проделал все отсюда: https://docs.microsoft.com/en-us/aspnet/core/blazor/host-and-deploy/webassembly?view=aspnetcore-6.0#compression И по итогу только несколько блейзеровских js'ок (и то не все) с тегом content-compressed. Это норма? На простом asp net core было: services.AddResponseCompression(); services.Configure<BrotliCompressionProviderOptions>(options => { options.Level = CompressionLevel.SmallestSize; }); И такой же конфиг для gzip'a. Мне что-то не очень хочется поднимать IIS т к. у меня мелкохуита и он по бенчмаркам а тырнете на порядок тормознутее простого кестрела без прокси оберток.
>>2419058 1) Чувак, ты попутал. Есть юнити как игровой движок Unity А есть DI контейнер с таким же именем - Unity. Это две совершенно разные вещи и у них только имя одинаковое.
2) И, кстати, этот контейнер считается устаревшим и использовать его не стоит. Сейчас актуальны только два: родной майкросовтовский и Autofac. Про все остальное можно уже забыть.
3) В юнити (движке), вроде как народ применяет DI, но то ли там что-то специфическое, то ли народ просто свои велосипеды пишет. Как-то так.
>>2418953 > Там даже у базового объекта Object переопределены Object и object это разные классы.
> Там своя архитектура, свой подход к написанию кода. Нет там ничего такого. Там просто есть инфраструктура для реализации паттерна компонентов, в основе которой лежат классы наследуемые от MonoBehaviour, и которые ты ещё и можешь вешать на объекты на сцене, а как ты будешь этим пользоваться - дело твоё. Можешь любую архитектуру вертеть, главное чтобы тебе удобно было с ней работать.
Ты можешь игру написать ваще как угодно, в обход апдейтов и всех "нормальных" подходов, а монобехи использовать только для вывода графики. И это не то что-бы что-то плохое - MVC вполне применяют. Есть даже несколько ассетов для ентити компонент систем(в том числе от юнити), которые тоже подразумевают ваще странную архитектуру, которая очень костыльно вписывается в юнити(но, почему бы и нет)
>>2419568 > В юнити (движке), вроде как народ применяет DI, но то ли там что-то специфическое, то ли народ просто свои велосипеды пишет. Как-то так. Там Zenject(Extenject) юзают. Но можешь чё угожно юзать, это не принципиально, в зенжекте просто много полезного есть, что сразу работает с компонентами и объектами юнити.
>>2418804 У тебя че там так много сервисов будет, чтобы такую залупу надо было городить? Зенжект юзай тогда просто
Как удалить MemoryMappingFile из оперативки? Еще не могу понят почему на считывающей стороне при первом запуске ругается, что файл с таким именем не найден, но при последюущих обращениях все норм. Причем даже когда я перезапускаю программу или ПК, больше этой ошибки не возникает.
Но ведь MemoryMappingFile не может оставаться после закрытия программы, да?
>>2419588 >Object и object это разные классы. будни сишарпа. Никогда не понимал, зачем плодить сущности, различающиеся только размером буквы. Хорошо, что в бейсике нет чувствительности к регистру и это не плодит мудаков.
Этож надо сидеть с линейкой и определять отклонение дуги O на несколько пикселей, чтобы понять что тебе высирает интелсенс. Больные люди.
>>2419588 > У тебя че там так много сервисов будет, чтобы такую залупу надо было городить? Проблема не столько в DI контейнере(его достаточно просто реализовать), а в переключении режимов. У меня, как и в вебе, есть три режима запуска игры: Productuion, Staging и Development. В первых двух меняются только ключи доступа к многочисленным внешним сервисам (бекенд, мультиплеер, аналитика, пуш-нотификации, реклама). В третьем используются фейковые сервисы.
Игра мобильная, но тестирую я её как на мобилках, так и на ПК. А значит мне под Mobile и Standalone уже нужен немного иной набор сервисов (MobileAccountService и StandaloneAccountService; MobileInputSystem и StandaloneInputSystem; DebugAnalyticsService на пк, а на мобилках - реальная аналитика). Из этого получается, что мне нужно 6 конфигов для запуска.
В игре много сторонних фреймворков, которые скрываются за моими сервисами. Мне хочется иметь возможно быстро подменять real сервисы на fake сервисы. Но у fake сервисов есть свои конфиги (фейковые данные, имитирующие бекенд например). Вот думаю, как хранить все эти наборы конфигов и сервисов так, чтобы между ними легко было переключаться, и чтобы в них легко можно было вносить изменения.
Хочу сделать общий набор конфигов (там же будет общий debug-конфиг для всех debug-сервисов и он будет доступен в продакшене, если вдруг мне нужно будет заменить временно реальный сервис на фейк в продакшене для отлова бага или на время разработки). И общий набор сервисов. И потом подключать их в главном конфиге.
Для standalone не буду с нуля заполнять все данные. Воспользуюсь методом AddOrReplaceComponentFromNewPrefab, чтобы заменить тот же MobileAccountService на StandaloneAccountService.
>>2419707 > будни сишарпа. Никогда не понимал, зачем плодить сущности, различающиеся только размером буквы. Нет, Object это класс созданный для вполнк конкретной цели, он не буквой отличается. В юнити есть своя система сериализации, через неё работает весь контент в проекте. Для того чтобы ты мог просто взять и перетащить материал на модельку на сцене - материал должен быть Objectом и все объекты на сцене Objectы, у них там есть инстанс айди через которые оно всё работает... Название путающее, но этот класс необхожим. При этом само собой, ты можешь делать классы, которые НЕ Object, никаких проблем.
>>2419797 Блять, я даже половины из вышеописанного не понял. Как же мне сделоть свою игру? Эхх... Придётся программиста нанимать. Пойдёшь в мою студию? Зарплата - банка тушёнки.
>>2419819 >Нет, Object это класс созданный для вполнк конкретной цели, он не буквой отличается. Я понимаю, сам писал плагины для графических программ и всегда хочется назвать какой-то элемент объектом, что вводит в диссонанс с логикой .NET Но я имел ввиду зачем назначать одинаковые имена классам, которые визуально отличаются малой и большой буквой? Ну назви ты UObject или SceneObject.
Даже если я делаю локальное поле, то я обязательно пишу впереди прочерк _object, поэтому даже в самый жаркий день если мне голову напечет, я случайно не перепутаю переменные.
>Название путающее Вот и я о чем. Разрабы пошли против шерсти. Если бы это был бейсик, то их дезориентирующая деятельность не прокатила бы.
>>2419855 > Как же мне сделоть свою игру? В какой-нибудь инди-игрушке на ПК всё это дерьмо не потребуется. А вот если ты делаешь сетевую сервисную игру на мобилки, то готовься к Аду.
Как в редакторе xaml добавлять обработчик события со своим именем, чтобы среда сама добавляла нужный код в класс? Пока это работает только со стандартным именем метода, который предлагает студия.
Внутри основного окна создаю экземпляр окна (которое я даже не запускал), после чего при закрытии основного окна в режиме отладки, студия не хочет детектить закрытие приложения.
>>2420050 >это вопрос сродни "а скажите колеса еще используются в машинах"? Я ж не знаю что там в продакшне происходит. И видел еще видео какого-то сеньора, который пояснял, что лучше юзать MediatR для этих дел.
>>2420074 1 на асп.нет продакшен не заканчивается. 2 и даже если асп.нет и даже если прямо прямо последнее, то насчет MediatR - его личное мнение. У MediatR есть сторонники и противники - и их больше чем сторонников. (такая же ситуация как и с DDD)
Аноны, есть ли в треде тестировщики-автоматизаторы на данном языке? Если есть, подскажите пожалуйста что нужно почитать. Вкатился в новую компашку из php и пишу автотесты на шарпах чисто по аналогии с пыхой. Тимлид смотрит мой код и ужасается, говорит про всякие дженерики и прочие приколы. Какую true книжку можно почитать по таким тонкостям языка?
>>2420200 Я х.з. что ты за тесты на шарпе пишешь. Но если это действительно какие-то автотесты, то имхо ты страдаешь хуйней, т.к. для этого есть более удобные инструменты чем шарп и то, что ты на нем напишешь.
Если же ты имеешь в виду юнит тесты. То там наоборот - чем проще и тупее тем лучше. Т.к. вся суть юнит теста - быть простым, проверять какой-то необходимый минимум функционала за раз и быть легко отлаживаемым. Если же ты начнешь на них наворачивать какие-либо паттерны и усложнять, то заебешься потом искать где у тебя косяк в коде или самих тестах.
Два объекта одного типа должны быть равны, если равны два любых поля: public override bool Equals(A other){ //... return this.Foo == other.Foo || this.Bar == other.Bar
>>2420074 > лучше юзать MediatR для этих дел У меня вообще такое ощущения, что properties и events в C# - это жуткий костыль от которого надо избавляться. Проперти претворяются обычными полями и скрывают внутри себя логику, которая может приводить к неблагоприятным последствиям. Ивенты создают много проблем с утечкой памяти, нужно постоянно отслеживать привязки.
>>2420791 у тебя неправильные ощущения. Конечно event в своем реализации не самая удачная реализация паттерна Observer, но PubSub инвертирует не только недостатки, но и достоинства первого. Получив плюшки, теряешь...другие плюшки. Идеала нет.
MediatR (так паттерн требует) достоинство - скрывает компонент который обработает запрос недостаток - скрывает компонент который обработает запрос
Более того, MediatR усиливает это достоинство(а может недостаток) тем, что базируется по дефолту на IoC
MediatR не первая и не уникальная реализация паттерна, Просто очередная с предсказуемым результатом - а хороший он или плохой - фломастеры
Про свойства вообще бред. Тут даже нечего обсуждать. Они были введены в язык потому что тупо нужны. И в тех языках, где их нет, тупо пилят свои кастомные getProp()/setProp() и плачут.
А скрыть логику можно и в явном методе setProp() - как будто вызывающему коду вообще есть разница.
>>2420801 > Про свойства вообще бред БОЛЬШАЯ проблема свойств том, что ты не знаешь, как работать с конкретным свойством: как с полем или как с методом? Свойство при каждом обращении может выделять память. Свойство при каждом обращении может совершать относительно тяжёлую операцию, например, по поиску. И тебе в каждом случае приходится смотреть исходный код свойства, чтобы понять - я должен кэшировать значение?
>>2420820 >что ты не знаешь, как работать с конкретным свойством: как с полем или как с методом? А ты и не должен это знать.
>Свойство при каждом обращении может совершать относительно тяжёлую операцию узнать при первом же запуске. А то, что это свойство, а не поле - видно и так. Врочем поля все равно никто не делает, так что и знание это ничего не дает. Время чтения свойства покажет тормоза, и ты закешируешь если будет нужно.
Будь это метод... и что? как то, что это метод дает знание нужно кешировать или нет? А никак. Ты запустишь - увидишь тормоза...и закешируешь.
а если нет разницы, то зачем херить нужный механизм только потому, что его некоторые люди идиотски применияют. Попробуй сделать без свойств private set поле и сразу же свойства захочешь.
>>2420832 > только потому, что его некоторые люди идиотски применияют Вот эта неоднозначность напрягает. Я сейчас больше в геймдеве работаю. И есть примеры ебанутого использования свойств. Допустим, есть свойство MainCamera, которое даёт ссылку на основную камеру игровой сцены. Казалось бы всё охуенно, красиво, удобно. Открываешь исходник свойства, а там блять при каждом обращении происходит обход всех объектов сцены и поиск тега "maincamera". Ну, добавь ты метод FindMainCamera(), тогда всё будет очевидно и понятно любому дураку. Нет, блять, хочу свойства, это же сишарп, если есть свойства, надо использовать. Такие моменты часто встречаются.
>>2420982 > 4. С# для игр > Unity-тред в /gd/ Юнити одна из сильнейших сторон современного C#, а ты так невзрачно об этом написал? Можно делать игры и в два клика билдить их на множество платформ. Это же бомба.
>>2420990 Про геймдев есть отдельный тред на отдельной доске. Юнити это рыгня которую делали не майки, поэтому похуй. Тот кто хочет в игры найдет либо анриал енжин или юнити.
>>2420999 У нас в текущей шапке тоже самое. Я не стал менять поскольку никак не отношусь к геймдеву. Можешь написать сюда что считаешь нужным, а я добавлю
Есть базовый класс Base со свойством Visability. Этот класс наследуют еще два класса BaseExtendA и BaseExtendB, в одном из которых переопределено свойство Visability.
Так вот вопрос, как мне универсально обратиться к свойству Visability наследников? Если я буду обращаться к объектам через каст Base, то не сработает переопределившееся свойство. Я делал через Object и технически работает, но может есть какой-то более элегантный способ?
>>2421574 Я ща покумекал. Короче, если ты "переопределяешь" методы через new в наследниках, то это не переопределение, а сокрытие. И сокрытие так ебано работает, да. Тебе нужно override метода сделать, в этом вся суть полиморфизма так то. Почитай про виртуальные методы, переопределение и прочее, это база
>Тебе нужно override метода сделать А тогда можно обращаться к базовому свойству? У меня там суть такая, что выполняется логика базового свойства, плюс еще кое что. Я чет боюсь оверрайд использовать, какой-то он грозный.
Когда в наследнике оверрайдишь хуйню, то ты в нём же можешь использоваться base.Foo(), чтобы вызвать хуйню из предка. Через base идёт обращение к хуйне предка.
Какой именно синтаксис у свойств я не помню, но их тоже можно переопределять, тому что это по факту поле плюс пара методов.
И пихать много логики в свойства лучше не стоит, если ты там че-то исполняешь особое, лучше метод ебани. Свойства удобно юзать, чтобы модификаторы доступа для полей делать красивые, аля паблик гет приват сет.
Лучше почитай обо всём этом, это прямо самая-самая база, ты как-то рано полез штуки писать, раз в итоге начал заниматься вуду магией с сокрытием. На msdn есть всё, что тебе нужно знать.
>>2421646 Мне больно видеть, что ты не определился: использовать ли тебе var или использовать new(). Из-за этого получилась каша. Лично я решил использовать new() только для инициализации полей/свойств класса.
>>2421753 Ну да. Сам-то я как-бы того же подхода хочу придерживаться, что и ты, но чисто механически так выходит. Такая же фигня и с is not null. Типа я как-бы понимаю что этот вариант предпочтительнее, но иногда хреначу != null по старой памяти.
Все из-за отсутствия кодревью на работке. И нежелания настроить code-style чтобы оно просто не собиралось в случае отхода от стайлгайдов(((
>>2421769 > Такая же фигня и с is not null. Типа я как-бы понимаю что этот вариант предпочтительнее, но иногда хреначу != null по старой памяти. Ага, есть такая проблемка.
Когда мы по линкью запросу форичем проходимася - какую сложность по памяти получаем? Например, для кода на пике у нас память будет для всего запроса сразу выделяться, или оно просто пройдет и все действия одно за одним выполнит, не выделяя одноразово память под всю коллекцию?
>>2422196 выделится память на создание цепочки итераторов далее для каждого итератора будет MoveNext Если нет действий, где нужна материализация коллекции, то память расти не будет.
>>2422213 твоя сложная from ...where просто сахарная форма эквиалентного кода scores.Where().Select()
каждый этот метод Where/Select просто получает IEnumerable, создает итератор и возвращает его как свой IEnumerable, то есть просто наращивая цепочку.
Так на этапе определения LINQ запроса память расходуется на создание всех этих итераторов и все.
До момента запуска это просто цепочка итераторов. После запуска память будет расти пропорционально необходимости материализации. В твоем запросе вырастет чуть чуть даже если ты скормишь этому запросу бесконечный источник. Но стоит тебе добавить Distinct() и получишь атата
>>2422385 > Там 2 лярда строчек всего можно запхнуть. А ты собираешься такую здоровую хеш-таблицу в оперативной памяти держать? Совсем бака?
Я просто к тому, что это вопрос не про шарп. Почитай Introduction to Database Systems, пойми, что ты охуеешь это все нормально на про уровне реализовывать и бери СУБД под свои нужды. Попробуешь какую-нибудь монгу, поймешь что говно, возьмешь нормальную реляционную СУБД, например Postgres и будешь с ней как человек работать.
>>2422410 >> Там 2 лярда строчек всего можно запхнуть. >А ты собираешься такую здоровую хеш-таблицу в оперативной памяти держать? >Совсем бака? Ну если там value порядка Int32.MaxValue, то лучше просто ключи хранить в оперативке, а сами значения - на диске пусть лежат, и обращаться к нему по мере необходимости, кэшируя небольшие но частно-используемые values.
Но если там болеее 2 млрд пар ключ-значение, то одни лишь только ключи - уже в оперативку не влезут, какбэ.
>Я просто к тому, что это вопрос не про шарп. Ну как не про шарп, на шарпеге же вся хуйня.
>Почитай Introduction to Database Systems Да бля, нахуя мне тонны литературы на английском лопатить, это простая же задача, как-бэ. Тупо скинуть на диск хэш-таблицу, закэшировать часто-используемые ключи-значения, а остальное пусть на диске лежит, в raid массивах. Ну и собственно как эту всю хуйню заебенить чтобы годно было? Всякие там индексы-хуиндексы, оффсеты-хуйсеты, это вот это вот всё байтоёбство как делать - хз.
>пойми, что ты охуеешь это все нормально на про уровне реализовывать Как-то по непонятному пишешь.
>и бери СУБД под свои нужды Так а какую - ты так и не сказал. Какая там на шарпеге есть, чтоб была - для BigData?
>Попробуешь какую-нибудь монгу, поймешь что говно, возьмешь нормальную реляционную СУБД, например Postgres и будешь с ней как человек работать.
Тащемта у меня задача довольно простая. Раздать DHT между пирами, в децентрализованной сети: https://github.com/username1565/nanoboard/issues/21#issuecomment-1200594467 А чтобы её раздать, эту DHT, надо для начала заебенить норм HT (HashTable), и её уже потом раздавать, чтобы была DHT (Distributed Hash Table). И всё это говно ещё опенсорцное, и ещё и на шарпеге. Понял, да?
>>2422637 Реляционки и юзать. Просто есть некоторые дополнительные сложности связанные с масштабированием. Приходится применять вуду-магию с шардингами, репликациями, вынесением баз на отдельные физические сервера, оптимизацией запросов и работы с индексами, и т.д. Но это как-бы закономерный этап развития. На нем обычно приходит лысенький худой чел в очках в команду, с какой-нибудь профессорской степенью, смотрит на все это дело, морщит брови, и постепенно приводит вашу структуру к пригодной для того чтобы с этой самой бигдатой работать, а вам - приходится обижаться, что вот, теперь оказывается база данных не просто хранилище в которое ты серишь без разбора.
Некая программа использует мою библиотеку, написанную на net и мимикрирующую под native library с точками экспорта. Так вот, эта программа сперва выделяет memory block и передает переменную в функцию моей либы. Там меняется значение, после чего прога снова обращается к memory block и получает новые данные.
В принципе работает и так: public static float ChangeData(ref float data)) { data = 287; return 0; }
Но потом меня черт дернул использовать маршалинг: public static float ChangeData(IntPtr data) {
float M; M = Marshal.PtrToStructure<float>(data); Interaction.MsgBox($"Полученное значение: {M}");
M = 287; Marshal.StructureToPtr(M, data, false); Interaction.MsgBox($"Новое значение: {M}");
return 0; }
Короче вопрос, а оно того стоит? Программа думает, что моя либа написана на C. Экспортировал функции по этой инструкции: https://habr.com/ru/post/137300/ Не будет ли чего недоброго, если я буду использовать первый вариант?
>>2422690 Я пытался юзать unmanagedexports но там как оказалось с кодировкой не дружит. Надо шиндовс переключать в англ регион. Потом еще пару говен перелопатил и вы итоге свою тулзу написал.
Посоны, можете скинуть ссылку на сайт, который показывает, что компилятор делает, когда убирает весь этот синтаксический сахар в коде и показывает всякие метаданные
Вот допустим, я - дебил, хочу что-то делать без фреймворков и движков. В целях обучения. Допустим это должна будет быть игра. Рогалик именно что классического толка. Ну так вот. Я внезапно осознал, что не могу придумать архитектуру того как оно должно быть правильно. Типа, вот я делаю класс Game. Классический GameLoop: Update, Draw; Вот я решаю, что нужно добавить абстракцию: Scene и в нее запихнуть эти Update, Draw, чтобы можно было менюшки там делать, лоад-скрины и прочее Вот я ввожу SceneManager чтобы можно было просто получить доступ к сцене и GameLoop преобразуется в SceneManager.Current.Update, SceneManager.Current.Draw Вот я понимаю, что нужно будет делать сцену для игры и новая абстракция: Level, который та же сцена, но только теперь это уровень, с картой и всем таким. Можно конечно было бы эти уровни наследовать от GameScene, но мне кажется это неправильно, думаю лучше будет GameScene чтобы в себе хранил ссылку на текущий Level и переключал их по необходимости. Так вот. Чтобы между левелами хранить состояние игрока - я придумал GameContext, там инвентарь, хп, уровень, позиция на текущем уровне.
И вот чет мне кажется это все как-то сложно уже на этом этапе. Плюс - мне не нравится, что пришлось сделать класс GameObject, которые содержат методы Update и Draw. Не нравится это потому что какому-нибудь триггеру - не обязательно иметь метод draw - он должен просто проверять какое-то условие и если оно наступило - кидать событие. Но как это все скомпоновать вместе - я хз.
В общем. Может быть есть какая-то литература где рассматривается создание игры на примере какой-нибудь консольной рпг, чтобы там были эти всякие эффекты, объекты, инвентари рассмотрены и прочее?
Помидоры поясните. Вот приходит ко мне json, я его в объект кладу. Потом мне нужно этот объект превратить в объект другого класса. Ну я просто создал класс в нем метод типо UserConvert ну и типо в него пихаю один объект и на выходе получаю другой. Это правильный подход? Ну вроде все норм, но меня не покидает чувство что за такое могут и обосцать.
>>2422982 По хорошему - стоило бы сделать что-то типа: interface IMapper<TIn, TOut> { TOut Map(Tin @in); }
На деле - в принципе можно и так, особенно если у тебя какие-то приватные поля используются. Просто засерать такой вот фигней класс - ну такое. У тебя со временем может миллион классов появиться, к которым ты мапить должен, и все это будет вот там и ты уже хуй разберешься.
>>2422982 Если работаешь по DDD, то в принципе норм. В других случаях лучше выносить все это в экстеншены, чтобы не засирать класс, либо юзать автомаппер.
>>2422541 >А? Для любой популярной и мало мальски известной субд есть либа на шарпе. Не говоря уже о монге и постегресе >>2422618 >Я не о том, что их стоит юзать. Чел просто почему-то думает, что нет провайдеров на шарпе для этих субд. Да речь шла не столько о провайдерах, сколько о кодах их либ, а то всякие пре-компиленные бинарники без исходника, инклюдить к коду, ну как-то совсем не опенсорцно нихуя.
>>2422594 >даже в sqlite даже можно загрузить 281 ТБ (а еще можно сделать attach таких же 125 баз) Эксабайт не потянет, вроде.
>>2399284 (OP) Господа, можете посоветовать что-то похожее на пикрил? Тут ее неоднократно хвалили и говорили, что после ее полного прочтения можно смело идти в джуны. Но к сожалению, мне не хватает английского, чтобы свободно ее читать и это весьма сомнительное удовольствие по полчаса переводить каждую страницу, тем более после начала ООП.
>>2427515 Мне книга Троелсона зашла в свое время . Пишет легко и доступно объясняет . Не сказал бы ,чтобы уж очень глубоко ,но достатоно для того, чтобы вникнуть
Аноны, объясните плс одну вещь. Я попробовал посмотреть гайды на ютубе, но это только сильнее запутало. Есть стек, есть куча. В одном храняться значимые типы, во-втором ссылочные. Во-первых, нахуя это разделение нужно и на что это влияет при работе? Так же не понял этого дроча со значимыми и ссылочными типами: допустим, есть у меня две переменные инт со значением 10. Получается, у меня в памяти существуют два независимых числа 10? Если тип ссылочный, например, два стринга со значением "Hello". Это значит, что "Hello" существует только в одном экземпляре? А если я этот стринг решу запихнуть в метод аргументом и изменить его там? Я получу на выходе совершенно другую переменную? Или что?И опять таки - нахуй оно нужоно?
Всем привет. У меня имеется интерфейс, который имеет в себе protected метод Move(). Я этот метод реализую в классе Car, после я наследую класс Car. Как мне вызвать protected метод IMove.Move() в классе наследнике? Можно ли вообще так делать? Пожалуйста, объясните.
>>2430351 И вообще в чём прикол? Protected метод из интерфейса становиться private методом в классе Car, при этом еще хуй знает как его вызвать в классе наследнике
при откладке проекта с блейзер компонент "статический", не срабатывают функции на onInput и onChange в текстовых полях. в чем может быть проблема? уже переустановил студию и виндовс
Актуальна ли на данный момент книга CLR VIA C# ? Почитываю Албахари , он достаточно глубоко описывает синтаксис на современном стандарте , или Рихтер неизменная классика ?
>>2399284 (OP) >System.InvalidCastException: Заданное приведение является недопустимым. Как изгнать это ебучее приведение, которое вселилось в мой грёбанный код?
Мне нужно написать программулину для работы в консоли Линукса. Программа проста до безумия: открыть файл с картинкой в стандартном формате, отресайзить его и, допустим, скопировать поверх другого Canvas'а.
Приложение будет написано с нуля заковано в docker-контейнер, поэтому версия .Net абсолютно не важна. Какой из трёх стульев выбрать? Сам склоняюсь в Мауи, как к официальному решению от самого Майкрософт. Нужен ли Мауи доступ к видеокарте (её не будет в доккер-контейнере, тем более на прыще-сервере без физической видухи)? Что с остальными двумя?