Вы видите копию треда, сохраненную 14 октября 2022 года.
Скачать тред: только с превью, с превью и прикрепленными файлами.
Второй вариант может долго скачиваться. Файлы будут только в живых или недавно утонувших тредах. Подробнее
Если вам полезен архив М.Двача, пожертвуйте на оплату сервера.
Литература вторым постом
1. Ресурсы:
— https://dotnet.microsoft.com/learn
— https://docs.microsoft.com/ru-ru/dotnet/csharp/
— https://metanit.com/
2. Онлайн-компиляторы:
— https://ideone.com/
— https://dotnetfiddle.net/
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, но функциональность там достаточно сильно урезана.
6. С# для мобильной разработки
https://dotnet.microsoft.com/apps/xamarin
Новые возможности C# 9.0: https://devblogs.microsoft.com/dotnet/c-9-0-on-the-record/
Текст шапки: https://pastebin.com/pbK8CGqw
Кто нибудь запускал юнит тесты .NET 6 VS 2022 на линуксе? Чего-то нихера у меня не пашет, пишет якобы среда WSL не сконфигурирована хотя вроде все по инструкцции сделал. Более того, до этого из студии на той же WSL собирал сишный проект на CMake и все сходу завелось, студия сама предложила доустановить на линукс недостающие компоненты.
ПЕРЕКАТ >>2334153 (OP)
ПЕРЕКАТ >>2334153 (OP)
ПЕРЕКАТ >>2334153 (OP)
ПЕРЕКАТ >>2334153 (OP)
ПЕРЕКАТ >>2334153 (OP)
2года опыта, ненавижу тесты блядь.
Не вкатывайтесь в шарп глупцы, хуже только кресты
На днях тестовое на ждуна делал - с прокторингом (запись камеры, микро и экрана) разбирал, что выведет непотокобезопасный отвратительный говнокод и кучку задачек на логику
https://hh.ru/vacancy/66905085?from=share_android
мимо перекатился с ноды за месяц
>3. WinForms или WPF?
Это еще предмет спора? Мне кажется, что уже даже WPF начинает отдавать гнильцой.
ОК, спасибо
Там типа обычная очередь из квадратов чисел от 0 до 9999
И по количеству ядер запускаются потоки, которые берут числа из очереди и суммируют в общую переменную
Вообще не стоит вкатываться. Ша требуют такой багаж знаний на мидла, что охуеешь.
Никогда не стоило вкатываться, а щас - особенно не стоит. Посмотри жабу. Тот же с#, но оригинал.
В то время на джаве никто ни с какими пространствами в анусах не заморачивается, когда на ассемблер# надо заебываться с такими низкоуровневыми вещами, как инклюды.
>Джава
>Якобы образчик ООП
>ни с какими пространствами в анусах не заморачивается
Вы все видели, вы все слышали.
VSCode это кал для дебилов не сумевших раздобыть нормальную VS.
Ни пространства ни инклюды к ООП отношения не имеют. Это исключительно технические подходы к реализации языка.
Там только проекты входящие в решение прописываются, ебушек. Если ты закинешь .cs файл с классом в каталог любого проекта, то он спокойно подхватится и будет добавлен в сборку проекта без какого-либо пердолинга
Блин, и правда. Я не туда класс закинул.
Между DLL и неймспейсами прямой связи нет. DLL соответствует сборке (assembly). В одной сборке может быть несколько неймспейсов. С другой стороны, классы принадлежащие одному неймспейсу могут располагаться в разных сборках.
Oooo...
Пространства имеют отношение к инкапсуляции. В джаве может это как-то иначе называется, но суть должна быть таже. Поэтому нет смысла катить бочку на неймспейсы.
Смотря как и смотря где.
Если ты юзаешь управляемый ресурс, то может заругаться еще на стадии конпиляции, но это больше относится к классам и методам. Но так-то название dll это тоже часть пути, то заругаться может и не может.
>Но так-то название dll это тоже часть пути, то заругаться может и не может.
Щас чет спизданул и сам охуел.
В задаче, где все треды большую часть времени одновременно юзают одни и те же данные, мультитрединг нахуй не нужен.
Обработка запросов, рендеринг, обучение нейронок, алгоритмы сортировки, используемые в СУБД.
Мимогорящий вкатыш.
Любая предметная область сводится к связыванию сущностей и передаче данных через что-то, и не важно, статики или параметры методов. Пиши хоть процедурно, хоть объектно, хоть функционально - одно и то же говно.
>Из шапки.
Сколько книжек и каких надо прочитать чтобы можно было устроиться на работу?
>В стол.
Почему не на гитхаб?
> Сколько книжек и каких надо прочитать чтобы можно было устроиться на работу?
По самому языку хотя бы одну, ещё пару по всяким технологиям, алгоритмам, подходам. Но практика куда важнее книжек.
> Почему не на гитхаб?
Да хоть на чёрта лысого. Ты пишешь код в первую очередь для себя, чтобы оттачивать свои скиллы. На гитхабе чужие хеллоуворлды мало кому интересны, у каждого и так есть своя свалка учебных проектов.
>Сколько книжек и каких надо прочитать чтобы можно было устроиться на работу?
У тебя не возникало желания написать приблуду, которая бы облегчила тебе работу? Может тебе не нравится как работает какой нибудь софт? Пробовал хотя бы делать моды для игр?
Тебе нужна движуха, пусть идиотская с точки зрения КПД для немедленного обогащения, но решение какой либо задачи заставит тебя использовать определенные инструменты.
Читать книжки просто так — самая тупейшая идея, если ты не гений.
>2400054
>И как в этом всём разобраться?
По-моему все легко.
У тебя есть N задач, выполнение которых не зависит друг от друга. Например массив строк, которые нужно распарсить.
Совершенно очевидно, что парсинг второй строки может выполняться независимо от парсинга первой.
Но если у тебя B-задача не может начать работу без результатов A-задачи, то мультитрединг не подойдет, офкос. Если задачи А и Б блокируют что-то еще, то вот тут уже используется асинхронность — на скорость выполнения А и Б не повлияет, но задо даст дорогу другим задачам. Как-то так.
Такое есть, но этим я буду заниматься когда перекачусь с реакта на другую работу, щас бы сам язык выучить.
Да да я да
В процедурке я могу объявить переменную в самом начале и потом без костылей обращаться к ней хоть со 100000-й строки кода. Понятно, что процедурка энивей неюзабельное и неподдерживаемое говно, но ООП тоже то еще мозгоебство. Создай экземпляр класса, в нем экземпляры остальных классов, из которых ты потом хуй вызовешь параметры из экземпляра основного класса, потом появляются другие сторонние классы, все это запутывается и здравствуй макаронная фабрика с огромным объемом кода и строками, вылезающими за границы экрана с постоянными проверками миллионов условий для того, чтобы сделать один пук.
Ну как бы да. Ты платишь всей этой сложностью за то, что у тебя появляется возможность сделать так, чтобы пук был чуть другой тональности просто подминив один из объектов на другой с таким же интерфейсом на этапе сборки этого дерева объектов.
> Создай экземпляр класса, в нем экземпляры остальных классов, из которых ты потом хуй вызовешь параметры из экземпляра основного класса, потом появляются другие сторонние классы
Читай про dependency injection.
А, эта хуйня именно для того, чтобы упростить этот процесс? А я-то думал это какая-то сложная залупа для сеньоров, чтобы кучу разных технологий вместе склеивать.
Что мешает использовать и то и другое?
Когда приходится работать с какими-либо unmanaged модулями. К примеру, дергать какое-нибудь виндовое api.
Недавно работал с неуправляемой библиотекой, у которой ref аргумент функции — это указатель по сути. А он еще с стринговый, а каждая манипуляция со стрингами в C# создает новый экземпляр, а не переписывает данные по текущему адресу.
А я еще на бейсике писал, а там нет блока unsafe.
> Пространства имеют отношение к инкапсуляции.
Давай определимся с терминологией?
Инкапсуляция - это когда участок кода "капсула" делает одну вещь, делает её хорошо, и ей (капсуле) не нужны другие участки кода, таким образом код in-capsule.
Неймспейсы же не имеют отношения к инкапсуляции в том виде, в котором я только что задефайнил. Неймспейсы позволяют нескольким "капсулам" обмениваться данными, что имеет отношение к интерфейсам, которые опять же не имеют отношения к ООП.
Порриджи, сэр.
>и ей (капсуле) не нужны другие участки кода
Как так, если все ооп строится на связях между объектами?
Так, что связываются объекты своими интерфейсами, а не участки кода кишками своих реализаций.
потому что это мобильщина (где датагриды не нужны по понятным причинам) которую пытаются портировать на десктоп.
В первую очередь это какие-либо дескрипторы ОС. Даже если ты дёрнул Close и вернул их ОС, то дергать Dispose нужно на случай, если в классе реализован финализатор с Dispose паттерном. В таком случае, если класс грамотно написан, в методе Dispose дернется SuppressFinalize для объекта и сборка мусора пройдет быстро и безболезненно. А если не дернешь, то сборка мусора пойдет длинным путем с вызовами финализаторов в отдельном тредике и возможностью для программы развалится нахуй, если финализатор кривой, так как исключения выбрашенные в финализаторе обработать никакой возможности нет.
>>400237
Как говорится заставь дурака инкапсулировать, он абсолютно все спрячет и будет связывать интерфейсами. Инкапсуляция позволяет применять имена методов и полей только в пределах своей среды обитания. Инкапсуляция, прежде всего это возможность что-то скрыть.
А у тебя суперфанатичная крайность: ну вот передо мной топор, я буду им и дрова рубить и кашу готовить.
Нет, это я вам перезвоню.
По сути просят готового спеца который может в соло тащить небольшой проект, под видом джуна.
>По сути просят готового спеца
Самые обычные требования к бэковику.
>в соло тащить небольшой проект, под видом джуна.
Обычная практика для мелких галер. Но опыт даёт ебейший, по сравнению с работой в команде все 2-2.5х. Если лояльно к проёбам на начальных этапах будут относиться то вообще всё норм.
Это вообще как? Уже кучу всего перечитал/пересмотрел, но ничего подобного не видел.
>Не утратит ли язык востребованность в случае ухода Майков с рынка РФ?
Их на этом рынке и не было никогда официально.
>Может я что-то не так делаю?
Однозначно. Изучай что такое инверсия управления и какие есть способы ее реализации.
Стоит еще сказать, что свойство - это пара методов, под которыми скрыто лежит поле.
>>400509
А для чего эти изъёбы если и для поля можно сгенерить геттер-сеттер? Это же по-идее и память дополнительную занимает или оно всегда в компайлтайме резолвится?
>недавно вышел .NET 5 и С# 9.0
Сука, как же горит жопа. Ебаные дауны перекатчики, уже миллион лет вышел .NET 6 который LTS.
Никаких, есть только 1 способ практики: придумать себе проблему и решить её, сделай парсер жсон, сделай crud сервер REST API
Не для каждого поля нужно публичное свойство, но для каждого свойства нужно поле. В C# сахар делает то, что ты бы сделал руками, памяти занимает настольк незначительно, что вообще похуй
[CompilerGenerated]
private SmthType <Property>k__BackingField;
public SmthType MyProperty
{
[CompilerGenerated]
get
{
return <Property>k__BackingField;
}
[CompilerGenerated]
set
{
<Property>k__BackingField = value;
}
}
Какое "сейчас"?
Знак сравнения применителен к структурам типа int, а is к классам типа твоего car.
За исключением string, который является ссылочным типом, но для удобства использования ведет себя как структура.
> Какое "сейчас"?
Такое "сейчас", что раньше "is null" и "is not null" не было. Теперь "== null" и "!= null" можно полностью заменить. Но тут вопрос этого ли добивались майкрасофты или же они добавили "is null" / "is not null" для других целей.
>"is null" и "is not null"
да хуй знает, я бесикоблядь, у нас это было всегда. Если структура, то использовали "=", если ссылочный, то "is".
>добивались майкрасофты
C# и бейсик объединяют. С моей точки зрения, такое различие дает визуально понять, что сравнение идет по значению или по ссылке. Сам проебывал порой, если бы не ор студии.
Ну я кстати на 1 работе в соляново написал проект и тащил его.
Чел, плиз. Сейчас даже в ИП Говнокод кодревью и тесты проводят.
Есть такое, но Кабану было похуй, да и заказчику тоже.
Петушарп является клоном жабы и фактически ничем не отличается, только в некоторых местах петушарп более низкоуровневый, чем джава. А хорошие программисты умеют кодить на любом языке, ведь принципы чистокода везде одинаковые, кроме скриптопараши конечно.
Ревью было иногда, но тесты я тогда не писал. Чисто в постменчике проверял и нормально.
>Чисто в постменчике проверял и нормально.
Было дело, все так писали. Благо это был нест который многие грехи пропускает или позволяет на аутистах игнорировать.
Забавно, как петушарперы перемогают картиночками. Прямо как хохлы с пораши. Нарисовали свинью (и то, придумали свинью не сами, а спиздили идею и попытались перефорсить), и думают, что правы.
>Писал чисто бекенд
>иногда могу плохо написать большой запрос к базе на linq
>чегоблядь.jpg
А так подтягиваешь текущие знания, учишь фронтенд, получаешь лычку фуллстака и на ~80к можешь расчитывать.
Если совсем будет плохо, то перекачусь. На яве писал давненько, лень вспомнить всякие нюансы и кишочки спринга
Как нет хаскеля, дарта, Д и кучи других языков на которые всем похуй. Даже чморить лень.
Да просто писал запрос на 10 строчек кода и в итоге написал немного неправильно. В общем я жиденький джун, но я знаю людей, которые сильно слабее и получают хоть что-то, а не ебаные 20 тысяч. Лан, спасибо за совет, буду фронт подтягивать. В реакт лучше вкатываться?
public class Book
{
public string BookId;
}
..
book.BookId = "123";
Почему это лучше, чем просто "Id"?
Во времени.
>>400642
>хорошие программисты
>ньюфаг 2 месяца
Олсо, BCL совершенно другая, фреймворки другие, окружающие технологии другие и так далее. Даже шарпосеньору понадобится пара месяцев для освоения.
>>400674
Я внимательно слежу за вакансиями на разных источниках и в требованиях 9/10 фронтовых фреймворков - это ангуляр. Вью вообще только один раз видел.
А что по поводу знаний бд? Я нативный sql помню на уровне банальных крудов. На работе особо ничего не делаю на нем. Или моего знания достаточно?
Хуета какая-то. Тавтология это плохо. И непонятно зачем стринг дял числового значения. Есть вообще GUID.
Есть вещественное число в стринге "0.001"
Как его распарсить так, чтобы не полетело все пиздой в зависимости от региона. Эти данные не я генерирую. Может прилететь число как с точкой, так и запятой.
Там в одном классе как минимум два ID, ну тогда понятно зачем. Хотя это тупо — нужно создавать класс департамента, который в себе будет хранить ID, а не засирать им класс Course
Учишь postgres по их доке, проходишь все уровни sql на литкоде и всё тут.
var value = Single.Parse("0.001", System.Globalization.CultureInfo.InvariantCulture);
https://docs.microsoft.com/ru-ru/dotnet/api/system.globalization.cultureinfo.invariantculture?view=net-6.0
Дайвёрсити, сэр.
>раньше "is null" и "is not null" не было
is null появился еще в 7-м шарпе, is not - в 9-м.
>>400540
>Я правильно понимаю, что сейчас предпочтительнее использовать is null вместо обычного сравнения == null
>>400566
>Но тут вопрос этого ли добивались майкрасофты или же они добавили "is null" / "is not null" для других целей.
Операторы == и != могут быть переопределены в классе, а is null и is not null кладут хуй на любые переопределения операторов.
Выводы сделаешь сам надеюсь.
>да хуй знает, я бесикоблядь
Бейсик еще в 90-х называли языком плодящим умственных инвалидов от программирования. И что после него очень сложно избавиться от хуевых практик построения кода.
>>400620
>С моей точки зрения, такое различие дает визуально понять, что сравнение идет по значению или по ссылке.
Это еще раз говорит о том, что приходя на новый стек/язык не стоит проецировать свой предыдущий опыт на него, а то можно знатно объебаться. Лучше прочитать доки и понять, что и зачем.
О, спасибо!
>Бейсик еще в 90-х называли языком плодящим умственных инвалидов от программирования. И что после него очень сложно избавиться от хуевых практик построения кода.
Сказал сишарпер. Ну так вали из шарпа тоже и полируй неуправляемый код.
Только вот C# на данный момент послаще бейсика из 90х будет.
Мне то зачем, если мне в шарпах все ок.
Это ты уже второй тред ноешь: "Вот в бейсике было о-о-о, а в шарпе фу-фу-фу".
Ну и косяк бейсика не в его сахаре или в неуправляемости/управляемости кода.
Но это не отвечает на вопрос является ли данный способ сравнения "is null" и "is not null" предпочтительным.
Eще раз для тупых. Операторы == и != могут быть перегружены в классе. И ты вполне можешь на условие if(item == null) получить true, даже если он по факту не null (ну вот захотелось создателю класса вот так) и наоборот при проверке if(item != null) получить true, хотя объект пустой (если чо, то операторы перегружаются статически, т.е. даже у пустого экземпляра отработает перегрузка, а не оригинал)
А при проверке is и is not тебе будет похуй есть там перегрузки или нет.
Т.е. если ты уверен, что в классах которыми ты пользуешься нет и не будет таких перегрузок или твоя логика включает в себя такие перегрузки, либо тебе просто похуй, то проверяй на null через == и !=
А если ты нормальный чел, то поймешь, что проверка через is и is not лучше, т.к. избавляет тебя от вышеописанных головняков.
Почему приложение на шарпе может не запускаться на других компах?
Ошибок не выдаёт, копируется вся папка release, где все необходимые библиотеки
>release
>Ошибок не выдаёт
Ну релизные версии не выдадут ошибок даже при запуске отладки из студии. А без запуска отладки даже дебаг версия программы просто закрывается или не запускается.
Может конфигурация сборки другая, может дело в импорте библиотек.
Сама программа консольная, она работает с пдф файлами, на отсутствие библиотек не ругается, просто запускается и быстро завершается, проверок исключений в коде нету
Кучу вариантов перепробовал и посмотрел в интернете, но ответа нету вообще.
Я думаю тогда надо уточнить, мало ли.
Библиотека коммерческая. Может ли быть так, что из-за неё программа отказывается работать на других ПК? В смысле, что она отслеживает, что приложение запускается на другом ПК и не работает?
>на отсутствие библиотек не ругается
А дело может быть не во отсутствии, а в их несовместимости.
Ты можешь хотя бы main на свой код в try завернуть и в случае Catch Exception выдать меседжбокс или записать в txt с информацией об ошибке
Еще я видел у Христа тутор по глобальному Catch
https://www.youtube.com/watch?v=-97tko0ous8
Это чтобы не расписывать в каждой функции по try Catch
>Библиотека коммерческая.
Она может быть нативной. А такое собирается под конкретную конфигурацию.
> Ты можешь хотя бы main на свой код в try завернуть и в случае Catch Exception выдать меседжбокс или записать в txt с информацией об ошибке
Попробую, хотя в первый раз жаловалось на занятость потока для записи в файл
> А такое собирается под конкретную конфигурацию
Подробнее, ибо под конфигурацией я сходу понимаю железо, ОС и фрамеворк
Ща пробую с АдынКлик сделать установщик, пишут, что помогает.
>Попробую
Попробуй глобальный кетч, как в видео
>Попробую, хотя в первый раз жаловалось на занятость потока для записи в файл
Дубина стоеросовая. Ты когда тестировал, небось юзал простенькие файлы, которые быстро записывались и быстро освобождались. И как только этот процесс затянулся, то все пошло по пизде. Еще небось какой нибудь delay приписывал, щоб "наверняка дождаться". Я тебя насквозь вижу.
>Подробнее, ибо под конфигурацией я сходу понимаю железо, ОС и фрамеворк
Например процессор: может интел, может амд, может 32, может 64. Читай что такое JIT-компиляция и чем результат отличается от машинного кода.
> И как только этот процесс затянулся
Не
> JIT-компиляция
Просто ехе файл из релиза или из дебуго, обе машины АМД, причём обе 3000 серии
А как этого избежать?
Есть два блока работающих независимо. Один должен выдать список строк, другой их должен обработать. Напрямую я передать не могу, я могу создать некое место обмена, куда все обращаются.
Есть какие-то решения для этого? Создать вторую переменную, котоаря будет неким семафором? А еще непонятно: в одном случае в листе будет 10 итемов, а в другом случае 40. А что если поступят еще 30, пока не обработаны предыдущие 20? Наверно надо дублировать список и только потом обрабатывать.
Кароч повозился и оно таки ругается на права.
Можно ли как-то в коде поднять права или учесть?
В свойствах папки, в безопасности даже всем давал полный доступ, но оно всё равно ругается.
>Можно ли как-то в коде поднять права или учесть?
Тогда какой был бы смысл в защите, если бы рандомный Васян с малварем сам себе бы повысил права?
>Можно ли как-то в коде поднять права или учесть?
Лучше не хранить данные в чувствительных местах. А что ты там такого сделал, что без спросу убивает, почему не делает запрос на админские права?
>В свойствах папки, в безопасности даже всем давал полный доступ
Это дерьмо не работало никогда. Даже в антивирусе ставил в исключения, все равно лезет.
Все файлы лежат в специально созданных папках, в системные я не лезу.
Задача простая - открыть пдф, найти данные, потом этот файл разбить на страницы, которые сохраняются в отдельную с именем, которое создаётся на основе данных, потом изначальный пдф переносится в отдельную папку.
Путь, в котором это всё лежит задаётся из тхт файла или через аргументы.
В самом лучшем случае он создаёт две папки, но на попытку даже чтения пдф уже ругается.
Где прочитать про 3х слойную архитектуру ? Желательно подробно с примерами на c# ? Спасибо
О, спасибо, то что нужно.
- The C# Player's Guide
- C# 10 and .NET 6 – Modern Cross-Platform Development
- Writing High Performance .NET Code
Чё там дальше?
- ваши яблоки вкусные?
- а зачем тебе яблоки?
- да вот захотелось попробовать что-то кроме помидор?
- так есть же гавно, иди говна поешь - новый вкус обеспечен
Че? Джава во всем обоссывает уродливую ассемблеропарашную бездокументационную хуйню типа петушарпа.
Тем более. В таком случае тебе надо читать строго по страничке в день и внимательно все практиковать, усваивать человеческий язык и избавляться от привычек, приобретенных в языке, который создавали шизофреники.
Разумеется. Петушарп - один из самых стройных и лакончиных языков на данный момент, если вообще не самый. А крестухон - поделие шизофреников, которое сейчас поддерживает сообщество таких же шизофреников. Попытки разобраться в огромной свалке под неприглядным названием С++ приводят к стойким повреждениям психики и требуют длительной реабилитации.
>>401090
А зачем ты это читаешь? Если любишь читать, я бы посоветовал Чехова, например.
Все подобные книги - они для новичков в программировании вообще, а не на языке.
Я с куда меньшим чем у тебя бекграундом, когда перекатывался в решетку, не прочитал ни одной книги (ну одну на треть прочитал). Потому что это чудовищная потеря времени. Во-первых, в книгах ни одна тема не раскрывается исчерпывающе, и чтобы ощутить понимание, всё равно приходилось лезть и в документацию языка и исходники дотнета. Во-вторых, основы языка постигаются в первые часы изучения. А дальше уже ты предметно лезешь в доки по своим вопросам, либо гуглишь для своей задачи а как вот это сделать.
Если взять и переписать весь дотнет с нуля, то будет да, так как ты описал.
Но огромное количество кода написано и до сих пор используется без всяких типов, с кучей магической рефлексии и атрибутов. WinForms, WFP, ASP и EF, если делать на новом шарпе, могли бы быть прекрасными, но в нынешнем виде - они на уровне джаваскрипта.
Ну вот собсна пример запущенной шизы.
Вся стандартная дотнетовская либа уже давно переписана в стиле новой модной нуллабилити.
А помойные ашотобиблиотеки если не поспевают за трендами, то идут нах.
> Вся стандартная дотнетовская либа уже давно переписана в стиле новой модной нуллабилити
Хм, и вправду переписана. А может быть такое, что они нуллабилити по умолчанию врубят в будущем? Или такое исключено?
>нуллабилити по умолчанию врубят в будущем?
Всё к этому идёт.
Хотя Nullable<T> в этой концепции выглядит по-идиотски. Потому что как писать в дженериках T? - это слишком ambiguously. Лучше бы её переписали на Optional<T> и убрали все двусмысленности с null. Впрочем и DBNull тоже мутный класс.
Ты сравниваешь лучшую иде всех времён и народов Студию, написанную на быстрых и лёгких крестами с шарпом, с васянским Райдером на тормознутой прожорливой жабе. Что тебя удивляет?
А ты сравнивай со связкой студия+решарпер. Тогда уже более-менее на равных идут по тормознвтости. И по функционалу.
Так же нужно на отдельный лист собрать данные которые будут собираться в таблицу в ворд, а потом выводиться на экран.
На пик3 код, который сейчас сортирует и считает кол-во задач на работника.
(А суть задачи в том, что бы в итоговой таблице в ворде были данные о количестве задач, фамилии сотрудников, и номера отделов. И что бы все было отсортировано по убыванию.)
Цитата задачи: На основании данных книги Data.xlsb написать программу на языке VBA, которая по нажатию на кнопку сформирует и выведет на экран документ "Отчет по загрузке" в MS Word.
Требования:
Исходные данные и их структура должны сохраниться.
Отделы и их сотрудники должны быть расположены в порядке убывания количества задач.
Хоть и вкатышь, судя по твоему посту ты имеешь представление об идеальной шапке. Значит, ты обязан сам туда что-то написать.
856x480, 1:58
> скоро 11 шарп выйдет, а у вас там до сих пор про 9 написано
Ты можешь спокойно начать с шарпа 4.0
Список книжек должен был идти первом постом. Но ОП проебался
https://pastebin.com/pbK8CGqw
Ещё там мельком упоминается Unity. Считаю это большим упущением, потому что это очень крутой и популярный инструмент в данный момент.
Ещё есть очень крутая книжка для самых новичков:
Учимся программировать на C# вместе с Джоном Смайли
она давно снята с продажи, но её легко можно купить с рук
>Ещё там мельком упоминается Unity. Считаю это большим упущением, потому что это очень крутой и популярный инструмент в данный момент.
Популярный - возможно, крутой - не особо.
> крутой - не особо
Как минимум для шарпера лучший выбор. Хочешь делай на ПК, хочешь на консоли, хочешь на мобилки, хочешь для ВР (для поплуярного ВР чата контент делается именно на юнити, кста).
Ближайший аналог - Unreal Engine. Но это тяжеловесный монстр для профессиональных команд.
Я знаю только что там должны были быть книги, ну и версии апдейтнуть надо. Главное - гайд. Его я точно не напишу.
>>401982
>Ты можешь спокойно начать с шарпа 4.0
Это извращение. У нас модный молодежный язык. Зачем пердолить версии, которых даже в легаси уже не найти? Ниже седьмой сидят единицы.
>>402008
>Но это тяжеловесный монстр для профессиональных команд.
Совсем не обязательно. Мегаскансы+блюпринты - и вот ты уже можешь делать внушительные проекты даже в одну харю. На юнити же тебе придется знать шарп (причем специализированный) и много с какими вещами дополнительно заебываться. Но на анриле неудобно делать мобилки и в принципе невозможно делать 2д.
Это понятно. Какие у него функции вообще? По любому же на каком-нибудь собесе спросят.
>Как минимум для шарпера лучший выбор.
И опять ты не прав. Для шарпера это просто почти единственный выход если он хочет вкатиться в геймдев именно как в профессию. Но в 2К22 вкатываться в проф-геймдев - это хуйня из под коня. Говно в разы хуже галер, еще и платят меньше.
А вот если ты хочешь вкатиться просто, чтобы забацать своей индюшатины на C#, то выбор у тебя намного больше. Stride, Godot, FNA, FlatRedBall и т.д.
>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. Но и то мало еще кто понимает как их толком использовать.
А за использование остальных директив в коде обычно по ебалу дают, поэтому их можно и не знать.
>Мегаскансы+блюпринты
Говно говненого говна.
Эта хуйня годится, только чтобы геймдизы могли игровую логику для квестов накидывать. А любой нормальный разраб тебе в ебало нассыт за их использование.
А как он в плане производительности и потребления ресурсов?
>4. Мне тут знакомый_нейм сказал, что C# умирает, это правда? Может не стоит его учить?
Неправда. C# активно развивается, недавно вышел .NET 5 и С# 9.0. Дотнет стал полностью опенсорсным и кроссплатформенным. В том же энтерпрайзе он очень даже востребован.
Вопрос а как вкатиться в шарпы? Шапка конечно интересная, но ответ на этот вопрос не дает. На 1 курсе были шарпы от преподш, которые сами параллельно работали, все следующие курсы прога будет полное говно. И как-то хочется в шарпы, раз я уже что-то знаю. Сами преподы сказали, что нас с руками и ногами возьмут, потому что мы повидали говно. Да вот хуй там. Я читаю, и почти на все джун позиции нужны опыт работы, знание ASP.NET/Какой-то конкретный SQL/JSON/XML/WPF/нужное вставить. Если это веб, то еще просят html js и прочую поебень. Для джуна. Допустим я выучу что-то из этого списка, а что потом? Искать вакансию с этой конкретной фичей? Про SQL вообще нихуя не ясно, он везде разный. Как вкатиться то, если я такой нахуй никому не нужен? Посоветуйте нужную комбинацию вышеупомянутых фич, чтобы гарантированно пойти куда-нибудь
Ты бы хоть инфу по теме поискал. Блюпринты абсолютно охуеннны. Офк, никто и никогда не будет с их помощью делать ААА, а вот индюшатину можно пилить за милую душу.
Ты просто нытик и бездельник. Я за 3 месяца вкатился и уже работаю получая 2к бачей.
Сейчас бы тратить время на платформу, на которой невозможно заработать.
Не ной, а скачай книжку и начинай читать.
Я вот тоже вкатун и на безрыбье сделал свой план. Не ебу, насколько он адекватный, может местные мидлы-сеньоры поправят.
1. Основы погромирования+синтаксис+база ООП (я сейчас здесь).
2. Тут планирую пробежаться по первому курсу Нила Каммингса, где он показывает запиливание интернет-магазина на ASP+Angular. Это чтобы представлять устройство системы на поверхностном уровне.
3. После этого думаю подтягивать частные знания: SQL (можно учить любой, проще всего PostgreSQL), EF, как работают интернеты, нахвататься базовых знаний по JS/TS/Angular. HTML и CSS вроде особо не нужны, либо их можно подтянуть потом.
4. Поверхностно потрогать паттерны проектирования, алгоритмы и структуры данных, порешать задачки на Литкоде.
5. Второй курс Нила, где он на том же стеке делает что-то вроде соцсети. Тут я уже буду делать кастомный вариант и применять полученные в п. 3 и 4 знания.
6. Свой жирный пет, который будет нормально задеплоен на VPS и будет представлять собой потенциально коммерческий проект.
Там еще много всяких технологий типа Redis, Kafka, RabbitMQ, всякие системы логов, Докер и так далее. Я в душе не ебу, что это вообще такое, но вроде оно с джуна не требуется.
Хуйня план. Ты так выгоришь очень быстро. Мой тебе совет - освоить фронт, вкатиться работать с ним и уже после по вечерам доучивать шарп и прочую бекодрочь. Так у тебя и на поесть будет, а если не дурак и того больше и мотивация.
Я бы не рекомендовал брать этот план за основу, я ж полный ньюфаг не только в шарпе, но и в кодинге вообще.
>>402123
Так я в бек хочу, фронт - это в качестве дополнения, накидать что-нибудь на бутстрапе и наговнокодить кнопочек на ангуляре. Просто для понимания как оно устроено и в резюме строчку добавить. А нормально залезать во фронт сейчас ни разу не быстрее бека. И конкуренция там охуевшая. И жс учит плохому.
1. Какие паттерны часто используются и их нужно выучить обязательно? Или строго все нужно учить?
2. Несколько раз уже слышал, что из-за того, что сейчас все на микросервисах, наследование практически не используется. Как это устроено? Ведь без наследования мы лишаемся полиморфизма, абстрактных классов, интерфейсов и ООП в целом.
>что сейчас все на микросервисах, наследование практически не используется
в огороде бузина, а в киеве...
Эти вещи вообще не связаны.
Делегирование предпочтительнее наследованию (не всегда конечно), но микросервисы вообще не причем.
> Несколько раз уже слышал, что из-за того, что сейчас все на микросервисах, наследование практически не используется.
Вообще никак не связано.
> Как это устроено?
Пишешь большое энтерпрайзное приложение и вдруг понимаешь, что иерархия классов для большинства сущностей не нужна, ибо почти все задачи легко решаются без наследования. А там, где нужна, достаточно поля "тип" из какого-то енума + в местах, где надо по-разному обрабатывать разные сущности, делается простой свич. В итоге за счёт отсутствия абстрактных классов всё прозрачно, меньше кода, легче дебажить и тестировать.
> Ведь без наследования мы лишаемся полиморфизма, абстрактных классов, интерфейсов и ООП в целом.
Класс не наследуется от интерфейса, он его реализует. Большая разница. При отказе от активного использования наследования интерфейсы никуда не деваются. Насчёт "ООП в целом" спорно, ООП все по-разному понимают, и в современном понимании наследование является необязательным элементом.
Изучай SOLID.
1. Как имитировать платежи? Есть какой-то пакет или сторонний сервис с колбэками, имитирующий платежи? Чтобы примерно понимать вообще, как оно работает.
2. Как сделать маршрутизацию вида ...:5001/files/papka1/govno/jopa, это обрабатывалось одним контроллером и он ловил "/papka1/govno/jopa" в параметр
2) Прописываешь в атрибутах контроллера и его методов.
1) Если ты не знаешь как делается пункт 2, то до первого тебе как до китая раком.
Пажжи, это просто в атрибут как "/files/{path}" условно кидается? Я просто почему-то думал, что раз там слэши, оно не спросит нормально
Не спарсит*
Это кросс в том числе и линукс и винда. Плюс мобильщина бывает на планшетах а там точно таблицы нужны. Больше похоже что педерасты из МС опять хуйней страдают как было с UWP.
Не так, инкапсуляция скрывает данные, неймспейсы лишь решают конфликты имен. Вообще ортогональные понятия.
>а там точно таблицы нужны
да ну. разве что в специализированном софте аля "таблицы". ибо больше нигде и не видел.
А так нужно отделять DataGrid от GridView
return MyFunction();
и приходится делать через временную переменную:
string result = MyFunction();
return result;
Если бы была асинхронная, то присвоение ничего бы не дало.
Энтерпрайз это специализация дот нета же, в бизнес задачах почти всегда надо табличку показать.
DataGrid и GridView это же просто разные названия у разных платформ\производителей того что в винформс называлось DatgaGridView.
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
Ошибки нет, просто возвращается ноль или не то, что ожидается.
Единственное что, функция вызывается из библиотеки.
>1. DI
А синглтон какой-нибудь? Видел где-то список из примерно 4-5 маст-ноу паттернов, но проебал и не могу обратно найти.
>>402206
>Эти вещи вообще не связаны.
Я у этого сеньора про это слышал, может неправильно его понял: https://youtu.be/ETdulc1xk04?t=281
>>402208
Стоит ли мне тогда как нубу тоже минимизировать наследование и использование абстрактных классов?
Это иллюстрация что паттерны это развод наперсточников маркетолухов, тупо обозвали глобальную переменную модным словом и типа решили проблему. Вроде еще Луговский говорил что паттерны для дебилов и суть фиговый листочек для прикрытия уёбищности ООП.
>1. DI
Это хуйня, а не паттерн, просто кристаллизованный зумерской дебилизм. Передача аргумента в функцию - рррряяяяя, я применил паттерн депенденси инжекшн. Чтение конфиг-файла - рррряяяяя, я применил паттерн депенденси инжекшн.
Ну так хотя бы название библиотеки и метода.
Инкапсуляция - это объединение данных и операций над этими данными в единую сущность. А скрытие - это скрытие, это отдельный принцип, который за каким-то хуем лепят вместе с инкапсуляцией.
Кто тебе этот бред сказал? Инкапсуляция это именно сокрытие, а объединение данных и операций это вообще класс или тип.
Ты даже если не знал как правильно мог бы догадаться построив контпример класса с операциями над открытыми данными.
>DataGrid и GridView это же просто разные названия у разных платформ
Ну обычно смешивают. но на деле датагрид это там сортировка, фильтрация и так далее
А гривью это "фоточки собачков сеточкой уложить" (https://docs.microsoft.com/ru-ru/xamarin/android/user-interface/layouts/grid-view).
да просто предпочитай делегирование наследованию и всего делов. Тем более что при использовании S от SOLID это само собой получается.
Что именно?
ну так легко не решать (ваш кэп)
Не нужно называть паттерном, принципом, шаблоном и т.п. примитивные банальные повседневные элементы программирования.
Зачем ты решаешь дейлики, чел? Как насчёт того, чтобы перестать индульгировать и найти наконец работу? Ну знаешь, там, мать/жену/дочь на курорт свозить, зубы/фигуру пофиксить, мотоцикл купить, etc.?
Плохо быть тобой, чел. Какой стек?
а дейлики тогда зачем?
Ну допустим. Какой уровень? В любой цивилизованной стране это даже для ждуна $2к.
Зато там можно тихонько залезть в какой-нибудь далекий угол, где про тебя никто не вспомнит, смотреть там аниму и получать 300кк/наносек.
Манямечты. Погугли как в амазоне люди работают.
>Инкапсуляция это именно сокрытие
Если что, то сокрытие спокойно реализуется и с помощью наследования и с помощью полиморфизма. Так что ты объебался.
Шли третьи сутки споров о том, что является домом: стены или двери.
>Ну так-то можно хлопнуть не только дверью, но и стеной.
Как всегда логично.
>А синглтон какой-нибудь? Видел где-то список из примерно 4-5 маст-ноу паттернов, но проебал и не могу обратно найти.
Синглтон достаточно просто знать, чтобы ответить если спросят. Самому про него лучше не спрашивать. (И кстати те синглтоны, что используются в DI - это не те же самые что в паттерне).
Знать хорошо "Фабричный метод" и "Абстрактную фабрику" и чем от них отличаются. Дополнительно неплохо знать "Стратегию", "Цепочку обязанностей", "Команда". Этого в принципе достаточно.
Может для тебя повседневные, а кто-то не знает. Тем более реализация ДИ на уровне проекта не тривиальная задача. Нет, конечно, если готовенькое используешь, то может показать тривиальным.
Что лучше: делать Clear старого экземпляра листа, или просто присваивать новый экземпляр New List?
>Может для тебя повседневные, а кто-то не знает.
Я не знаю как возвращать данные из функции, поэтому я читаю про Return Pattern.
Есть еще Non Floating Pattern, это когда ты создаешь переменную целочисленного типа и присваиваешь ей значение.
Есть еще ABС Pattern, это когда ты создаешь переменную содержащую в названии буквы алфавита.
У тебя каша в голове, твои тексты это генератор бреда.
Я этот гридвью как просто грид в впф встречал. Ну да, это совсем из другой оперы, просто лэйаут а надо имеено экселе-подобную табличку для редактирования и ввода данных.
Я думал, я один так про это думаю, и объяснял это тем, что джунишка и не способен постичь великой мудрости.
А можно так на собесах говорить или пидорнут за такое?
Для перформанса лучше Clear, зачем грузить и так уставшить ГЦ новыми аллокациями постоянными?
Просто самому не надо на собеседовании инициировать рассказ про односложные паттерны. А вероятность того, что тебя спросят рассказать про синглтон, близка к нулю. Ну а спросят — расскажешь.
Но если джуна спрашивают, какие паттерны он знает, и он в пример приводит синглтон, а потом добавляет, что "это хуйня для дебилов", то ясен пень, что в таком контексте его воспримут как шизоида.
А если в одной итерации 10 000 итемов, а в другой 3 итема?
Читал где-то, что Clear годится для обработки до 100 000 и если количество данных при каждой итерации не отличается разительно.
Щитаю, если метод короткий и применим только в пределах одного метода, то лямбда.
>что Clear годится для обработки до 100 000
Ожидание: Clear - это магический метод, которые много всякого проворачивает под капотом.
Реальность:
public void Clear() { _free_index = 0; }
Если важна память то аллокация, если время то clear
Ты понимаешь что за этим стоит парадигма программирования? Ты пишешь такой код, который можно легко тестировать, потому что его части абстрагированы друг от друга и через внедрение зависимостей ты можешь быстро заменить реальный сервис на тестовый или отладочный. Зачем ты всё упрощаешь до шуточек для умственно отсталых, клоунидзе?
Какой из стандартных классов или какой пакет?
Бэкэнд тоже на шарпе
.net core 5
Это ещё полуправда. Дело усугубляется тем что в фаанг набирают по квотам педерастов, баб и чурбанов вместо толковых белых программеров. Не удивительно что в итоге получается кал.
Чтобы закруглить края, нужно писать километры текста.
Чтобы сделать кнопку с иконкой, нужна простыня, которая способна трижды обернуть земной шар.
Мне хочется написать 5 строчек кода, вместо создания стилей. Я нормален? Везде пишут "Чувак, ксамл стили специально созданы для этого", но нет — я думаю, что созданы для страданий.
> усложняет а не помоагает
Абстракции ради абстракций действительно только усложняют, хотя некоторые рекомендуют их везде использовать. Но в некоторых случаях это жизненно необходимые вещи. В тех же проектах ASP.NET. Ты же не будешь каждый раз тестировать какой-то функционал с реальными сервисами? Тебе нужно подставить тестовые сервисы как раз через внедрение зависимостей. Или, допустим, в игре у тебя может быть много различных сервисов: первый работает с бекендом; второй с аналитикой; третий с платежами; четвёртый подключает фейсбук и другие социальные сети, загружает друзей; пятый грузит функционал стима; и так далее. Чтобы всё безумие нормально тестировать, тебе потребуется внедрение зависимостей.
Есть ещё более сложный пример с архитектурой игры Покемон Го
https://www.youtube.com/watch?v=8hru629dkRY
Бля, ну это все очевидные вопросы. Зря я стринг в примере использовал. На самом деле возвращал сингл из функции, в которой тупо 2+2. Я очистил код до минимума, чтобы ничего не мешало.
Просто я-то думал, что я в принципе неправильно делаю и что ретёрн напрямую из функции это плохой подход.
Единственное, что я не упомянул, это то, что моя библиотека сконвертирована в unmanaged (просто расставлены точки входа в функции).
Внедрение зависимостей и называется, и выглядит как тупое говно, и им же оно и является, если использовать это понятие в узком смузихлёбном смысле, а не в широком (в широком смысле в каждую функцию при её вызове постоянно внедряются зависимости через аргументы).
Диды всё тоже самое делали через define (в шарпе тоже доступно) или через конфиг-файлы, конфиг стринги, да хотя бы просто статик класс или синглтон сделать который скажет инстансу приложения, как и что инициализировать. И всё перечисленное выглядит намного нормальнее и намного менее будет удивлять, чем шизофренический код как слева на картинке.
Тяжёлый случай, однако.
> как слева на картинке.
Мало того что написал какой-то хуеты не относящейся к теме,так еще и говноджавакод в качестве примера приводит.
Причем форграунд меняется номрально.
>Почему в событии OnChecked, несмотря на установленный желтый бэкграунд, у меня какой-то голубой цвет?
1. Забилди проект
2. Посмотри внутри тега
3. Покажи скрытый код в #region
>1. Забилди проект
делал
>2. Посмотри внутри тега
Какого?
>3.Покажи скрытый код в #region
У меня нет региона, и это вообще xaml
ааааа, вот прям ненавижу эти ебаные стили.
Ну да, хуйня, я просто верстать не очень хотел ((
Ты имеешь виду показать как выглядит свойства экземпляра кнопки? Да там только текст контента (пикрил 1), ну еще биндинг стиля был.
В общем пикрил 2 сделал
Паттерны еще может быть, а вот без принципов можно написать только наглухо отбитый неподдерживаемый говнокод.
> Ближайший аналог - Unreal Engine.
Ближайший аналог юнити - годот. Там даже кодить на шарпе можно. С анрилом два этих говна не сравнятся.
Юнити в разы превосходит Годот. С Анрилом оно вполне тягается, просто у них задачи разные.
Я лучше подожду, когда эта хуйня издохнет. Надеюсь это будет быстрее, чем скорость ответа на SO. Я бы за потраченное время уже написал миллиард стилей обычным кодом.
Это выше моих сил. Каждый ебаный шаблон имеет свои НЮАНСЫ у каждого элемента, километры соплей вложенных в блевоту - шоб просто изменить цвет рамки. Ну вот если в тексбоксе есть цвет рамки, и в кнопке есть цвет рамки, НУ ТАК СХУЯЛИ шаблоны сука разные должны быть? СХУЯЛИ?
Я не профессиональный анальник, и я эти унижения терпеть не собираюсь!
> Ближайший аналог юнити - годот
Клоунидзе, спокуха. Вот лишь небольшая часть игр сделанных на юнити. А на говноте твоём что сделано?
>WPF стили нужно переосмысливать.
Есть такое. Да, есть возможность задать свой дизайн, но это очень многословно. Да еще рукожопы из мс шаблоны контролов сделали жопно. А стили сами по себе неправильные в плане наследования.
>И всё перечисленное выглядит намного нормальнее
только работает через жопу. 2 разных экземпляра зависимости - хрен тебе, подменить зависимость - хрен тебе, тестирование - соси хрен, тебе же сказали.
Надо больше джоб секюрити. На контур Recrtangle присваиваешь new SolidColorBrush, а на контур Ellipse — new SolidPizdaMamashy. И чтобы изменить толщину линии эллипса, простое присвоение Thickness хуй тебе поможет (ну и что, что есть такое свойство? Ты охуел?), поэтому ты должен пересобрать класс заново. Вот это я понимаю стандартизация и универсальность.
А может это простой бардак. Алсоу, я сейчас пишу плагин для проги, где похожие сектанты вещают точно так же. У них нельзя удалить 3д-модель клавишей delete, и это типа защита от вкатунов. А внутри все элементы интерфейса захардкожены, внутренние скрипты не умеют работать параллельно — новый убивает процесс текущего, а в самом языке отсутствует возможность написания бесконечных циклов. Но это не жопорукость разработчиков, это джоб секюрити.
> внутренние скрипты не умеют работать параллельно
Самое смешное, что в официальном хелпе есть пример написания музыкального плеера, который подразумевает параллельное выполнение на протяжении всей сессии программы. Но добрая часть элементов тоже использует скрипты, поэтому попытка пользоваться программой во время работы плеера к хуям убивает оный. На что разработчики сделали маленькую приписочку, что "из-за однопоточности, работа плеера может вызвать трудности".
Вот это вот классическое американское обтекаемое "может вызвать трудности" применимое к полнейшей невозможности.
А там нету нихуя
Вот хочу я в юзера поля добавить, группы пользователей поменять или google auth прикрутить, где это можно сделать?
>Какой такой специализированный шарп?
Хуево выразился. Шарп офк тот же самый, но в Юнити своя огромная библиотека. Поэтому тот же бекендер с ноги в Юнити не залетит, придется много чего учить.
>Как лучше всего сейчас работать с REST API из WPF (чистого)?
>Какой из стандартных классов или какой пакет?
Бамп вопросу
>>403190
Интересуюсь что лучше для rest запросов-ответов к использовать с десктопной приложухи
HttpClient или WebClient или может что стороннее будет лучше? Какая лучшая практика для этого?
Дополню вопросом про кэш
Планирую использовать для кэша sqlite в файлике
Но насчет схемы бд решил что пусть будет копией того что на бэке висит + файлы в блоб/байнери хранить
Если у клиента в кэше в дб такая же схема как и в дб на бэке это норм или моветон?
да нет связи десктопности с запросами
берется что нравится
refit например кто любит декларативность, другой рест клиент типа TinyRest или RestSharp
или же тупо HttpClient c json расширением. (но это уже все таки low-level)
или же HttpClient и ручная работа с json
ерунда вопрос же
структура кеша делается для ускорения работы. так что может быть как и "копия бд" аля "работаем оффлайн" (но даже в этом случае нет причин делать 1 к 1), так и вообще "ключ - значение".
Все зависит от потребностей.
лично я использую Tiny.RestClient поскольку часто имею дело с рукожопными апи и строгость декларативности меня ограничивает, а опускаться на уровень HttpClient перебор
Ну вот в примере на Java, если тебе надо поменять зависимость, ты правишь файл service.xxx или хранишь несколько таких файлов.
Что мешает сделать то же самое с конфиг файлом, с дефайнами или наконец с файлом со статик классом, поставляющим зависимость?
единственность зависимости мешает. А если у меня 2 экземпляра потребителя зависимости и каждому нужно своя имплементация зависмости? А менять статик класс вообще жопа - тут статикотипизированный язык
Разве удивительно, что шарпобляди сидят не только в своём треле?
дурным тоном для кого? Это кеш. Как удобно, так и храни.
Может быть для среднего шарписта-кнопкоскруглятеля winapi и является недоступной магией, но для второсортного байтоёба оно весьма просто, примитивно и понятно.
Дело не в сложности, а втом, что майкрософт не дает нормального доступа из шарпа. Но для себя-то за закрытыми дверями по любому имеет, но другим не дает.
а серьезно - не нужен тебе шарп. был бы нужен - ты бы просто его учил, а не спрашивал.
> Тяжело просто, поддержите морально
И что ты уже освоил? Что можешь написать? Читать без практики бессмысленно. Нужно постоянно программировать.
LINQ могу, таски могу, треды могу, с Http игрался, ща с дотнетом и разором воюю. На кодварсах 5kyu пробую долбить. Ну всякое ооп там, дженерики хуё-моё.
Сравнил с тем что есть сейчас. Просто пиздец как требования выросли.
так не вызывай. используй сервер с 256 гигов рамы и гоняй на нем консольный калькулятор на шарпе - и вызывать GC.Collect() не придется
Тебе надо учить не отдельные технологии, а программирование. Оно, в свою очередь, учится практикой. Ты мог выучить переменные, условные операторы и циклы с оопом, а после только с помощью этого уже запилить рабочее приложение. Но раз ты уже выучил больше, то пили приложение на асп или на какой стек ты там собрался.
все равно все упрется в "либу что работает с имаджами"
из них Bitmap возможно пойдет лесом ибо почти стал win-only
еще куча отвалится ибо фреймворк старый
net-vips экономный к памяти и шустрый, но отвалится потому что на линуксе память течет.
останется монструозный имаджмаджик и более современный ImageSharp
ну еще есть либы типа opencv, но запускать это на лиунксах как в анекдоте "а теперь попробуем взлететь"
С нуля вкатываться тяжко, а если ты уже понимаешь за основы кодинга и ооп, как оно там вообще устроено, то тебе по сути надо выучить только синтаксис, фреймворк и немного почитать про около технологии.
>Почему ты пользуешься микроконтроллерами?
>Почему ты пользуешься серверами?
>Почему ты пользуешься телефоном?
>Почему ты пользуешься телевизором?
>Почему ты пользуешься автомобилем?
Посоветуй годный UML-редактор для роутеров, чтобы 192.168.0.1, admin, admin, хуяк - и UML.
Ну так то да. Ладно, ща кофе наверну и пойду превозмогать далее.
Не влияют. И с вопросами про производительность/размер иди в C++, здесь всем поебать, запускается и ладно.
>И с вопросами про производительность/размер иди в C++, здесь всем поебать, запускается и ладно
Я и так оттуда. И не вижу ни одной причины чтобы сразу не научиться делать всё правильно и качественно. С хорошо работающим кодом и работать приятно.
Здесь есть технические ограничения платформы и рантайма, выше которых не прыгнешь. А в крестах ты ограничен только процессором.
Вообще никак не влияет. На размер влияют подключенные библиотеки. Если работаешь в студии, то использую пикрелейтед команду, чтобы держать порядок в коде.
Непроставленный using наоборот может ухудшить производительность, а именно замедлить сборку мусора, так как незачищенный объект, у которого есть финализатор, придется во время сборки мусора финализировать. Лучше задиспозить его сразу.
Блэд, не про тот using подумал, соре
Проще писать на предназначенном для этого языке, будет правильно и качественно. Так-то и на петухоне можно грузить нативные DLL-ки и ебаться с ними ради перформанса.
Скажи это тем, кто пишет прошивки на питоне и гуи на js.
Студия 2022?
Если так, то обнови до последней версии и поотключай все ненужные расширения (лучше вообще все, кроме самых важных).
Там есть какая-то ебала, из-за чего она может неожиданно взять и потерять все референсы в проекте.
Закрой VS, открой папку с проектом, удали папку .vs, запусти проект заново.
Если нету папки .vs, значит нужно включить отображение скрытых файлов и папок.
>требования выросли
Был период бума айти, лет 8-10 назад, когда каждому ИП Гаранян стал нужен свой сайт с интернет-магазином и прочими интеграциями. Тренд подхватили буквально все, от банков до крупных промышленников, все стали набирать айтишников. Спрос был взрывной и чтобы закрывать эти дыры, стали брать в айти кого-попало, кто хоть что-то может. Даже продукты уровня лаба по информатике в 9Б стали продаваться как горячие пирожки. Стало очень выгодно открыть IT-шарагу, набрать туда сброд и пусть они пилят сайты, который хоть как-то можно продать, демпингуя ценой.
Но рынок давно уже в стадии остывания, он перенасыщен. Говно - уже не продать. Сложные и уникальные решения под заказ уступают место простоте, минимализму и стандартным решениям. Даже дата-питухам стали показывать на дверь, т.к. во-первых, мало кто из компаний на самом деле имеет достаточное количество данных, а во-вторых, слишком много проходимцев, которые для начальства показывают петухон, а сами втихаря линейные тренды в екселе строят.
Как итог, в 2к22 экспресс-вкат в программирование для соответствования рыночным требованиям реально занимает от 2 лет. Даже продавцы курсов уже не обещают вкатить вас за 3 месяца. Реально указывают сроки - 24 месяца. И если почитать отзывы на том же хабре от людей, которые не имели кодерского бекграунда, там реально приходится пахать и не спать ночами, тратя в день по 6-8 часов, что становится невыполнимым квестом при обучении без отрыва от основной работы.
По факту мы видим, что рынку больше не нужны IT-джамшуты, а срок обучения программированию до начального профессионального уровня приблизился к сроку обучения в ВУЗе. В принципе, если из программы ВУЗа убрать физкультуру, философию, физику и электронику, основательно почистить математику, основательно почистить абстрактные компьютерные науки, то как раз бакалавриат сократится до 2.5-3 лет, что и имеем сейчас для вката с нуля (не важно, через курсы или самостоятельно).
Времена, когда можно было выучить С++ за 21 день и вкатиться, прошли.
>требования выросли
Был период бума айти, лет 8-10 назад, когда каждому ИП Гаранян стал нужен свой сайт с интернет-магазином и прочими интеграциями. Тренд подхватили буквально все, от банков до крупных промышленников, все стали набирать айтишников. Спрос был взрывной и чтобы закрывать эти дыры, стали брать в айти кого-попало, кто хоть что-то может. Даже продукты уровня лаба по информатике в 9Б стали продаваться как горячие пирожки. Стало очень выгодно открыть IT-шарагу, набрать туда сброд и пусть они пилят сайты, который хоть как-то можно продать, демпингуя ценой.
Но рынок давно уже в стадии остывания, он перенасыщен. Говно - уже не продать. Сложные и уникальные решения под заказ уступают место простоте, минимализму и стандартным решениям. Даже дата-питухам стали показывать на дверь, т.к. во-первых, мало кто из компаний на самом деле имеет достаточное количество данных, а во-вторых, слишком много проходимцев, которые для начальства показывают петухон, а сами втихаря линейные тренды в екселе строят.
Как итог, в 2к22 экспресс-вкат в программирование для соответствования рыночным требованиям реально занимает от 2 лет. Даже продавцы курсов уже не обещают вкатить вас за 3 месяца. Реально указывают сроки - 24 месяца. И если почитать отзывы на том же хабре от людей, которые не имели кодерского бекграунда, там реально приходится пахать и не спать ночами, тратя в день по 6-8 часов, что становится невыполнимым квестом при обучении без отрыва от основной работы.
По факту мы видим, что рынку больше не нужны IT-джамшуты, а срок обучения программированию до начального профессионального уровня приблизился к сроку обучения в ВУЗе. В принципе, если из программы ВУЗа убрать физкультуру, философию, физику и электронику, основательно почистить математику, основательно почистить абстрактные компьютерные науки, то как раз бакалавриат сократится до 2.5-3 лет, что и имеем сейчас для вката с нуля (не важно, через курсы или самостоятельно).
Времена, когда можно было выучить С++ за 21 день и вкатиться, прошли.
>не дает нормального доступа из шарпа
Доступ ровно такой же, как из C++.
Вот на этом сайте pinvoke (точка) net есть 99% всех WinAPI функций, которые для тупого шарписта прокомментированы и обернуты в шарп AS IS.
Я как-то сам подобное делал для себя для одной хитрой задачи, оборачивая нужные WinAPI в нормальном ООП стиле.
Хуя какой ты толстый краб. Если что и перегрето так только веб. А помимо него так-то дохуя других сфер есть в которых конкретный такой голод. Мы к себе в фирму 5 месяц не можем найти годного мидла плюсовика.
Пробовали. Всё равно большая часть вчерашние выкатцы из онлайн курсов и те, кто несут дичь.
Попробуй ещё. Только на этот раз постарайся получше. Я в такой же нищуковой конторе работал и там тех дир точно так же был убежден что условия у него охуенные. По факту было ниже в 2-3 раза средних зп в ДС.
да, скорее всего у вас "хорошие условия! кипяток бесплатно, раз в год повышаем зп на 0,004%, даём льготный проездной на троллейбус"
Вот этот птичий язык "не можем найти специалиста", "отрасли не хватает 200 тыщщ айтишников", "на стройках не хватает 500 тыщ специалистов", "на заводах не хватает миллион рабочих рук" означает, что жадный пидор-буржуй не хочет платить рыночную зп, не может удовлетворить свой спрос на труд своим предложением оплаты. За 500к закрывается любая вакансия, так-то. Но капиталист хочет административными методами и мерами принуждения заставить людей работать на кабальных условиях.
Если вы не можете на рынке труда найти чела на свою зп, то значит ваше предложение не релевантно.
Да и вообще, смысл идти в плюсы в 2к22. Плюсы и так перенасыщенными проперженными токсичными дедами с запредельным ЧСВ, мол, в наше время... а сейчас зумерье-смузихлебы пошли... Так ещё и порог входа в плюсы завышенный, и зп при аналогичном опыте самая низкая по рынку. И язык древний и дышит на ладан. И лапши, и говнокода в нём в разы больше, особенно мелкие васянопроекты, они всегда ужасны. И культура разработки очень часто сугубо локальная и оторванная от мировых трендов. Вышел С++ 23? Не, не слышали, у нас Михал Петрович его не принял, у нас С++ 98. И рынок вакансий максимально уёбищен. На условном JS ты даже в мухосрани всегда будешь иметь выбор работы. А на плюсах скорее всего это будет завод и... всё.
Поэтому в плюсы нормис не пойдёт. А если нужен плюсовик, плати х2 от зп на дж на той же позиции. Но ведь никто не будет столько платить. Плюсовик работает медленно, его время очень сложно окупить. Проще выгнать на мороз 3 плюсовиков и нанять одного дотнетчика.
Only a sith deals in absolutes
А как сейчас обстоят дела с С++ CLI? Он давно умер или же жив, актуален, развивается?
Толсто. Этот кал никогда не был популярен т.к. унаследовал неудбоство С++ а управлямый код все равно под шарпом лучше писать.
Узнали, но тебе не скажем.
Расскажите мне про три вещи:
- Асинхронность.
- Многопоточность.
- Параллелизм.
async/await распараллеливает потоки, создает потоки или что?
Thread создает поток синхронный? Проще говоря, в потоке - функции выполняются синхронно?
А меня возьмут? На плюсах разве что моды делал на сурс движок.
Шарю за низкоуровневую архитектуру.
Как устроен проц и как работает стэк, куча, указатели. Опыт в Reverse Engineering, чуть ближе к среднему наверное, шарю за виртуальные таблицы.
Но в С++ дальше вот виртуальной памяти и написания драйверов не заходил.
Знания на С++ можно сказать "поверхностные", потому что работал только с указателями, классами.
На сколько мои знания можно оценить, на джуниора сгожусь?
>Мы к себе в фирму 5 месяц не можем найти годного мидла плюсовика.
Кекус , так все годные вдарили по тапкам нахуй из мордора, примерно как раз 5 месяцев назад.
Сказать, когда найдёте годного плюсовика? когда война кончится
В штатах от 150К. Ща идет великое ударное переписывание всякого имбед-легаси-говна, на любые процы, которые не в Тайване производятся. От авто и ракет, до вибраторов и унитазов.
Бояре Сишники пануют.
>Расскажите мне про три вещи:
Это квазиунофантастика, ну то есть всем понятно
>async/await распараллеливает потоки, создает потоки или что?
как и Task не имеет НИКАКОГО отношения к потокам. Является сахаром для кода вида (который в языках без асинков выглядит так)
DoSomething().Then(callback)
чтобы код выглядел как будто обычный. Компилятор преобразует метод помеченный async в конечный автомат ака объект с методами, которые он дергает когда приходит их время await (звучит сложно, но на деле тоже очень просто - посмотри на обычную ручную реализацию итератора, подобный подход же, даже в языках без async но с итераторами их и используют как замену)
Анон, как этот код https://github.com/mono/mono/tree/main/mcs/class/Mono.Data.Sqlite
скомпилировать в Mono.Data.Sqlite.dll ?
Я не вижу там .csproj и .sln файла.
.NET 4.0
Может кто переебенить это всё в отдельное репо, чтобы оно именно dll-ку эту ебучую выдавало на выходе?
>на джуниора сгожусь
Если ты можешь взять реальную бизнес задачу и начать ее выполнять дрегая своего лида/наставника не более 2-х раз в день на 10 минут максимум, тогда годишься.
Тебе не нужно это компилировать, подключи в references проекта dll (там поиск есть), или попробуй через nuget пакеты
>Если ты можешь взять реальную бизнес задачу и начать ее выполнять дрегая своего лида/наставника не более 2-х раз в день на 10 минут максимум, тогда годишься.
Ураа, я джун!
Нахуя мне дёргать своего лида/наставника если у меня есть интернет и голова на плечах?
Подойдет блокировка на этапе создания экземпляра т.к. далее меняться не будет.
Ну да, вариант.
Да не, я хочу сам бирарь из сореца как-то получить, и сам сорец вклеить, а то бинарь кидать к коду как-то не очень опенсорцно, к тому же в бинаре могут быть бекдоры и трояны всякие, хуй знает что там вшито в этот пре-компиленный бинарь. Код вроде есть, а как сбилдить - хз. Чё, всё моно тянуть, блядь?
Ещё и
>make get-monolite-latest
качает хуй знает что.
Или можно как-то именно это вот Mono.Data.Sqlite, отдельно сделать, чтобы не ебать себе мозг? Сорец вроде полный, но это не точно. И нет ни .csproj, ни .sln файла, блядь. Как создать - хз. Кто-нить может потыкать эту хуйню?
atomic - слово из 6 букв, начинается на a, а заканчивается на c
зы: какой вопрос такой и ответ
Тут всё и без твоих комментариев ясно.
Например вопросы из серии "Почему было использовано именно это решение, а не другое" там где это не очевидно. Например у заказчика было такое желание левой пятки или архитектура смежных процессов навязывает такое решение и т.д.
Ну или бывают стандартные вопросы "Чувак тут какой-то чел мне указания дает. Его можно сразу послать нахуй или не стоит, т.к. это гендир?"
>Т.е. в одном экземпляре класса он у меня ReadOnly, а в другом — нет.
Ну так сделай его в другом тоже ReadOnly, или через свойство сеттер заблокируй.
наставник это вещь. самый быстрый способ обучения, даже если ты 100 раз зрелый. Он просто тупо покажет как надо и сэкономит тучу времени.
Лiл, какой ещё такой гендир? Я удалёнщик, джентельмен удачи. Просыпаюсь в 11AM, кушаю, лениво захожу на доску на которую мне ПМ и точка заботливо залила новых тасок. Пишу код 2 часа, трекаю 6, пишу фронту мол, хуйня готова, чекай свагу. И всё, никаких тебе созвонов, никаких вопросов "а почему?" и т.д.
>>405115
Зачем мне субъективное мнение какого-то хуя, если я могу в интернете прочитать несколько разных точек зрения на вопрос n и выбрать свою позицию?
Ну типо. Я премидл aka джун+, самостоятельно делаю 100% задач, что со мной не так?
тебе УЖЕ показали как должно быть и чего от тебя ожидают. И ты достаточно накодился чтобы потом тебе по шапке на ревью не давали.
Да и задачи тебе дают под твои скилы. Локфри многопоток с хай лоадом тебя писать не просят.
>тебе УЖЕ показали как должно быть и чего от тебя ожидают.
Нихуя мне не показывали, я до этого сам ебашил книги, курсы и практику. С ревью конечно по началу меня ебали, но сейчас все эти моменты я пофиксил.
>Да и задачи тебе дают под твои скилы.
Самые разные. На мне сейчас 5 проектов.
>Локфри многопоток с хай лоадом тебя писать не просят.
Это же тааааааааааак сложно.
>С ревью конечно по началу меня ебали, но сейчас все эти моменты я пофиксил.
это и есть работа с наставником. Только вместо "пойду спрошу как надо" тебе сами говорят "как надо", просто с матами и затрещинами.
Результат одинаков )
>Это же тааааааааааак сложно.
Еще как.
А насчет "пойду почитаю мнение" помню читал про volatile и кеши, где читаешь про "запрещает оптимизацию и не будет проблемы что ядро проца закешировало что-то", а потом читаешь кого то из светил шарпа, а он пишет "volatile гарантий таких не дает. и фраза что "но за счет когерентности кешей будет все норм" не является правильной".
суко гребаный знак мешающий печатать. в итоге заранее приходится набивать пустые строки, а потом забываю их удалить
>просто с матами и затрещинами.
Да нет, обычный рабочий процесс где ты и не дурак, но и не в курсе всех тонкостей.
>Еще как.
Ну типо, поэтому я и написал "читаю несколько источников" а не принимаю на веру первый попавшийся.
Ну тогда надо скачать всю хуйню, перейти к csproj файлу открыть консольку и написать dotnet build
Наверное смогу, гугол то мне на что? Как то же я сам этому научился. Читал книги, гуглил, там все ответы есть.
Я не спрашивал как устроен async/await, то что это state machine Task я знаю. Тут вопрос в том как работает сам Task? Вот так мне надо было вопрос поставить. Смотрел на гитхабе что это ThreadPool, но тредпул это что? Он создает потоки? Вижу ты пишешь что нет, тогда что оно делает, как он взаимодействует вообще с потоками, откуда он их берет.
И то что async/await появился первым в сишарпе и об этом знаю.
Ну смотри. Допустим ты запускаешь что то асинхронное и передаешь калбэк, чтобы в конце работы его дернули. Но калбэк неудобен, его нельзя вернуть или поменять его расположение.
Поэтому немного изменяется что вместо принятия калбэка асинхронный метод вручает тебе специальный объект и у этого объекта и будет в конце работы изменен статус ну и результат выставлен.
И ты можешь подписаться на изменение статуса этого объекта и сам объект передать куда то
Вот это и есть Task/Future/Promise/Defer. Это просто обещание что по концу операции там будет нужный статус и результат (если есть)
и все.
Он ничего не знает про потоки. Он, как и CancellationToken, всего лишь токен с состоянием и возможностью подписаться на изменение состояния.
А работой в потоках заведуют другие места
ThreadPool - создает фоновые потоки в которых выполняет задачи. Создавать потоки дорого, поэтому этот пул потоков их переиспользует.
Task.Factory.StartNew и Task.Run() - которые планируют задачу в тредупуле (по дефолту)
await, который доверяет решать где выполнять контексту синхронизации иначе пихает в тредпул.
TaskCompletionSource - вообще никаких потоков.
ИМХО ты лузер не умеющий программировать. Правильно тим лиды делают что тебя отбривают каждый раз.
Твоё ИМХО не более чем О, чел. Я работаю 8 месяц.
Ну значит иди и работай. Устроишься джуном - расскажешь.
Спасибо анон, плюс минус понял. Узнал что-то новое.
Тебе заняться нечем?
>DoSomething().Then(callback)
Не понимаю смысла этого кода. Это же то же самое что
DoSomething()
callback()
Ведь пока не отработает DoSomething() всё равно программа будет висеть, поток-то один.
Тут явно что-то не так. Каким образом реализуется параллельность? Если не потоки, тогда должна быть их эмуляция так или иначе.
она будет висеть если DoSomething() блокирующий. Когда говорим про асинхронность - функции неблокирующие (иначе и нет асинхронности). Почему они не блокируют текущий поток - дело десятое.
Даже если один поток в системе (пусть будет жаваскрипт это) то в системе есть неблокирующие I/O. то есть когда читается файл или идет запрос в сеть, то поток не останавливается ждать.
Поэтому в твоем примере калбэк будет вызван сразу, а не как продолжение DoSomething()
Легко. На уровне "мне вручили таск и не заблокировали мой поток" знание "почему не заблокировали" не нужно.
Внутри может быть сетевой запрос, отдельный поток (из пула или нет), а может даже отдельный процесс, или таймер с TaskCompletionSource - мне то какое до этого дело? А никакого. Это внутренние детали реализации, а я работаю с контрактом.
качественно это в инете. Там тонны мануалов
но если чел не понял и спрашивает, значит он хочет простое объяснение которое принесет ему понимание. Понимание сути - основа обучения. Если не понял основ - никуда не уедешь, а с основами и гугл научит легко
И я пытаюсь показать на ежиках, а не готовлю к собесу
Как включить c# 9.0,у меня просто напросто не получается это сделать (я профан),установил net 5,и 6.......Помогите пожайлуста.
Структура - это тот же класс, но с модификатором доступа public: по умолчанию.
Хуя шизло
Доступ к msdn только для премиум-пользователей по подписке, подписку оплачивает работодатель.
Godot лучше тем что весит мало и на нем не только игры можно делать, а еще и приложения ага.
А еще он лучше тем что открытый исходный код и лицензия MIT.
Так что да, с выходом Godot 4 он может и трахнуть этот ваш unity.
Единственный минус который я увидел это разный синтаксический сахар, напузыривание всякой хуетой языка, а так язык просто отличный.
смотря что считать недостатками.
Потому что смешиваются понятия.
Task (объект) - тупо просто токен как и CancellationToken.
Task (концепция) - возьмем кусок кода, который мы хотим ожидать окончания его выполнения, нарекем его таском(задачей) и ассоциируем с ним специальный объект
Они не имеют никакого отношения к потокам. Они говорят про выделение отдельных кусков кода (ака задачи) и ассоциацию с ними специального токена для наблюдения. Для унификации работы с этим. Есть тут где-нибудь хоть намек на то, где и как она будет выполнена? НЕТ
А дальше ведь понятно что их можно запускать, то есть можно "запустить таску", ведь по факту она кусок кода.
Есть тут где-нибудь хоть намек на то, где и как она будет выполнена? НЕТ
Просто что она будет выполнена, но не как.
"запустить таску"==="выполнить таску" а не "выполнить в тредпуле"
Концепция деления на задачи и выполнения этих задач - перпендикулярны.
Task.Run(), несмотря на свое название, всего лишь утилитный метод помещения наших задач в тредпул, то есть сахар, чуть более сладкий чем Task.Factory.StartNew.
>Внутри может быть отдельный поток
Да. внутри асинхронного метода, который еще таской называют. Но таской его делает "ты нам верни объект специальный, да сообщи в конце через него че как", а не "выполняется он в потоках или еще как"
Ты пишешь бессмыслицу.
>возьмем кусок кода, который мы хотим ожидать окончания его выполнения, нарекем его таском(задачей) и ассоциируем с ним специальный объект
В одном потоке только одна нить выполнения кода, поэтому концепции "ожидания выполнения куска кода" не существует. Код просто выполняется, как он написан, линейно сверху-вниз, ты можешь "ждать" только вставив sleep(), но тогда ничего не выполняется, просто твоя нить кода прекращает работу на некоторое время.
"Ожидание" как концепт подразумевает два и более параллельных процессов, иначе, в одном процессе, ожидание не существует как концепт, т.к. есть только один процесс работы, но нет процесса ожидающего наблюдателя.
Таким образом, вся эта кухня имеет САМОЕ ПРЯМОЕ отношение к потокам, потому что так реализуется параллельность в компьютере, не может существовать без потоков или их эмуляции.
Таким образом, ЭТО И ЕСТЬ ПОТОКИ, только не обычные потоки, а специальные синхронизированные потоки под капотом средствами самого языка. Всего лишь сахар НАД ПОТОКАМИ.
А ты говоришь
>Task не имеет НИКАКОГО отношения к потокам
Чушь.
> вся эта кухня имеет САМОЕ ПРЯМОЕ отношение к потокам
>Таким образом, ЭТО И ЕСТЬ ПОТОКИ, только не обычные потоки, а специальные синхронизированные потоки под капотом средствами самого языка
нет не имеет. Нет никаких спец потоков. TPL не сахар над потоками. TPL это просто реализация корутин
Это концепт определяющий деление кода на блоки, которые работают асинхронно, планирование очередности их выполнения, связи между ними
Это просто правила структурирования сопрограм и работы с ними (ожидание, статус, результат)
То есть таски это "вот это должно быть выполнено после этого" и "статус выполнения и результат будут в объекте Task"
Само собой корутины должны не только делиться, а и выполняться. И поэтому в TPL есть дефолтный "выполнятор" - дефолтный TaskScheduler выполняет эти корутины в тредпуле.
и утилитные методы Task.Run() и Task.Factory.StartNew()
Но это всего лишь дефолтная реализация выполнения. Концепция корутин никак не затрагивает вопрос "как именно будет выполняться корутина" - ей ПОХЕР. Важно лишь, что она будет вообще выполнена, очередность и возвращает Task
А поэтому отлично работают планировщики в 1 потоке (GUI), ожидания задач запущенных в других процессах. А также
>не может существовать без потоков или их эмуляции.
TaskCompletionSource никаких потоков не эмулирует. Он всего лишь выставляет статус у Task )
упс. забыл. так что уточню
"и работы с ними (ожидание, статус, результат)"
следует читать как
"и работы с ними (ПРИОСТАНОВКА, ожидание, статус, результат)"
приостановка и продолжение - одна из ключевых частей концепции корутин
>это разный синтаксический сахар, напузыривание всякой хуетой языка,
Притом не это само по себе, а то что пытаются притащить всякую хуету из языков со динамической и слабой типизацией.
var result = await DoSomething()
абстрагирован от деталей выполнения этого самого DoSomething(). внутри этого метода могут использоваться тредпул, потом заменены на foreground поток, а потом быть заменены на процессы или на таймеры с TaskCompletionSource - `var result = await ` продолжит работать не замечая этих изменений.
Даже .ContinueWith не выбивается из этой канвы "выполнение не мое дело", поскольку не сама занимается выполнением продложения, а доверяет это TaskScheduler-у (который можно подменить просто передав свой)
>корутин
>асинхронно
>планирование
Это и есть потоки. Так они и работают, ведь процессоров на всё явно не хватит, вот и эмулируется выполняя по кускам там и сям, получая искусственную параллельность. Этот "выполнятор" находится в ядре ОС, производя потоки, так же как в C# такой же "выполнятор" делает те же самые потоки. Иначе параллельности просто не бывает, как концепция не может существовать в одной нити выполнения.
Ты ошибочно считаешь за поток только системные потоки от ОС, однако совершенно игнорируешь что C# у себя делает то же самое, та же машина потоков там работает, только обозвано по-другому. Но как поток ни назови, это всё равно поток.
Ну а задание "выполни это после того", это лишь сахар для удобства, ничего особенного, никакой концепцией не является.
Ёбу дал? Это более высокий уровень абстракции позволяющий формально доказывать корректность программы например. У тебя мышление слишком баётоёбское и приземлённое какое-то.
>Это и есть потоки.
не вижу тут потоков. Асинхронность - всего лишь обещание не блокировать выполнение в данном месте.
Планирование - всего лишь правила очередности чтобы не перепутались
корутины - это блоки кода которые могут приостановиться и продолжить свою работу
нет тут никаких потоков. Асинхронные структуры построены на TaskCompletionSource и не используют никаких потоков (даже I/O)
Process.WaitForExitAsync() какие потоки использует? Там работает процесс. Продолжение типа будет в потоке? так это уже другая корутина будет. И то, где она будет, тоже можно переопределить (свой TaskScheduler или контекст синхронизации)
>задание "выполни это после того", это лишь сахар для удобства
у тебя смешались мухи и котлеты и кони до кучи.
как концепция может быть сахаром. "выполни это после того" это сахар для чего?
Никто не спорит, что поток обмазанный синхронизацией под капотом это новый уровень абстракции. Ну и? Потоки никуда не делись, самое прямое к ним отношение.
>всего лишь обещание
Еще богу помолись. Компьютер это не обещалка, колдун херов, заклинатель демонов: "сделай мне заебись". Вот результат рекламы программирования среди сброда уличного.
Ну да. ты результат.
В других языках, например жс, Task имеет имя Promice
Перевод нужен или сам переведешь?
Электроны тоже никуда не делись, но это не сахар как ты написал.
>Когда что юзать?
Классы дают больше удобства пользования (для меня)
Ну например если ты создашь класс Point со свойствами X и Y, то ты можешь потом присвоить значение отдельно только X или только Y. В то время как со структурами для достижения того же самого, тебе придется перезаписать структуру полностью т.е. new Point(X, Y)
Структуры важны, если необходима скорость. Например мне надо было рисовать динамические кривые безье и там только время создания дефолтного класса Path, который в себе содержал класс PathFigure, который содержал в себе класс BezierSegment и т.д. — все это, т.е. простое создание нового объекта отжирало столько времени, что ФПС падал чуть ли не в нулину, если такие объекты создавать в цикле. А у меня еще своих классов дофига, и все это используется функциями которые ожидают структуры, то я просто не мог добиться нормального фпс.
Вот тогда я задумался про структуры, когда у тебя высокая частота обмена данными, какие-то математические расчеты которые провоцируют процесс упаковки и распаковки данных.
Тут подробнее про отличие структур от классов
https://youtu.be/8E9P_lnJ7RI
Короче, класс хорош, чтобы его один раз создать и потом использовать продолжительное время. Возможно это что-то комплексное и громоздкое. Структуры это такая херь, которая используется в циклах, в мат. расчетах — легко создал, легко забыл. В цикле можно хоть каждую итерацию создавать new Point или new Rect (а по другому и не получится). Попробуй Rect сделать классом — пизда фпс и памяти.
интересно как жависты живут без структур.
ну ладно примитивные типы оптимизированы
но допустим у меня картинка ARGB
Идеально для структуры,
вот пример имаджшарпа на пике. структуры удобна
но их нет в жава
упаковывают в int что ли
или используют шаблон "приспособленец"?
или тупо работают с data, data[i+1] - жесть.
Тебе должно быть похуй, если у тебя этого нет — в этом основной принцип сохранения психики индивидуума.
Ты сам то понял что сморозил?
Да просто напиши:
struct это стек
class это куча
и пусть загуглит что такое стек и куча, если не знает. Это прям самое простое объяснение.
А кому это гавно нужно однопоточное? Меня лично бесит этот ваш JS , что с ним можно сделать кроме написания веба? Сишарп намного сложен чем JS и более обширен в применение. Тут даже многопоточность сделать можно.
>что с ним можно сделать кроме написания веба?
например запилить "десктопный" софт который будет лагать, занимать кучу памяти и быть унылым говном. И при этом орать "десктоп умер"
Справедливости ради шарповые фреймворки такое же говно что до сих пор делает qt лучшей практикой.
Я думаю, что он уже загуглил и получил данный ответ.
Но на самом деле я тоже ничего не понимал, потому что и с тем и с другим хеловорлд работал одинаково, пока не приперло.
>> интересно как жависты живут без структур.
Используют классы вместо структур, а потом тратят кучу времени на пердолинг с настройками GC и выбивание у начальства серверов с бОльшим кол-вом ОЗУ
В плюсах и не такая хуйня бывает
А где ты видишь там .csproj-файл?
Там Makefile чтобы make делать на линуксе.
А для этого надо билдить весь mono/runtime
а чтобы его сбилдить
надо запустить
>./autogen.sh
и ещё и
>make get-monolite-latest
который качает хуй знает что.
Короче пиздос какой пердолинг.
Надо тупо код Mono.Data.Sqlite.dll заебенить и ебись оно конём. Как - хз. Я не ебу ваще как пропечатывать, все эти непонятные букаффы англюские, чтобы оно работало норм и не выёбывалось мне.
Вот какая ебала https://github.com/username1565/mono/blob/main/build_runtime.sh
Длл-ку получил. Но такое инклюдить к коду вместо длл-ки, как-то не очень. Плюс ещё куча зависимостей там, это просто пиздец.
В твою каловую шарагу для ебаньков? Нахуй иди, долбоёб.
Наверняка это как раз он.
А вот и тот еблан.
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) и моя структура лежала в стеке, а класс в куче.
Такой штоли есть разве, в .NET 4.0 ?
Елси да, то нахуя тогда все эти изъёбства с System.Data.Sqlite.dll и Mono.Data.Sqlite.dll ? Два года уже ебусь с этим всем.
> Ну например если ты создашь класс Point со свойствами X и Y, то ты можешь потом присвоить значение отдельно только X или только Y. В то время как со структурами для достижения того же самого, тебе придется перезаписать структуру полностью т.е. new Point(X, Y)
Схуяли.
Ты путаешь с иммутабл структурами.
> Структуры важны, если необходима скорость. Например мне надо было рисовать динамические кривые безье и там только время создания дефолтного класса Path, который в себе содержал класс PathFigure, который содержал в себе класс BezierSegment и т.д. — все это, т.е. простое создание нового объекта отжирало столько времени, что ФПС падал чуть ли не в нулину, если такие объекты создавать в цикле. А у меня еще своих классов дофига, и все это используется функциями которые ожидают структуры, то я просто не мог добиться нормального фпс.
> Вот тогда я задумался про структуры, когда у тебя высокая частота обмена данными, какие-то математические расчеты которые провоцируют процесс упаковки и распаковки данных.
> Короче, класс хорош, чтобы его один раз создать и потом использовать продолжительное время. Возможно это что-то комплексное и громоздкое. Структуры это такая херь, которая используется в циклах, в мат. расчетах — легко создал, легко забыл. В цикле можно хоть каждую итерацию создавать new Point или new Rect (а по другому и не получится). Попробуй Rect сделать классом — пизда фпс и памяти.
Тут самое важное, что надо отметить - структуры нужны для локальности памяти. Если у тебя List<Point> и поинт это класс, то в списке будут храниться ссылки, и когда ты его будешь проходить в цикле - проц будет переходить по отдельной ссылке в какую-то залупу.
А если поинт это структура - то они в памяти будут по порядку лежать, и проу сразу будет наперёд их в кэш подгружать, поэтому всё будет быстро.
Ну и конечно структуры лишний раз не создают объекты в куче(хотя их можно закинуть в кучу), поэтому сборщика мусора не ебут.
Ну конечно бля, жава это легаси, она сейчас нужна для доработки старой залупы во всяких банках и предприятиях. Но вот котлин вроде бы хорош.
Про GC, атрибуты и скорость компиляции понятно.
>Схуяли. Ты путаешь с иммутабл структурами.
Ну я часто сталкивался, что структуры не дают шатать какое-то конкретное свойство: что Point, что Rect. Насчет Size не уверен, кстати.
Если там стоит модификатор иммутабельности, то есть варианты почему так сделали. Я сука заебался с этим дерьмом, проще отдельно иметь переменные X и Y. Даже в функциях аругменты в большинстве случаев запрашивают координаты по отдельности, хотя могли бы поит принимать.
Я пытался вкатиться 10 раз, узнавал что-то новое, а оказывается, что это новое — вариация вывода строки в консоль. На 11 раз вкатываюсь, смотрю — незнакомая команда, гуглю, а это вывод строки на экран.
Ну и дропнул эту хуйню.
Ну поставь себе более интересную задачу, чем срать в консольку. Например, срать в окно на winforms или в окно браузера.
ThreadPool создается на CPU, ядре или в главном потоке приложения?
>Если после шарпа закатиться в С++, каких вещей, которые есть в шарпе, но нет в крестах, будет больше всего не хватать в повседневном кодинге?
"Виртуальной машины". Твой код против операционной системы, без посредников
а какая разница где. "создан в каком то потоке" не значит что он и далее живет в этом потоке. Существование объекта в памяти к потоку не привязано.
>Если там стоит модификатор иммутабельности, то есть варианты почему так сделали
Вариант один - мутабельные структуры злейшее зло. Заипешься следить за тем чтобы не было создано защитной копии.
А еще есть боксинг. И хз, откуда ты эту парашную цитату вытащил, но где и что аллоцируется будет решать .NET, а не C#, так что на собесе так никогда не говори.
да прямо таки. правила аллокации просты. и цитата верная. И боксинг, несмотря на типа магию, подчиняется тем же правилам.
Хочу установить Visual Studio 2022. Стоит ли гнаться за редакцией Enterprise или будет достаточно Community? Буду писать UWP, WPF и ASP.NET приложения, и возможно мобильные. Реально ли найти ключ для Enterprise в сети? Кое-что находил, но не знаю насколько они рабочие, проверить пока негде. Как вообще юзаете лицензионные VS?
Если не играть в unsafe (и еще глубже), то просто нужно помнить
стек может ссылаться на кучу (потому локальные ссылки на экземпляры классов в куче лежат в стеке без проблем), а куча на стек нет.
и следствие
- обычный метод, создаем инстанс структуры как локальную переменную
будет создана на стеке
- обычный метод, создаем инстанс класса как локальную переменную
значение инстанса пойдет в кучу, а значение ссылки на инстанс - в стек
- структура как поле класса.
класс сылочный тип и лежит в куче. куча не может ссылаться на стек, а значит хранит все у себя
Будет выделен кусок памяти куда одним куском лягут значения всех его полей.
Если поля ссылочные, значит лежать будут сылки (они же лонги по факту), если поля значимые, то они сами там и будут лежать.
внимание - место выделяется на все поля всегда, даже если они null
- массив значимого типа
массив это ссылочный тип, а значит держит структуру у себя. и выше писал что место выделяется сразу
А значит var test = new BigStruct[100000000] с радостью отхапает себе кусок в несколько гигов памяти
- массив ссылочного типа
типы ссылочные и экземпляры лежат в куче, но сама ссылка на кучу это значение. и место должно быть выделено на сами эти ссылки
и var test = new string[1000000000]; (побольше нуликов ибо ссылка всего 8 байт) тоже выжрет несколько гигов, хотя test[100] скажет что в нем null
(правда чтобы увидеть ее в диспетчере задач нужно включить колонку "выделеная память", ну и студия сразу покажет тоже)
- боксинг
хоть и магия, но ведет себя как класс обертка с полем структурой. Лежит в куче, ничего про стек не знает. А значит
боксинг - создается экземпляр, структура копируется в это поле.
анбоксинг - копируем это поле в локальную переменную (которая в стеке) и дропаем экземпляр обертки
(очевидно мы не можем упаковать ref структуры, которые требуют жить в стеке)
- асинк метод
асинк метод преобразуется в структуру конечный автомат (где лежит? хз. внутреннее дело рантайма),
где локальные переменные это поля
и правила будут как и у класса с полем структурой - все лежит вместе
и поэтому ref структуры в async методе нельзя
>>406637
да. есть полезные шняги. ключ реально. сразу после выхода стало реально ) и тулзы типа решарпера и supercharger подвезли. oz-code проблемен.
Если не играть в unsafe (и еще глубже), то просто нужно помнить
стек может ссылаться на кучу (потому локальные ссылки на экземпляры классов в куче лежат в стеке без проблем), а куча на стек нет.
и следствие
- обычный метод, создаем инстанс структуры как локальную переменную
будет создана на стеке
- обычный метод, создаем инстанс класса как локальную переменную
значение инстанса пойдет в кучу, а значение ссылки на инстанс - в стек
- структура как поле класса.
класс сылочный тип и лежит в куче. куча не может ссылаться на стек, а значит хранит все у себя
Будет выделен кусок памяти куда одним куском лягут значения всех его полей.
Если поля ссылочные, значит лежать будут сылки (они же лонги по факту), если поля значимые, то они сами там и будут лежать.
внимание - место выделяется на все поля всегда, даже если они null
- массив значимого типа
массив это ссылочный тип, а значит держит структуру у себя. и выше писал что место выделяется сразу
А значит var test = new BigStruct[100000000] с радостью отхапает себе кусок в несколько гигов памяти
- массив ссылочного типа
типы ссылочные и экземпляры лежат в куче, но сама ссылка на кучу это значение. и место должно быть выделено на сами эти ссылки
и var test = new string[1000000000]; (побольше нуликов ибо ссылка всего 8 байт) тоже выжрет несколько гигов, хотя test[100] скажет что в нем null
(правда чтобы увидеть ее в диспетчере задач нужно включить колонку "выделеная память", ну и студия сразу покажет тоже)
- боксинг
хоть и магия, но ведет себя как класс обертка с полем структурой. Лежит в куче, ничего про стек не знает. А значит
боксинг - создается экземпляр, структура копируется в это поле.
анбоксинг - копируем это поле в локальную переменную (которая в стеке) и дропаем экземпляр обертки
(очевидно мы не можем упаковать ref структуры, которые требуют жить в стеке)
- асинк метод
асинк метод преобразуется в структуру конечный автомат (где лежит? хз. внутреннее дело рантайма),
где локальные переменные это поля
и правила будут как и у класса с полем структурой - все лежит вместе
и поэтому ref структуры в async методе нельзя
>>406637
да. есть полезные шняги. ключ реально. сразу после выхода стало реально ) и тулзы типа решарпера и supercharger подвезли. oz-code проблемен.
неплохо бы иметь. каждому свое
https://visualstudio.microsoft.com/ru/vs/compare/
если ничего нужного тебе не зарезано в комунити то тебе ее хватит
Просто берёшь и делаешь пару проектов в гитхаб на ASP. Делаешь аналоги каких-то сервисов в своём упрощённом представлении.
лично мне 99% не нужно того что есть разница в ентерпрайз
даже коделенс разница
"CodeLens доступен в версии сообщества Visual Studio Community, однако в этой версии индикаторы управления source control недоступны."
Тесты это решарпер гоняет
Для меня все решает IntelliTrace, плюс там что то из сторонних вещей может не стать на коммунити
Нет. Компилятор услужливо создаст делегат за тебя
Как лучше:
- давать ссылку на swagger, чтоб там и мапинги, и валидацию было видно
- доделать/подучить фронт
- оставить так же (в Readme гитхаба есть ссылки и на фронт, и на сваггер)
И вообще на джуна лучше чисто back-end вакансии искать или fullstack? Или через стажировки вкатиться попробовать?
Меня интересует вопрос, что происходит когда я создаю N потоков, ThreadPool за ними тянется и расширяется или он привязан на приложении/процессе или на каждом ядре?
Когда мы перемещаем тип значения в ссылочный тип, данные перемещаются (копируются) из стека в кучу. Когда мы перемещаем ссылочный тип в тип значения, то данные перемещаются (копируются) из кучи в стек.
сурс: http://microsin.net/programming/pc/dot-net-stack-heap-value-reference-boxing-unboxing.html
нет. ты просто их создаешь. Они никак не привязаны к тредпулу
тредпул не мифическая сущность
это просто класс, который внутри себя создает потоки и перемылывает в них все что дают
можешь написать свой тредпул даже
Я для того чтобы на джуна попасть пришел, сказал: Приветик, в общем, такое дело, кушц хочу, готов кодить за еду.
Взяли.
Шарп на тот момент я не знал, в школе - учил паскаль.
и молодец. нашел свое место в жизни. Кодить за деньги - так меркантильно. Долой ремесло, программирование это призвание.
Нужны для тех случаев, когда тебе нужно передать функцию в качестве аргумента другой функции/методу. Посмотри Linq. Это отличный пример их использования. Ну и для механизма событий они необходимы.
> Когда просто так вызвать метод из какого-нибудь DI не вариант?
Конечно вариант, просто больше кода надо писать, придётся создавать общий интерфейс, реализовывать его в классе с единственным методом, а в методе-приёмнике вызывать метод этого интерфейса. А с делегатами можно тупо передать метод или лямбду, и в методе-приёмнике её вызвать как обычную функцию. Тебе нравится писать больше кода, когда можно меньше? Даже в жабе заебались так делать и придумали сахарок.
>Много ли я (вкатун) упущу, если прочитаю книгу условного Троелсена о 7 версии?
Нет, не много. Можешь вполне спокойно с седьмой версии учить. На освоение действительно значимых нововведений остальных версий языка максимум два дня уходит.
Ну я для этого и устраивался...
После обновления EFCore всё заработало.
> а еще и приложения ага
Причём прямо щас, не дожидаясь четвёрки можно лабать бэк на шарпе и фронт на годоте, который запустится на всех актуальных платформах. Встроенный конструктор форм позволяет легко и привычно лепить адаптивные интерфейсы. Единственный минус, фронт всегда будет работать на опен гл ес, нет способа запустить его в режиме обычной оконной отрисовки без графического ускорения.
Хороший пример Rust, который сжирает все ресурсы компьютера и неимоверно лагает
Сначала охуел, а потом понял, что ты про игру.
Потому что разрабы дауны. Тем не менее, игра все равно супер успешная.
Хартстоун кстати тоже на юнити
Смотрите. Есть некие данные. Их нужно читать. У данных могут быть разные типы.
Собственно в чем проблема. Я ничего лучше, чем вот такую вот табличку в базе делать - не придумал.
Кто знает решение лучше?
Просто я думал о какой-нибудь хитровыебанной системе с типа тегами и атрибутами и вот это вот все, а данные просто в строке хранить. Но сразу начинается ебатория, с тем, что нужно теперь делать постоянно запросы к базе, чтобы узнать какой же там тип данных, пропадает возможность сортировку нормальную и фильтрацию делать и вообще.
С другой стороны- прикриплейд выглядит кродливо как-то.
Короче. Как нормальные люди подобное делают?
public T Value {get; set;}
public List<T> Filter
Type t = T.GetType();
if( t is int)
...
if (t is DateTime)
...
if (t is String)
...
return List<T>
Тогда так object Value {get; set}
public List<T> Filter
((Value as Int) not null)
{
}
return List<T>
То есть ты планируешь хранить такое количество полей, и будешь их грузить при каждом запросе, но не хочешь делать лишние запрос, чтобы узнать тип?
Хз. Хранить тип енамкой, значение байтами?
И почему второй прикриплейд всего 500КБ?
Почему ты думаешь что я буду грузить все поля?
Есть отдельная табличка Data в которой как раз енамкой указан тип поля.
Собственно план следующий: при запросе каких-то результатов чтения - смотреть в Data какой там тип, и по этому типу - выбирать какие поля подгружать.
Этот объект же это модель в базе. В приложение и публичное апи он просачиваться не должен будет.
ты бы еще на ассемблере накидал и спросил, почему в ассемблере жрет 1 кб.
Очевидно же что net framework нагружен всякой хуйней и это тащится в сборку скомпилированную.
Ну тогда хранить в одном поле, при загрузке конвертировать в нужный тип. Просто у тебя каждое поле всё равно место жрать будет
Так суть-то в том, что из-за разных типов - я могу делать фильтрацию и прочее на стороне базы, плюс использовать индексы, хуиндексы и прочее. Без этого - придется все уже в приложении это реализовывать.
Ну, типа если там будет битовый массив - я не смогу просто написать WHERE UInt64Value > 10; WHERE ASCIIStringValue LIKE "Vasya" и т.д.
Ну и что мне делать, если мой руководитель из кожи вон лезет, чтобы на железках с 256МБ оперативки и процом ARM'овским за 2 бакса - запускали .Net?
Я просто пытаюсь пояснить, что .NET - прожорливый, у него на все один ответ - вот, мы программулину запустили, она даже работает, жрет всю память, ну дык это потому что никто не умеет с .net'ом работать, а он где-то читал, что вообще на микроконтроллерах .net запускали, значит можно как-то извратиться. Но я как не ебался, не старался - ну минимум для реального использования - это ~150МБ надо, когда такое же приложение на плюсах - уже есть и оно всего 10МБ жрет и нормально работает, сверху даже Nginx запихнуть получилось и PHP и много чего полезного и оно нормально работает, а тут будет одно приложение .NET'овское жить и жрать все для себя. Я не представляю, какие аргументы можно использовать в такой вот ситуации, если все тесты и метрики показывают, что для такого вот слабого железа - .NET противопоказан. Плакать хочется.
Ты учитывай, что с .net 6 программы не отдают память, если в системе ещё че-то остаётся. У меня парочка хуёвин ест 0.85гб от 1гб, но я могу докинуть ещё столько же
Че то щас попытался искать, ничего толкового не нашёл, лол.
https://docs.microsoft.com/en-us/dotnet/standard/garbage-collection/fundamentals#conditions-for-a-garbage-collection
Тут указано, что есть 3 причины для вызова гц, и одна из них это заканчивающуюся память.
ну а как ты хотел
виртуальная машина, 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"
>Какие недостатки у шарпа или дотнета?
Отсутствие нормально оплачиваемой работы, даже в сравнении с JS, Java, про GOвно вообще молчу, там платят еще больше.
Ну и тонны легаси с WFC, WebForms и тд
Если без этого - один из лучших ООП языков на ровне с котлином
Проблемы негров
>Отсутствие нормально оплачиваемой работы
Пиздишь, просто открой любой сайт с кодерскими вакансиями.
>даже в сравнении с JS, Java
Где в два раза больше вакансий, но в десять раз выше конкуренция. Найс. Еще и языки говно.
>GOвно
Скучно и перспективы мутные.
>Ну и тонны легаси с WFC, WebForms и тд
Очень редко, большинство давно переехало с этого говна или срочно переезжает, потому что с вебформсами меньше чем за 300ккк/наносек никто ебаться не будет, такие вакансии просто сажаскрывают сразу же.
> речь про РФ
Речь в первую очередь про штаты и Канаду.
Технологичность - пиздец.
14 из 15 легаси, платят копейки.
В Бритахе с этим получше, на удивление и новые проекты пилят, но платят все равно смех в сравнении с условным формошлепством на ноде.
Германия - пиздец, сплошная жаба, правда с такими тоннами легаси.
пиши не .net 2.0 или 4, выше нет смысла залезать. Чем выше версия .net тем больше потребление памяти и тем больше весит сборка.
В общем пообкатывай там разные .net версии и найди разницу.
>Пиздишь, просто открой любой сайт с кодерскими вакансиями.
У нас понятия нормально оплачиваемой работы разные.
Условные 300к ты можешь и на дотнете получать в РФ.
На удаленку контрактором на дяду сэму ты не уйдешь, потому что проекты говно и платят ебучие копейки, я уже весь indeed перерыл, сплошной тухлят.
Проекты сплошное говно, выбить условные 50$ в час еще нужно постараться.
>>408304
>но в десять раз выше конкуренция
На конкуренцию похуй.
>>408304
>Еще и языки говно
Говно, но кушать хочется лучше
>>408304
>Очень редко
Очень редко в РФ.
В штатах подобного говна навалом, что-то конечно переписывают, но не на дотнет, а на условный питухон
(реальный случай знакомого который переписывал вебформы на ноду)
|
Я только рад оказаться не прав, но это реальность о которой я сужу по вакансиям на indeed.
14 из 15 - говно.
Может я конечно долбаеб не там ищу
Про забугры я слабо шарю, но по одной свалке вакансий судить точно рано.
>На удаленку контрактором на дяду сэму ты не уйдешь
Дык если они ищут удаленщика из страны третьего мира, то очевидно, что это будет говнопроект, который просто надо на кого-то свалить за копейки и хуй бы с ним. Если ищут сотрудника в нормальный проект, то предложат релокацию.
>На конкуренцию похуй.
Попробуй устройся на Реакт. Вакансий ёбаное море, куча разных проектов и годные зарплаты. Ты не устроишься. Ориентировочно никогда.
>>408315
Это ты судишь по таким же удаленкам для третьих стран или это реальная ситуация конкретно на местах? Я от местных в пиндостане слышал, что дотнета там дохуя и больше с годными зарплатами и большинство на коре сидит.
>ноде
За этот кусок недобэка с 1% рынка вообще что-то платят? Покажи, я такого чуда еще не видел.
>В штатах подобного говна навалом, что-то конечно переписывают, но не на дотнет, а на условный питухон
(реальный случай знакомого который переписывал вебформы на ноду)
Олсо, какой нахуй петухон и нода? На них можно развернуть сайтец локальной аптеки или там местного фитнес-клуба с онлайн-записью. Серьезные энтерпрайзы никто на такие технологии переводить не будет, потому что жирные приложения на петухоне и ноде не подлежат поддержке, это технологии для совершенно других задач.
>Дык если они ищут удаленщика из страны третьего мира, то очевидно, что это будет говнопроект, который просто надо на кого-то свалить за копейки и хуй бы с ним
Поддвачну, это действительно так, но на удивление на ноде пару норм вакансий по описанию видел.
Я сужу по всему indeed, не только по плашкам
remote contractor from anywhere
Там большинство вакансий с дотнетом действительно какое-то говно и платят мало.
Может этот ресурс у них не котируется, но я из СНГ брезгую на таком за такие деньги работать, в штатах я бы тем более за такие суммы не работал
Не знаю как сейчас, но года полтора назад еще на stackoverflow вакансии смотрел, в среднем по больнице ситуация одинаковая.
>>408363
>куча разных проектов и годные зарплаты
Я все что связано с фронтом не перевариваю, ангуляр еще более-менее, но верстку нахуй.
>>408363
>реальная ситуация конкретно на местах
Это реальная ситуация на аутсорс галере
>>408363
>недобэка с 1% рынка вообще что-то платят?
Платят, любители говностартапов с пердолингом по 8+ часов в сутки оценят.
Размеренного темпа с планированием и нормальным Agile процессами там и не пахнет
>Серьезные энтерпрайзы никто на такие технологии переводить не будет
Переводили какую-то CRM с вебформ на ноду
В сортах говна не разбираюсь, но proof of concept на сколько я знаю заказчику выкатывали на NestJS
>>408369
>ноде не подлежат поддержке
Смотря кто пишет, код на дотнете тоже не всегда подлежит поддержке, если его долбаебы писали
А зачем вообще пытаться в эту удаленку с дядей сэмом? Тем более сейчас, когда этот дядя в любой момент тебя нахуй пошлет, дикие проблемы с оплатой и так далее. У нас же локальных годных вакансий дохуя и больше. А если уж к сэму, то имхо надо по-нормальному с релоком.
>А зачем вообще пытаться в эту удаленку с дядей сэмом
Платят значительно больше (при условии если идти на нормальные рейты 50$+) на меньше я не согласен
>>408380
> Тем более сейчас, когда этот дядя в любой момент тебя нахуй пошлет, дикие проблемы с оплатой и так далее. У нас же локальных годных вакансий дохуя и больше
Я в РБ, у нас рынок схлопнулся, в условный тинек идти не хочется, а больше толком ничего нет, у меня как раз с локальной галерой контракт заканчивается
>>408380
> А если уж к сэму, то имхо надо по-нормальному с релоком.
А я и рыбку съесть и на пенек залезть хочу, релок предлагают аутсорс галеры, но там говно какое-то, ради условных 1500$ в месяц сверху переезжать ну такое
>Я в РБ
Так вам вроде в рф устроиться должно быть легко.
>релок предлагают аутсорс галеры
Много кто предлагает. Правда с уровня не ниже мидла. Если ты годный специалист (а СНГшные ценятся), то релокнет почти кто-угодно, это не так уж дорого в сравнении с тем, что ты им дашь.
>Много кто предлагает. Правда с уровня не ниже мидла. Если ты годный специалист (а СНГшные ценятся), то релокнет почти кто-угодно, это не так уж дорого в сравнении с тем, что ты им дашь.
>>408391
>Так вам вроде в рф устроиться должно быть легко.
Я релок принципиально не хочу, в этом вся проблема.
Maui - это замена Xamarin на EEE.
Всё так анончик, пока клованы ебутся с биндингами и xaml винформо-боги просто мышкой перетаскивают и делают модный UI.
Всё просто и понятно, как у дедов с RAD. Не надо придумывать себе архитектурные проблемы и потом героически их превозмогать.
Прошивке для роутера достаточно веб-интерфейса
Если бы я такое увидел на ревью - я бы тебя убил прямо на месте. Даже не просил бы нормально написать. Просто взял и убил прямо там. А показав этот код другим коллегам - думаю они бы помогли от тела избавиться.
Я вижу 2 причины:
1) Неуправляемые сторонние библиотеки
2) Очень тонкое место в системе, где нужно производить дохуя расчетов, при этом чтобы тут не мешался GC. Например это может произойти в какой нибудь системе реального времени, где данные поступают сплошным нескончаемым потоком - и тебе нужно их как-то обработать. Если тут будет GC, то есть шанс, что из-за его работы внезапно подвиснет поток и программа перестанет успевать за входящими данными
Асинхронность, это когда ты например отправил запрос куда-то там и тупо ожидаешь ответа. Например запрос на сервак или в бд. В это время у тебя программа фактически нихуя не делает, просто ждет.
Парралелизм, это когда программа всё же делает, что-то считает например, отдавая это сторонним потокам.
Это основное отличие асинхронности от парралелизма.
При async await у тебя вообще таска может никуда не уйти из вызывающего потока, например если быстро выполнилось. Как правило работает это все же иначе. Если есть контекст синхронизации, который обычно объявлен общим по всей приложухе, то после await, выполнение 100% вернется обратно в вызывающий поток. Если контекста синхронизации нету, как в ASP приложениях, то выполнение как нехуй может вернуться уже в другом потоке. Это кстати основная причина того, почему await нельзя засунуть в lock и компилятор пошлет тебя нахуй.
Thread - низкоуровневая хуйня, никогда не создавай её ручками. Используй TPL - там хотя бы всякие тредовые пулы юзаются
унылый UI (не умеющий в изменение DPI) из заранее забитых компонентов
(захочешь кастомизации - привет пердолинг в ручное рисование)
Никого не слушай, ты реально талант
>Если есть контекст синхронизации, который обычно объявлен общим по всей приложухе, то после await, выполнение 100% вернется обратно в вызывающий поток
неправда. оно вернется в контекст (который уже сам решит где ему выполнять) и то только если ConfigureAwait(true) - да, эта хрень по дефолту тру, но не у всех - пока мелкие игнорят просьбы сделать выбор на уровне сборки, другие (и я тоже) используют Fody.ConfigureAwait и делают ConfigureAwait(false) по дефолту
а кому такое нужно? Такое нужно только тем, кто либы разные пишет. Но бизнесу такое не нужно.
>а кому такое нужно
Никому, это пустая трата времени. Лучше бы я алгоритмы дрочил, а не эту хуйню.
Почему? Можешь объяснить чем этот код плох? Кроме его бесполезности, конечно же.
Бизнесу вообще программирование нахуй не всралось, ему нужна оптимизация процесса получения прибыли. И как это добьются четырёхглазые макаки из айти, ему насрать, пусть хоть через динамикметоды.
это кодогенерация. нужна там, где по какой то причине не хватает expression tree
или же генеришь классы на лету. в мапперах всяких или обхода ограничений CLR. То есть в библиотеках.
с приходом source generator стало менее нужным
Я вот использую в маппере игнорируя CLR проверки на типы понимая возможные последствия конечно.
в обычном программировании нахер не нужно - там есть expressio tree
>>409518
да да. конечно ) если ты будешь кодить год вместо 2х дней, то ему будет не насрать.
Вкатился недавно. Есть апишка с EF одна на гитхабе, но мне кажется её даже не смотрели. Есть год опыта смежного (не .net, но тоже кодинг). Тестовое делал с многопоточкой и сетями (нужно ковырять их специально глючный сервак по TCP и вытягивать данные). На собесе спросили чутка про подробности ООП и про внутреннее устройство коллекций.
Если ты через динамикметод решишь задачу быстрее, чем нормальным способом, тебя заставят юзать динамикметод.
но ты не решишь. Даже будь ты 100000 раз спецом - тупо писать больше.
Если бы так решалось, то все бы писали на ассемблерах и высокоуровневые языки бы не родились (а зачем)
и шарп бы не родился - а зачем если есть си
Ну так это говно и не годится для стандартного крудошлёпства для кабана, его нужно юзать в более специфичных задачах.
GC.StopTheWorld
>>2384400 →-нытик
знание зарплаты ничего не дает
важны требования
можно зарабатывать и косарь, но при этом балду пинать, не отчитываться, иметь гибкий график и так далее.
>потерял всего 30% по зп.
Это ты что, на 700 баксов подписался?
Чет совсем дешево, не ценишь ты себя.
Я столько имел год назад на заводе стоя за станком (причем по старому курсу)
Неее, до спецоперации почти 3к получал.
Как сделать пира на .NET 3.5?
Так вот, как бы, так сказать, ретранслировать это событие на родительский класс Grid. Я не хочу снаружи иметь доступ к эллипсу. Городить кастомное событие тоже не хочется — там многабукв.
всегда рады помочь, с вас пять тыщ.
Понимание того, что это за херь, и как сделать нормального пира на них.
Пока, всё что приходит в голову - это блядь костылить такую хуету.
Пир, значит, это и клиент, и сервер...
Значит надо поднять блядь сервер.
Сервер какой?
Очевиднейший TcpServer: https://github.com/username1565/nanoboard/blob/master/nanodb.exe-source/Server/TcpServer.cs
Ну не HttpServer же, блеать:
https://github.com/username1565/nanoboard/blob/master/nanodb.exe-source/Server/HttpServer.cs
Но я пошёл дальше, и нарыл такие коды: 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).
Хуй знает шо за сокеты, и с чем их жрать, но ебанины, очевидно, много.
Написал всю хуйню русскими буквами, кириллическими, вот здесь:
https://github.com/username1565/nanoboard/issues/21#issuecomment-1188924519
А как вкодить - хуй знает блядь. Я уже реально заебался с этой хуйнёй. ПАМАГИТИИИ...
Не надо TCP и UDP. Надо просто UDP. Осталось обмазать DHT и NAT hole punching, и это самое сложное.
А как же без 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 пир есть, чтобы можно было его юзать, как ноды в криптоговнах.
Я думал есть уже пир, но как обычно придётся самозапиливать всю хуйню самостоятельно, ибо ебать какой я элитарий, я же на острие инноваций.
> А как же без 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.
Да
нет
Чтобы стать джуном нужно писать.
Для джуна главное софт скилы, а не знания. Ты можешь плавать в теории, не мочь в асинхронность, но иметь подвешенный язык, и тебя возьмут скорее, чем задрота.
>Зачем тебе вообще 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, и палить их.
А так-то, наноборда, вообще без серверов разрабатывалась, там тупо локальный сервер, как читалка нанопостов, и больше нихуя.
Локальный сервер хуй задодосишь, и хуй задиванонишь, потому что он локальный блеать.
>Зачем тебе вообще 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?
Как обычно, в блокноте,
компилируем с помощью csc или msbuild, в mono.
https://ru.wikipedia.org/wiki/Mono
Запускаем так:
>mono Program.exe
Короче, глянь
это https://github.com/username1565/mono/blob/main/build_runtime.sh
это https://github.com/username1565/nanoboard/blob/nanodb-sqlite/nanodb.exe-source/build.sh
и это https://github.com/username1565/nanoboard/blob/nanodb-sqlite/run.sh
Там, в комментах строчки сныканы, ну шоб поставить это моно.
> Потому что наноборда работает по HTTP, а он по TCP, и HttpServer.cs, по коду, увязан на TcpServer.cs
Насколько я помню, наноборда клиент-серверная, хоть и резервных серверов несколько, прямого соединения с другими клиентами нет. Она даже более централизована, чем торрент-трекеры.
> Это как так? Через UDP HTTP-запросы отправлять, что-ли?
Ну да.
> Бля, это ещё пижже, как-бэ, но нахуа?
> Прикол в то, что UDP пакеты пиздуют не последовательно, а как-бы вразнобой:
IP-пакеты тоже, там нет никакого контроля и никаких гарантий. Это сам TCP, работающий поверх IP, их за тебя выстраивает в правильном порядке, а UDP этого не делает.
> Поэтому я решил объединиь TCP/UDP в один сервер, и приебенить туда мультикаст-группу для поиска пиров.
Основная проблема TCP - через него невозможно сделать NAT hole punching. Так-то все бы его юзали и не парились.
> Но если ты говоришь тысяча узлов будет сидеть на роутере,
Не, я имел в виду маршрутизатор самого провайдера, который соединён с твоим домашним роутером.
> >Есть, те же торренты с API для шарпа.
> >Но многие заточены под специфичные юзкейсы
> А они на .NET 3.5 будут работать?
Не факт, но попробуй взять релизы постарее.
И много других проблем, по остальному не подскажу, очень специфичная тема.
ну...на любителя
Rider - охуенная тема. Правда, есть вероятность, что к vs ты уже не захочешь возвращаться.
У меня для тебя неприятная новость: Тебя хотят сократить и ищут предлог.
Настолько дохуя, что ты охуеешь. Если не можешь с этим смириться, тебе в C++ тред.
Все некроссплатформенные* API устарели, даже если их написали сегодня.
⚹винда, линукс и макос
Лишь бы была прошивка для твоей мамаши.
12 кажется. 8 на номер рантайм типа, 4 байта для флагов синхронизации и системного говна.
Ебать, 12 гигабайт.
1. Какой фреймворк для этого дела учить джуну? Одни советуют родной мелкософтовский, другие autofac, третьи еще что-то. Нормальные туториалы нашел только по автофаку.
2. Видел несколько реализаций без фреймворков - там создается отедльный класс с методами, в которых вызываются инстанции классов. И я как-то не понял, это всегда будет работа с новыми инстанциями? А если мне нужен стабильный класс с определенными данными, который постоянно висит в памяти?
>Какой фреймворк для этого дела учить джуну
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();
serviceCollection.AddTransient<LocalPizda, IPizda>();
serviceCollection.AddTransient<LocalPizdaDependency, ILocalPizdaDependency>();
Ты можешь их сбилдить в объект:
ServiceProvider provider = serviceCollection.BuildServiceProvider();
Ты можешь сделать следующий вызов:
var localPizda = provider.GetService<IPizda>();
И теперь у тебя есть объект LocalPizda (но будет как IPizda), содержащий все нужные ему зависимости, т.е serviceProvider сам сделал конструктор и засунул туда нужные зависимости и сделал для них конструкторы с их зависимостями (ну и так вглубь до конечного результата который тебе нужен в виде IPizda), это помогает как решить new ConcreteClass(new Dependency1(), new Dependency2(new DependencyDependency1()))
>Какой фреймворк для этого дела учить джуну
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();
serviceCollection.AddTransient<LocalPizda, IPizda>();
serviceCollection.AddTransient<LocalPizdaDependency, ILocalPizdaDependency>();
Ты можешь их сбилдить в объект:
ServiceProvider provider = serviceCollection.BuildServiceProvider();
Ты можешь сделать следующий вызов:
var localPizda = provider.GetService<IPizda>();
И теперь у тебя есть объект LocalPizda (но будет как IPizda), содержащий все нужные ему зависимости, т.е serviceProvider сам сделал конструктор и засунул туда нужные зависимости и сделал для них конструкторы с их зависимостями (ну и так вглубь до конечного результата который тебе нужен в виде IPizda), это помогает как решить new ConcreteClass(new Dependency1(), new Dependency2(new DependencyDependency1()))
В общем. Я под спойлером кучу слов написал. Но пока писал - понял что на примере нагляднее.
В общем. Вот как ты будешь делать без await https://docs.microsoft.com/ru-ru/dotnet/framework/network-programming/asynchronous-server-socket-example
На картинке - как с await.
Какой код по твоему проще для понимания?
А про саму асинхронщину - таки под спойлером.
Смотри. Вот допустим, у тебя в программе был бы ровно один поток. Так вот. Ты хочешь какую-то долгую операцию выполнить. Допустим - открыть файл в миллион строк и вывести это на экран. Так вот. Поток у тебя все еще один. А значит что? А значит то, что у тебя все будет выполняться последовательно(синхронно), т.е. код дойдет до момента, когда нужно открыть файл. Заблокирует поток. Будет ждать от ОС сигнала о том, что файл есть, его можно открыть, вот тебе хендлер для работы с файлом. Дальше - ты так же синхронно начнешь данные читать/копировать, дальше ты так же синхронно будешь ждать выводить строчки из файла куда тебе там надо. И вот когда все это закончится - только тогда программа будет способна что-то еще делать.
Асинхронщина:
Ты вот так же как и раньше, хочешь работать с файлом. Миллион строк. Так вот. Поток доходит до момента, когда нужно открыть файл. Но вместо того чтобы ждать завершения - просит ос открыть файл и идет дальше делать полезные дела. Когда ос пинганет и вернет хендлер - поток узнает об этом механизмами которые придумали разработчики ОС - и можешь что-то полезное сделать, например так же асинхронно почитать из файла, и так же не блокируя поток продолжить выполнение. Благодаря этому - поток может больше полезных операций выполнить, вместо того чтобы ждать пока ос просрется, пока диск ответит и т.д.
Развивая мысль - мы можем уже сверху натянуть пулы потоков и всячески наращивать более интенсивное использование ресурсов CPU для полезных вещей, вместо того чтобы тот стоял и нихуя не делал полезного, а пользователь думал, что все зависло.
Так вот. В твоем примере - это сахарок для того чтобы ты не ебался с миллионами коллбеков, AsyncEventHandler'ами и прочей залупистикой, а мог писать как-бы синхронно.
Посмотри просто примеры как это говно на ЖС до введения async-await было. Колбек на коллбеке и коллбеком погоняет. Либо еще хуже и у тебя это вот в ООП завернуто. Там у тебя будет пиздец в духе: Хендлер на хендлере и хендлером погоняет.
Потому умные люди подумали-подумали и придумали вот такой вот сахарок.
В общем. Я под спойлером кучу слов написал. Но пока писал - понял что на примере нагляднее.
В общем. Вот как ты будешь делать без await https://docs.microsoft.com/ru-ru/dotnet/framework/network-programming/asynchronous-server-socket-example
На картинке - как с await.
Какой код по твоему проще для понимания?
А про саму асинхронщину - таки под спойлером.
Смотри. Вот допустим, у тебя в программе был бы ровно один поток. Так вот. Ты хочешь какую-то долгую операцию выполнить. Допустим - открыть файл в миллион строк и вывести это на экран. Так вот. Поток у тебя все еще один. А значит что? А значит то, что у тебя все будет выполняться последовательно(синхронно), т.е. код дойдет до момента, когда нужно открыть файл. Заблокирует поток. Будет ждать от ОС сигнала о том, что файл есть, его можно открыть, вот тебе хендлер для работы с файлом. Дальше - ты так же синхронно начнешь данные читать/копировать, дальше ты так же синхронно будешь ждать выводить строчки из файла куда тебе там надо. И вот когда все это закончится - только тогда программа будет способна что-то еще делать.
Асинхронщина:
Ты вот так же как и раньше, хочешь работать с файлом. Миллион строк. Так вот. Поток доходит до момента, когда нужно открыть файл. Но вместо того чтобы ждать завершения - просит ос открыть файл и идет дальше делать полезные дела. Когда ос пинганет и вернет хендлер - поток узнает об этом механизмами которые придумали разработчики ОС - и можешь что-то полезное сделать, например так же асинхронно почитать из файла, и так же не блокируя поток продолжить выполнение. Благодаря этому - поток может больше полезных операций выполнить, вместо того чтобы ждать пока ос просрется, пока диск ответит и т.д.
Развивая мысль - мы можем уже сверху натянуть пулы потоков и всячески наращивать более интенсивное использование ресурсов CPU для полезных вещей, вместо того чтобы тот стоял и нихуя не делал полезного, а пользователь думал, что все зависло.
Так вот. В твоем примере - это сахарок для того чтобы ты не ебался с миллионами коллбеков, AsyncEventHandler'ами и прочей залупистикой, а мог писать как-бы синхронно.
Посмотри просто примеры как это говно на ЖС до введения async-await было. Колбек на коллбеке и коллбеком погоняет. Либо еще хуже и у тебя это вот в ООП завернуто. Там у тебя будет пиздец в духе: Хендлер на хендлере и хендлером погоняет.
Потому умные люди подумали-подумали и придумали вот такой вот сахарок.
Но с таким подходом у меня проблема в том, что это как-то дохуя сложного кода выходит, а ещё я хз, как там с очередями работать потокобезопасно, в js с этим как-то проще, асинхронный код в одном потоке работает, всё предсказуемо, а в c# у меня такое ощущение, что Локи, а иногда и асинкавейты в совсем рандомных местах раскиданы, я не понимаю, как это всё писать, чтобы оно заведомо правильно работало с параллелизмом.
Причём задача то звучит как вполне типичная, наверняка где-то лежит её красивое решение с простым кодом, но я чет не могу нагуглить. Хелп.
Нет не лежит.
Если ты про запросы к базе - то первое что нужно было смотреть - план запроса и пробовать его сделать более быстрым(индексы-хуиндексы, снизить число циклических обходов размер запрашиваемых из базы данных, если оно не надо).
Если запросы какую-то работу выполняют - то +- как ты описал все и делают. Простого решения тут нет.
Для работы потокобезопасно с очередями у шарпа есть ConcurrentQueue.
Чтобы снаружи это выглядело более пристойно - можешь сделать свой LongRunningTask<T> который будет в очередь помимо задачи - класть семафор и после завершения задачи - отжимать его, чтобы снаружи выглядело как обычная задача с await и всем таким.
Ага
Удалёнкоблядь
Взяли джуном на говнолегаси на жабе за 160к.
1 - закинуты объекты "хуй", "говно"
2 - закинуты тысяча объектов, удалены, закинуты объекты "хуй", "говно"
У них будут одинаковые хэши? А equals? А сравнение через ==?
Замутил свой стартап на лохчейне, уже 2 года живу на пассивном доходе.
Нет.
Спокуха, щас объясню. 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();
}
Выполнение пойдет одновременно и вывод может любой:
method1
method2
ИЛИ
method2
method1
Это и есть асинхронная операция.
Спокуха, щас объясню. 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();
}
Выполнение пойдет одновременно и вывод может любой:
method1
method2
ИЛИ
method2
method1
Это и есть асинхронная операция.
Никогда не смешивай Thread и Task в коде, любой новый Thread блочит любые таски, вот неплохое объяснение различия https://ru.stackoverflow.com/a/548879/422180
>Но ведь прога может завершиться до того как будут выведены сообщения.
Если будет какой-то краш проги критический который убьёт нахуй процесс, или выключится свет, то да, ну или если у тебя консольная программа из двух строчек кода которые я написал в методе Pizdec в конце ответа
Так если основной поток отработает до того, как выполнится эта асинхронка она же и не будет выполнена?
>Так если основной поток отработает до того, как выполнится эта асинхронка она же и не будет выполнена?
Ты путаешь потоки и задачи https://ru.stackoverflow.com/a/548879/422180
Взял пожрать из холодильника за причитания о поиске работы.
Два чая, анон, что-то примерно начинает доходить. А где по науке регистрируются все эти зависимости и билдятся в объект? В Program.cs? Олсо, как я потом вызову зависимость из другого класса, если тут тоже используется new ServiceCollection()?
по науке на самом самом верху приложения в глубину контейнер не передается.
>лсо, как я потом вызову зависимость из другого класса, если тут тоже используется new ServiceCollection()?
шта?
Хм, внатуре. Годнота та ещё. Надо попробовать clion дать второй шанс.
Все зависимости регаются как можно ближе к стартующему приложению классу (но не рядом с 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
ServiceProvider = collection.BuildServiceProvider();
}
Далее из любой точки программы:
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>();
Все зависимости регаются как можно ближе к стартующему приложению классу (но не рядом с 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
ServiceProvider = collection.BuildServiceProvider();
}
Далее из любой точки программы:
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>();
Есть один список результатов, в котором есть поля:
DateTime date;
int someintvalue;
Как в нем просумировать и вывести среднее int значения по днях? Например в нем может быть n экземпляров с каким-то одним днем, мне нужно вернуть одну экземпляр с этим днем и средним int значением.
var zalupa = results.GroupBy(res => res.date.Day)
.Select(res => new { day = res.Key, avg = res.Average(res => res.someintvalue) })
.ToArray();
Типа того?
Удалёнку ищи
Где я их смешивал? Если ты про
> можем уже сверху натянуть пулы потоков и всячески наращивать более интенсивное использование ресурсов CPU
Это не про таски, а про асинхронность как таковую. Тебе зачастую плевать в каком конкретно потоке будет продолжено выполнение, а потому - делая планировщик - ты можешь брать любой не занятый поток и пихать в него остальную часть твоего асинхронного кода.
я хз где там у тебя увидели смешивание и вообще о какой блокировке идет речь, но у тебя ошибка
await HandleClient() не даст работать 2+ подключениям одновременно.
>ты можешь брать любой не занятый поток и пихать в него остальную часть твоего асинхронного кода.
да не можеш ты блять. зайди в свою ебучую студию и запусти два потока с несколькими тасками (как с await так и без) и посмотри че будет.
Вали оттуда при первой же возможности. Через год ты обнаружишь, что даже вкатун, только что выползший с курсов жидбрейнса, будет намного ценнее тебя на рынке труда.
>>411928
Я ща подумал, короче я насрал.
Во первых, там создаётся анонимный тип, а не один из экземпляров юзается, во вторых, это хуйня не будет работать нормально, если у тебя больше одного месяца в результатах, тому что Day возвращает просто день в месяце. Наверн можно вывернуть как-то в res.date.ToString("dd:MM:yy"), тогда будет работать до конца века. ну или yyyy сделай.
> как без вайна запустить программу с WinForms на лялехе
Никак. Попроси разраба сделать билд на Eto.Forms.
Бро, тебе бы туториалы писать. Я мимокрокодилировал, прочитал и сразу всё понял.
Не игнорируя ясен пень.
Так и делать везде проверку на ноль?
спс
> await HandleClient() не даст работать 2+ подключениям одновременно.
Я знаю. Это в данном случае не ошибка, просто я проглядел что MS в старой реализации отпускают ManualResetEvent . В даном случае можно просто таску не эвейтить, ну либо async void делать.
>>412285
При чем тут таски и асинхронность, чел? По твоему таски это единственный способ сделать выполнение кода асинхронным? Ты троллишь?
Например. Методы стримов BeginRead, BeginWrite - асинхронные.
def foo(a, b, /, c, *, d, e)
где требование указывать параметры верно позиционно и требовать с именами указывать.
Худшее, что можно было только высрать в петухоне. Теперь все срут функциями по 20 аргументов. Лучше уж передавать один объект, заполненный через initializer block.
>и требовать с именами указывать.
А что если я все коллекции которые принимаю как параметр метода называю items? А у человека в методе нахуй 5 коллекций которые друг с другом ебутся во все дырки чтобы притащить в моей метод коллекцию с названием items? Лол. У меня порой если метод +- крупный то приходится ебаться с названиями чтобы они попросту не конфликтовали и были читаемы
>Теперь все срут функциями по 20 аргументов.
как одно связано с другим. Кто запрещает срать функциями по 20 аргументов в шарпе? там тоже есть именованные параметры.
>>412598
>А что если я все коллекции которые принимаю как параметр метода называю items?
И? о чем ты вообще. В шарпе ЕСТЬ именованные параметры (только без требования "имя опустить нельзя").
>Лучше уж передавать один объект, заполненный через initializer block.
у которого кстати НЕТ проверки на заполненность на уровне компилятора ибо required не впилили.
Ну можно заполнить через конструктор....ой, а это ж опять те же 20 полей, да без имен )
>В шарпе ЕСТЬ именованные параметры
Видимо не так понял то, что ты имел в виду у пайтона, не ебу что там у него.
def foo(a, b, /, c, *, d, e)
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)
но это нужно иметь культуру "а вдруг кто читать будет после меня" и особо настраивать правила чистилок "не чисти эти имена гад, ну и что что их не является обязательным указывать, я их указал для читабельности", что конечно никто не делает.
Надеюсь это никогда не добавят, щас бы нахуй думать над позиционированием входящих параметров и чето там запрещать. Нахуя? Нет же ни одной объективной ситуации где это могло бы быть нужным. Читаемость даст следующий код:
void Foo(int a, int b, int c, int d, int e)
а не вот этот:
def foo(a, b, /, c, , d, e)
Какие-то нахуй слэши, звёздочки, нахуя это всё?
>но это нужно иметь культуру "а вдруг кто читать будет после меня"
Вот поэтому этот синтаксис из питона никогда не добавят, мне важнее читаемость в будущем чем какие-то ограничения на параметры
>Какие-то нахуй слэши, звёздочки, нахуя это всё?
Это просто способ указания какие параметры какие. их никто не заставляет применять. Можешь не писать в своем коде, а в чужом - опять же пишешь не ты.
>Читаемость даст следующий код:
>мне важнее читаемость в будущем
я вызываю твой метод
Foo(1,2,3,4, 5)
ты потом читаешь этот код. правда сходу понятно что такое 3, а что 4? или все таки нет? )
читабельность уровня "да хз, вроде норм"
или
Foo(true, true, false, true, false)
красота же. Читаемость 10000%
А теперь следи за руками. Никто не требует указывать имена для всех параметров. Используется только для опциональных!!. И в шарпе тоже самое - используется для опциональных.
Только если опциональный параметр ничего не пропускает, то IDE предлагает убрать имена. и получается
Foo(true, true, false, true, false)
>Foo(1,2,3,4, 5)
>ты потом читаешь этот код
Даже в вс коде есть инлайн подсказки для имён параметров в таких случаях. Одно расширение только что заруинило твою аргументацию
На питоне пишут нормальные люди, а не шарпомакаки, которые без подсказок IDE даже хеллоуаорлд не напишут.
мышью елозить - это не читабельность.
Иначе бы тогда не было претензий к 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, что не является запахом.
и сразу - не нужно про обратную совместимость имен. поскольку любой параметр можно использовать именованно, то шарписты и щас не имеют свободы менять потом имена параметров, поскольку нет гарантии что никто не использовал имя (на деле конечно никто, но это авось, а не гарантия)
мышью елозить - это не читабельность.
Иначе бы тогда не было претензий к 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, что не является запахом.
и сразу - не нужно про обратную совместимость имен. поскольку любой параметр можно использовать именованно, то шарписты и щас не имеют свободы менять потом имена параметров, поскольку нет гарантии что никто не использовал имя (на деле конечно никто, но это авось, а не гарантия)
Держи подсказочки.
Открою секрет. diff-ы можно точно так же спокойно смотреть в IDE и у тебя там будут доступны любые расширения с подсказками и без.
А теперь давай придумай еще какой-нибудь нереалистичный способ, когда я не смогу воспользоваться IDE чтобы, посмотреть что там и где.
есть
inline hints назыается
отключается в первую очередь из-за такой херни как на скрине
в решарпере тоже есть и чуть посмартовее, но тоже отключается по той же причине
>>412637
> можно точно так же спокойно
ты перепутал со словом НУЖНО (в твоем случае) ибо только там мусорные инлайн хинтс или грызун
>и сравни читабельность
>foreach ... in Product(true, false, false, true, true)
>и
>foreach ... in Product(true, false, false, simplify: true, reverse: true)
Во-первых. Если это касается каких-то флагов или перечислений, то шарпе создатель функции может использовать Enum, чтобы принудить пользователя не использовать вот этот подход (false, -1). В нормальной функции у тебя будет так: (Visibility.Hide, HorizontalAlignment.Left), и пользователю не нужно все это расписывать.
Во-вторых, если это касается каких-то чисел, то я давно не припомню, чтобы я прямо в аугменты функции вписывал что-то подобное (356, 80, 45, 90). Если это не перечисления, то вписываю туда уже существующие переменные, типа (X, Y, Width, Height), которые уже говорят сами за себя. У меня возникает МАЛЕНЬКИЙ вопросик, а какого хуя питоноблядь допустила ситуации, когда она пишет это (356, 80, 45, 90), окромя каки-то быстрых тестов. Как у нее это получилось? Как у нее значения заспавнились в середине тела функции? И почему это захаркодено?
В-третьих. Да, нужно приучать себя создавать перечисления и иметь внутреннюю самоорганизацию. К сожалению, попытка языка покрывать лень пишущего, приводит к чудовищным последствиям, и джава скрипт тому пример — 60% функционала рождены только для того, чтобы осилить\исправить изначальное попустительство в сторону пользователя. И что это дает? Возвращает язык к тому, от чего он бежал, а сам юзер в итоге должен изучать дополнительные 60% информации, чтобы в итоге 24\7 быть начеку, отслеживая всякие "поднятия" и прочую хуйню, которая ни на минуту его не расслабляет и не делает его жизнь легче, хотя сам юзер мог бы приучить себя к самоорганизации и упростить себе жизнь многократно.
>отключается в первую очередь из-за такой херни как на скрине
У этого вроде есть даже определение, типа телескопический эффект.
>Если это не перечисления, то вписываю туда уже существующие переменные, типа (X, Y, Width, Height), которые уже говорят сами за себя
ты вообще о чем? где ты в ВЫЗОВАХ методов прописываешь имена параметров? В сигнатурах понятно что имена есть, но в В ВЫЗОВАХ ты прописываешь ТОЛЬКО ЗНАЧЕИЯ
и ситуация вида
(356, 80, 45, 90)
вполне норма, если тебя не очень высокоуровневый код, где у каждого параметра обязательно есть именованная переменная.
заводить именованную переменную для каждого true/false и использовать их как константу - дичь, поскольку они сами константы самих себя.
про перечисления не в тему ибо перечисления это перечисления, а флаги это флаги и опциональные параметры - это опциональные парамтры (то есть могут быть не только true/false)
Потому и плодят разные Options, а не перечисления заводят.
>>412647
да пофиг что там есть. он
а) замусоривает код (причем настолько что в итоге вырубается нах)
б) требует редактора. то есть я не могу с планшета почитать гитхаб. Мне нужно обязательно комп, обязательно клонить проект, поебаться с " у вас не установлено 100 вариантов фреймворков" и " это не грузится потому что вот вам сто ошибок" (товарищ с моно sqlite один из пруфов этого) и только потом нормально читать )
то есть понятно что код должен быть самодокументируемым.
но нужно же и меру знать
если метод принимает 5 bool
то я не буду заводить 5 констант только ради того чтобы передать их в метод и были имена.
к тому же методы пишешь НЕ ТЫ
ты их ТОЛЬКО ВЫЗЫВАЕШЬ
и хотелки "а вот они должны принимать" можешь отправить разве что в спортлото
я лучше использую именованные параметры, которые использую разве что я, да и IDE с радостью их потрет при первой возможности
>ты вообще о чем? где ты в ВЫЗОВАХ методов прописываешь имена параметров?
мда...
x int = 100;
y int = 200;
SetPosition(x, y);
>(356, 80, 45, 90) вполне норма, если тебя не очень высокоуровневый код
Я прямо сейчас готов растерзать таких пидорасов, которые вот так и сделали и мне приходится тратить драгоценные часы, чтобы написать пути обхода. Пишу плагин для одной проги, у которой ширины окон железобетонно вбиты.
>про перечисления не в тему ибо перечисления это перечисления, а флаги это флаги и опциональные параметры - это опциональные парамтры
Охуенный аргумент:
— Ваша мать - шлюха
— Моя мать не в тему, потому что мать это мать, отец это отец, бабушка это бабушка.
>если метод принимает 5 bool
Это уже странно.
>то я не буду заводить 5 констант только ради того чтобы передать их в метод и были имена
Ясно.
>SetPosition(x, y);
Ну ты так написал, прямо постарался (хотя я не верю что ты так пишешь), скорее так
SetPosition(x: 100, y: 200);
а 1000 людей так на написали, потому что у них нет такого правила, а у языка нет средств для этого.
>Я прямо сейчас готов растерзать таких пидорасов, которые вот так и сделали
как видишь, ТАК ДЕЛАЮТ и ты вынужден это читать
(то что это захардкожено и создает тебе проблем - это уже проблемы другого плана и к теме отношения не имеют. ты до сих пор путаешь захардкоженность и читаемость)
>Охуенный аргумент:
нормальный аргумент. не все впихивается в перечисления. только флаги. и даже если и можно впихнуть - ну ты впихнул, другие нет - имеют право и это абсолютно нормальный код
>>412660
>Это уже странно.
абсолютно нормально. код начинает пахнуть если больше 5 параметров, а уж про типы ничего не говорит - тут как получится
>Ну ты так написал, прямо постарался
Я так и пишу, потому что так или иначе к моменту использования
нашей условной функции SetPosition, у меня уже сформируются определенный набор переменных — либо они приходят из аргументов, либо появляются по ходу. Это не я себя заставляю, так получается естественным образом. И чтобы я на самом старте юзал SetPosition(x: 100, y: 200), это один случай на миллион. Это может подходить только к примитивным структурам типа поинта или ректенгла, да и то не всегда.
>как видишь, ТАК ДЕЛАЮТ и ты вынужден это читать
Такие пидорасы должны страдать, и судя по тому что Pixolodgic продала свою жопу Maxon, а перед этим мучались в гиене собственного кода, думаю наказание было исчерпывающим. Таких ни джаваскрипт, ни питон не исправит.
>не все впихивается в перечисления
Не все перечисления впихиваются в перечисления? Я написал два способа передачи: перечисления и через переменную. Случай с SetPosition(x, y); — это и есть второй вариант. Напрямую значение никто не передает.
>код начинает пахнуть если больше 5 параметров
Естественно, но опять же, у тебя естественным образом должны сформироваться переменные к моменту передачи аргументов в функцию. Если это не так, то стоит задуматься, а насколько адаптивен твой код. Ты вот критикуешь сишарп, но ты даже сам не осознаешь проблему, которую ты себе создал питоном.
А нахуя они это делают, флуент билдер еще не изобрели?
Ему видите-ли лень писать билдер и хочется здесь и сейчас, а еще ему лень объявлять переменные, поэтому в функцию он передает прямо числа. Там терминальная стадия говнокодинга.
И вот казалось бы, если будет такой волшебный язык, который будет потакать всем его желаниям, то что он получит в итоге? Топорную программу, модули которой не работают сообща.
>SetPosition(x: 100, y: 200), это один случай на миллион
именно. обычно так никто не пишет, потому что IDE этому сопротивляется. обычно пишут
SetPosition(100, 200, false, true)
ты можешь сколько угодно разглагольствовать "а вот я", но я могу открыть рэндомную репку на гитхабе и найти где в функцию прямо передается true/false
И в итоге ты читаешь чужой код а там сплошное SetPosition(100, 200, false, true) и это не является захардкоженым, а деталями реализации. Все так "захардкоженность" подразумевает то потенциальное желание заменить, а это совершенно другое.
>Такие пидорасы должны страдать
но страдают не они. страдаешь ТЫ. они пишут - им норм, а заставить писать иначе ты не можешь, да и не хочешь.
> Я написал два способа передачи: перечисления и через переменную. Случай с SetPosition(x, y); — это и есть второй вариант
тогда я вообще не знаю о чем ты. покажи мне вызов ЧУЖОГО метода по своему по умному
>у тебя естественным образом должны сформироваться переменные к моменту передачи аргументов в функцию
софтистика какая то. какие то проблемы уже питон создает
я ВСЕГО ЛИШЬ ПРОШУ писать читаемо и все. И питон на уровне языка дает возможность ЗАПРЕТИТЬ писать вызов функции.
Ты сам жалуешься, что другие написали непонятно, но при этом запрещаешь им запретить писать непонятно
ты должен регать каждую имплементацию
<IPizda, Pizda>
<IPizda, BritayaPizda>
<IPizda, NebritayaPizda>
в итоге при резолве одного будет хз какой, а при резовле IEnumerable<IPizda> получишь список
вот так же с IHostedService происходит - там же куча имплементаций
но вообще все зависит от конкретного IoC. я говорю про мелких
вернее при резолве одного должен быть последний, что очень годно, но это "должен быть", а на деле хз что в реальности в разных IoC контейнерах
> и они мне нужны одновременно
возможность указать зависимости по условию поддерживает не каждая либа
Если у тебя реализация интерфейса и ты делаешь вторую и тебе не нужен список, а просто хочешь ОДНОМУ классу подсунуть свою реализацию,а другим дефолтную и у тебя либа от мелких - то у тебя проблемы
так что ...не нужны они тебе одновременно.
Между двумя приложениями. Я знаю про MemoryMapping, но мне надо передать массив стрингов.
Если даже ии может писать нормальный код, получается, язык идеальный
Для кого он будет писать код через 5 лет когда через год дебилы на людях забросают друг друга ядеркой?
>так что ...не нужны они тебе одновременно.
А как же всякие стандартные случаи, когда например есть интерфейс IEmployee и его дефолтные имплементации типа: Stuff, Clerks, Managers и так далее? Для каждого такого класса делать отдельный интерфейс и наследовать его от IEmployee?
Когда это произойдет, то твоя обрыганная джава уж тем более нахуй никому не нужна будет, клован.
У тебя не должно быть моментов где тебе нужно регистрировать несколько имплементаций. Регистрируешь ты только сервисы, никаких нахуй `IEmpoyee` и прочую хуйню.
Покажи код, что ты регаешь? DI облегчает жизнь только для сложных сервисов зависящих от других сервисов, доменную логику (например класс который чистит папки) зачастую не регают. Регистрируют только сервисы уровня приложения (application services). Сервисы уровня приложения вызывают уже конкретные методы доменной логики
>И питон на уровне языка дает возможность ЗАПРЕТИТЬ писать вызов функции
А чем тебе C# мешает добавить private?
Ну обычно IoC мыслит более фундаментальными вещами. стринги же не регистрируешь. IEmployee все таки не сервис и делать ему в контейнере нечего
Но вообще да, не хватает такой фичи у мелких. Как и в декораторы не умеет нормальные (скрутор это костыль)
ты просто проустил тему, а я там похерил часть предложения воюя с формой (дебильная кнопка стикеров падла)
речь шла про запрет писать
foreach ... in Product(true, false, false, true, true)
чем грешат все, кому не лень, а не лень многим и то, что в теме есть один святоша - проблему не решает
а иметь возможность на уровне языка заставить писать так
foreach ... in Product(true, false, false, simplify: true, reverse: true)
что добавляет читаемости
передавать в конструктор явно. как и другие объекты, что не являются сервисами.
>А как тогда быть с зависимостями типа IEmployee?
Покажи код, все что не сервисы - передаётся руками.
>Я пока консольки только пишу, написанное тобой для меня - мунспик.
Та дропай нахуй, чем сложнее ебатория тем лучше разберешься, тем более судя по всему ты не особо понимаешь что такое эти сервисы. Захуяч какой-нибудь интернет магазин на WPF, сделай всё по канону DDD. Стековерфлоу и двач тебе если надо всё объяснит если будут проблемы.
> Я пока консольки только пишу, написанное тобой для меня - мунспик.
Да просто DI нужен только чтобы самые высокоуровневые системы связать, для всякой мелочи нинужон
мне для каждой пары параметров билдер делать?
>>интернет магазин
>>WPF
Да, согласен. Под конец рабочего дня совсем расплавило мозг. Да на самом деле похуй на чем и где практиковать, везде юзается один подход но конечное говно доходит до заказчика в виде десктоп говна либо в виде сайтика, меняется тока вьюшка.
А насколько мне в будущей работе вообще нужно будет уметь писать какие-то сложные консольные приложения? Спрашиваю не только про уровень джуна, но и дальше.
Почему бы не сделать десктоп приложение для интернет магазина? Охуенная же идея, почему никто еще до такого не додумался? Можно включить автозапуск при старте системы и пихать рекламу в уведомления.
Хотя бы потому, что поисковики не смогут такое проиндексировать, только ссылку на сайт для скачивания клиента. Ну а клиент ставить мало кто захочет, быстрее в другом магазине купить.
Шанс близок к 0. Мне пригодилось консолька 1 раз когда надо было сделать мини-команды по дрочке видео-файлов с помощью fmpeg, но там настолько всё просто что ваще пиздец. олсо юзал чью-то либу под названием CliFx, так что если нужно будет дрочиться с команд-лайн задачкой то вот те в помощь полезная либа. Так же есть от майкрософтов CommandLineApplication, но она конченая и неудобная.
Просто пиздец у меня писька встала, когда сравнил легаси штуку со своей и внезапно оказалось - что мой код работает в 1000 раз быстрее. ТЫСЯЧА, блядь. 10 единовременных активных сессий коммуникации, против 10к. Сука. А сверху - на эти 10 сессий - старое добро жрет 4 гига оперативы, у меня на 10к - гиг. Блядь. Я просто охуеваю с себя. Как же я хорош. Мог бы дотянуться до хуя - сам себе бы отсосал.
Никак, ибо на крестах ты смог бы добиться икса примерно в 1кк раз. Тебе ещё расти и расти.
Та были бы менеджеры не так запуганы крестами - я бы на крестах и писал. Кек. Другое дело, что на шарпе я реализацию свою сделал за 2 месяца, а думаю с крестами бы пришлось ебаться не меньше полугода.
>я реализацию свою сделал за 2 месяца, а думаю с крестами бы пришлось ебаться не меньше полугода
Ты там целый сервис переписывал что ли?
А что коммуницирует?
Любой. Главное сделай его максимально хорошо. В идеале - это должен быть проект который можно было бы взять и начать продавать.
Ну, давай с простого. Ты можешь сделать калькулятор. Так вот. Если ты делаешь его на отъебись(в винформах накида кнопок, на каждую повесил обработчик и типа ЗБС)))) - никто не похвалит тебя и брать на работу будут только в случае, если острый дефицит кадров. А можешь сделать - заебок, чтобы и дизайн эргономичный, и код был: ВАХ, КРАСЫВА, и фичей напихать которых часто не хватает(допустим - для программисткого калькулятора часто не хватает фичи с отображением как текст, ну пиздец бесит, мне приходится лезть в гугол и смотреть, либо открывать таблицу ASCII, вот хули никто не сделает?) И при этом сделаешь это быстро(нахуй перфекционистов и прочих мутителей воды в команде, нужен здравый смысл, когда мы понимаем, что нужно сделать фичу и сделать ее нормально, а не уходим в какие-то пространные достижения идеала хуй пойми в чем) Ну и т.д.
Суть я думаю ты уловил. Чтобы тебя без реального опыта хотели с руками оторвать - нужно чтобы было видно, что ты не на отъебись и только то что тебе интересно делаешь, а как раз - способен сесть и сделать хорошо, но при этом за разумные сроки.
Да ну какой калькулятор лол, я же не пусси совсем, 2 года суммарно в вебе отпахал, но на жсе. Мне нужен вариант который я за несколько вечеров на связке Рякт+С#+pg/монга/кассандра ебану, задеплою и у меня и всё что я до этого выучил по шарпу устаканится и нихуёвый такой плюсик мол вот я крутой, могу весь проект в соло тащить.
Ну, тогда пили совместное редактирование документов, с разграничением прав, версионированием, чатиком и возможностью отобразить битовую строку как текст.
Это 3 недели ленивой работы для одного человека. Для пета - самое то. Разве что битовую строку как текст - может занять много времени, не зря же ее никто не хочет внедрять.
Я и говорю - дохуя. Я готов выделить не более 5 дней на работу.
Там в одном месте foreach по string.Reverce()
По приколу заменил на for с перебором индексов от n-1 до 0 и вытаскивание чара
Результаты по времени и памяти 95%+
Ебать я охуел с этого
Да. Делаешь структуру-итератор которая ходит в обратном порядке
А почему тогда если я пишу перебор циклом, решарпер мне пишет "это хуйня, давай я на форич переделаю"?
Да, спасибо что поправил. На сколько мне известно, контекст синхронизации сейчас по сути объявлен только в десктопе, но там ты полюбас вернешься в UI поток. Ещё он раньше был объявлен в старых версиях ASP .NET MVC, но его полностью выпилили из ASP .NET Core
1. Вообще похуй. Начни с MSDI. В ASP .NET Core там один хуй будет фасад поверх контейнера. Разница будет заключаться только лишь в деталях конфигурации.
2. Какую-то хуйню ты видел. Вот этот чувак например реализовал более менее норм DI.
https://www.youtube.com/watch?v=dCkYP03lXOs
ну. во первых, он не самый умный и мне бывало переписывал в нерабочую конструкцию
Во-вторых, он может видеть что у тебя List, а не Ienumerable и можно без проблем шагать от от обратного надеясь на оптимизации
но скорее первое
>почему
В душе не ебу, я не пользуюсь решарпером.
Ну и опять же мой поинт был в том, что цикл foreach предназначен для перебора 'всех элементов коллекции', но он не предназначен для перебора элементов 'в определенном порядке'. Основное его назначение взять каждый элемент коллекции и выполнить тело цикла.
Ты не можешь контролировать порядок из самого цикла, т.к. это полностью на стороне перебираемой коллекции. В цикле For можешь (если есть индексатор), в foreach нет.
Возможно у тебя в решарпере стоит настройка, что он видит, что твой способ перебора в for кладет хер на порядок и предлагает переделать на вариант с foreach
Вероятно суть в том, что энумерация строки гарантированно идёт 0 -> n-1
> foreach в принципе не предназначен для вытаскивания чего-либо в определенном порядке.
Предназначен, лол, ты чо рофлишь?
Он перебирает в таком порядке, какой IEnumerable даст
Ну как бы в первом случае ты используешь LINQ метод Reverse(this IEnumerable<T>). А он в силу универсальности медленный. У тебя там как минимум одно доп выделение памяти для промежуточного буфера происходит, с копированием строки в него. А скорее всего несколько, так как String не реализует ICollection<T>, а значит нет возможности пойти по быстрому пути и выделить массив памяти нужного размера сразу, а значит он будет пересоздаваться несколько раз, конечно же с копированием из старого в новый. А без материализации в промежуточный буфер нельзя, вдруг ты туда не строку фиксированной длины передавал, а вообще какой-нибудь генератор. Плюс у тебя ещё два енумератора в куче создастся. За тем, чтобы понять какого хуя происходит следует сходить сюда: https://github.com/microsoft/referencesource/blob/master/System.Core/System/Linq/Enumerable.cs
Во втором же случае у тебя просто доступ к элементам массива по индексу, без всяких там выделений памяти, копирований и прочего.
Перезапусти ещё несколько раз, там всегда разные результаты будут. На эффективность надо дрочить только на С++.
Вообще надо исходники посмотреть, во что там этот реверс оборачивается
Я надеялся что у спана есть реверс, но нет. Получается для таких приколов надо самому писать экстеншен.
>На эффективность надо дрочить только на С++
Потому что даже самому нишёвому стартапу похуй, будет ли запрос на ручку обрабатываться 5 секунд или 500 мс
Попробуй сделать так foreach (var s in string.ToCharArray().Reverse())
Допустим на второй вопрос ты ответил. Что по первому?
Во-вторых, указав in, вы объявляете о намерении передать аргумент по ссылке. Аргумент, используемый с in, должен представлять расположение, на которое можно сослаться напрямую. Такие же общие правила применяются к аргументам out и ref: вы не можете использовать константы, обычные свойства или другие выражения, возвращающие значения. В противном случае пропуск in в месте вызова сообщает компилятору, что вы разрешите ему создать временную переменную для передачи с помощью ссылки на метод, доступной только для чтения. Компилятор создает временную переменную, чтобы преодолеть некоторые ограничения для аргументов....
Во всём прав. out еще можно понять и это норм, но in - максимально бесполезная хуета.
Почему бесполезная? Дает понять, что переменная передается по ссылке но не модифицируется.
что не так с памятью?
> кладёт свои 14 см на память
Почему ты на C++ не пишешь? То же самое получится, да ещё и быстрее.
>Именно из-за этого карта лояльности в пятёрочке применяется секунд 10
Джвачаю. Очко горит с этих ебаных кодеров на питонах которые приложение банков пишут которые кэширует 500 мб в неделю
380x286, 0:27
>А в Тбилиси есть кассы самообслуживания?
Обосрался, ебать ты попустил этого любителя забить хуй на оптимизацию для которого нет разницы в 500 мс и 5 сек
Хз, я Грузию видел только в фильме Кавказская пленница.
да есть. что не так с памятью без in и суперски с in?
Блять, да хули вы тупые то такие.
Еще раз. Используя foreach ты никак не можешь повлиять на порядок обработки элементов внутри самого цикла. Порядком заведует исключительно сама коллекция. Т.е. тебе сначала нужно произвести манипуляции с ней, задав порядок выдачи элементов енумератором и потом уже пихать ее в foreach.
В то время как в for ты именно, что сам определяешь этот порядок, без дополнительных манипуляций с самой коллекцией.
Коллекция это коллекция. Она просто хранит.
Порядком обхода ведает итератор. Это отдельная сущность. Конечно коллекция имеет дефолтный итератор.
но coll.Reverse() выдает свой итератор ReverseIterator<TSource>
Вот только ReverseIterator<TSource> хоть и реверсит, но делает это тупо материализацией во временный буфер с очевидным перераходом памяти на ровном месте.
Че ты несёшь
> Используя foreach ты никак не можешь повлиять на порядок обработки элементов внутри самого цикла.
Они идут ровно в том порядке, в каком их выдаёт енумератор
> Порядком заведует исключительно сама коллекция.
Да.
> Т.е. тебе сначала нужно произвести манипуляции с ней, задав порядок выдачи элементов енумератором и потом уже пихать ее в foreach
Ты же только что выше сказал, что порчдком заведвет сама коллекция(енумератор, который она выдаёт, в случае листа он обходит элементы с первого по последний)
Да, напрягает эта хуйня порой. Но чисто по технической части контент заебатый.
Пока что я нашел:
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 что файл не найден. Да, я глобальные пути поменял.
Еще варианты?
>Сап шарп, может кто знает как програмно шарп кодом сгенерить self-extracted .exe
Гуглишь консольные команды для этого говна и делаешь утилиту которая запускается где-нибудь в фоновом режиме. Только сделай условие на текущее ОС, команды могут быть разными.
В теории тебе может пригодиться что угодно когда угодно. На практике - всё индивидуально.
К примеру для оптимизации. В реализации многих linq-методов есть попытка апкастнуть IEnumerable к ICollection или IList, так как многие операции можно в таком случае выполнить эффективней (к примеру, при вызове ToArray можно сразу выделить массив нужного размера под все элементы).
Ну, допустим тебе досталась сторонняя библиотека с оч странной архитектурой.
Возвращается предок. Но у наследника есть нужный тебе метод, которого нет в родителе и он тебе нужен здесь. Ты точно знаешь что вернулся экземпляр наследника. Ты берешь и апкастишь.
Ну и в таком духе штуки.
Короче, это примеры реальных кейсов. Можно плеваться, что архитектура плохая и все такое, но ты не весь код на планете пишешь, и тебе никто не даст миллион лет делать адаптеры-хуяптеры и прочее, иногда нужно просто взять и сделать вчера.
Ну это уже когда даже гей-порно не вставляет.
Ну а если без шуток то вопрос не имеет смысла
если это только винда, то выбор из Qt или WPF очевиден - WPF (как родной) лучше всяких стороннних приблуд. И даже если не нужна мощь "рисуем впуклые круглые кнопки", то можно взять финформс
А если кросс, то выбор из Qt или WPF очевиден - кто из них кросс
А что в нем стремного? Удобный каст. Разве что плюсовиков пугает.
"as T" тоже есть. Только работает как dynamic_cast в плюсах
Самое очевидное - рефлексия.
> Юзай оверлейные тулкиты, которые на винде выводят твои абстрактные окошки через ВПФ/ВинФормс, на линуксе через КТ/ГТК, на маке через маковское говно.
То есть Qt
Я пробовал вкатиться в кют, но к своему стыду не обнаружил нормальных, юзабельных врапперов в шарп. Ткни носом, анончик, какой враппер ты юзаешь?
Есть задача - реализовать этакий прототип хэш таблицы (возможно, используется метод цепочек)
На входе дается строка ключа навроде "farhncxs" и строка данных
Нужно создать многомерный вложенный список (в данном случае уровень вложенности 8), в котором каждая буква ключа будет является идентификатором вложенного списка, и так до последнего символа
В последнем списке будет пара ключ-строка данных
Собственно вопрос - как реализовать класс для этой таблицы
Пикча как пример, как это должно работать
Не бейте тапками, в C# только начал вкатываться
Есть.
Нет, для инди-поебени шарп можно учить на отъебись, запомнил базовый синтаксис и копай API юнити. Можно вооьще не учить, там есть какое-то no-code говно для юнити.
То есть я пройду Дударя без задней мысли, мне этого хватит сделать допустим бомжовый дарксоулс с аниме тянкой?
Кодить ты будешь 5 минут своего времени, все остальное это рисовать в блендере и накидывать анимации на скелет, а эта та еще ебатория. Большая часть времени уходит в модели, анимации, звуки, левел-дизайн и прочая залупня.
Хз дударь не учит как по мне, он лишь показывает базу, лучше пробуй ссылки в шапке там больше полезного.
А ну тебе еще обязательно надо базово знать тригонометрию, синус/косинус и вот это вот все + вектора и простую арифметику, математики применять будешь оч много.
Тогда да, попробовать можешь.
Я когда в геймдев ударился godot, то ахуел от того скок пришлось учить, потому что в школе не учил вообще ничего, даже не знал кто такой Эйлер и как находить синус.
мимо.
Текст: ;Голова.;19
Я точно знаю, что передаваемый в функцию текст на русском.
Онлайн декодер пишет, что это WINDOWS-1251.
Как это конвертнуть?
Я бы так дела. Может быть сверху какой-нибудь итератор бы намутил.
Ну, я их обычно и не использую. Говно без задач. Просто знакомый просил показать как их включать. А я так и не выключил.
as - быстрее
Все, нашел.
> чтобы допустим инди поебень как неон вайт сделать?
Ты неонвайт в одно омежье ебало не вывезешь. Погугли сколько там народу участвовало в девелопе.
>А ну тебе еще обязательно надо базово знать тригонометрию, синус/косинус и вот это вот все + вектора и простую арифметику, математики применять будешь оч много.
Ты забыл еще матрицы и комплексные числа (особенно если в 3Д лезть)
Да, геймдев. Разработка библиотек для самого шарпа. Можешь например добавить поддержку линукса, я тогда тебе лично буду 10% зп донатить.
Добавил поддержку линукса, можешь проверять https://wiki.archlinux.org/title/.NET
Кошелёк кидать?
Вот тут хз, с гуи не работал.
380x286, 0:27
>из него намеренно выпилили линукс.
Я когда это осознаю - у меня едет крыша. Вы же в курсе что там под копотом комплится в джаву просто потому что нет поддержки линукса, т.к андроид написан на базе ядра линукс?
> А мауи скомпилится и запустится тоже?
Нахуя тебе переобутый в полёте хамарин? Юзай кроссплатформенные тулкиты, которые на каждой из поддерживаемых систем разворачиваются в нативную графическую подсистему, например, в линуксе в ГТК, в шынде шын32, в макоси макошное говно.
Например, из таких тулкитов есть Eto.Forms.
Почему ты не выучишь кресты? Зная шарп и их ты станешь ультимативной прогерской машиной.
Шарп проще и приятнее крестов, даже современных.
> Почему ты не выучишь кресты?
Потому что у них омерзительные закорючки и звёздочки вместо человеческого синтаксиса. Я лучше потерплю лишние 500 тактов проца и лишние 300 Мб бинарника, чем полезу в это дерьмо. Нахуя ты крестовыблядок в шарпотред залез? Репортом по айпи уебать?
Не заводись ты так. Я одинаково хорошо пишу что на плюсах, что на шарпе, что на жсе с питоном.
480x360, 0:12
Конечно. Это по сути та самая ситуация когда чед просто подошел к твоей тян рыночку, агрессивно схватил за пизду, та потекла и пошла с ним ебаться..
Хуясе. Надо попробовать.
Нет, не работает без интернета, т.е, например, из внутренней корпоративной сети.
Да и вообще, сама идея иде с логином в аккаунт - порочна. Вот майкрософт там что-то заявлял об уходе из России. Ща возьмут и заблочат студию дистанционно. И чо теперь? Так что нет, надо искать альтернативы. В т.ч. на торрентах, хехе
Есть TcpClient.
И есть Networkstream TcpClient.GetStream()
И вот есть метод, где обрабатывается запрос и выдаётся ответ.
Теперь, вся эта хуйня вызывается в отдельном потоке Parametrized threadStart
Дальше, есть много клиентов.
На каждого клиента - по потоку.
Вот они подключаются, отправляют запросы... И внезапно, соединения закрываются блядь.
Второй запрос если отправляется, TcpClient.GetStream() снова вызывается и какая-то хуйня получается - соединение рвётся нахуй.
Кроче, что делать с этой хуйнёй?
Надо шоб соединения были открытыми, и активными, и чтобы они держались открытыми и не выёбывались мне.
Можно использовать префикс в названии метода (post/put/patch/delete), либо использовать атрибут HttPost, HttpPut и так далее.
Вот норм пример
https://www.pragimtech.com/blog/blazor/delete-in-asp.net-core-rest-api/
Грубо говоря, если я увожу мышь с модального окна на родительское, то событие MouseLeave не срабатывает. Но если я увожу в другое место, то событие срабатывает.
Как это убрать? Мне нужно закрыть окно, если пользователь кликает за его пределами.
Не используй открытие окна внутри родительского окна. Используй вот такой способ открытия и закрытия окон:
https://ru.stackoverflow.com/a/727774/422180
https://ru.stackoverflow.com/a/526028/422180
Тогда ты будешь работать с окном как отдельной сущностью не связанной с другим окном.
Ок, спасибо, посмотрю.
> 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.
Дальше идёт запрос-ответ, в поток этот и из него.
Как повторить эту хуйню, так, чтобы ещё один запрос отправить в поток, и ответ получить из него?
Какие-то ёбанные оффсеты надо задать штоле? Как и где их задать, блядь?
Постоянно рвётся соединение, сукка.
А новый клиент для каждого пука - создавать не резон, потому что куча соединений открывается, блядь, на разных портах.
Надо одно соединение и там уже данные гонять по нему, а не хуеву кучу соединений ебучих, от которых весь инет виснет нахуй.
ПАМАГИТИ.
> 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.
Дальше идёт запрос-ответ, в поток этот и из него.
Как повторить эту хуйню, так, чтобы ещё один запрос отправить в поток, и ответ получить из него?
Какие-то ёбанные оффсеты надо задать штоле? Как и где их задать, блядь?
Постоянно рвётся соединение, сукка.
А новый клиент для каждого пука - создавать не резон, потому что куча соединений открывается, блядь, на разных портах.
Надо одно соединение и там уже данные гонять по нему, а не хуеву кучу соединений ебучих, от которых весь инет виснет нахуй.
ПАМАГИТИ.
отличный формат.
хуй знает, ты скинул два куска, и че то интересное, видимо, происходит между ними. че значит рвётся, какую ошибку то он кидает? там разные бывают, знаешь
Ну, я просто, снова, продублировал код, где запрос и ответ
и вместо
>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, блеать?
Там, походу, во втором запросе, надо как-то хитрожопо, писать в конец потока, и читать из конца потока.
Короче, надо задать оффсет какой-то, смещение, в потоке,
или что-то наподобие этого. А как это сделать - хуй знает.
А то оно читает аж пока данные есть в потоке. А потом что-то происходит, наподобие EOS (End Of Stream), после чего stream.DataAvailable становится false и софтина выпиздячивает чтение данных из цикла.
А когда открываешь
>NetworkStream stream = client.GetStream();
оно по новой хуярит чтение - с начала потока...
И как эту хуйню зарулить - хз.
Можно ли как-то восстановить без переустановки? Хотя даже заново установить не даёт, пишет папка уже занята
Скрин с инета, у меня на ссд стоит остальное
причем тут вообщще MVVM до закрытия окна с помощью мыши?
Проблема автора вообще никак не лежит в плоскости MVVM
даже рядом не лежит, да и за 100 км тоже не валялась.
>>418029
так просто не делай окно модальным и всего делов. Любой клик на родительское окно все равно должен закрыть - ну так лови там превиев событие и если дочеренее открыто, то закрой его
А еще есть Mouse.Capture()
это позволяет ловить клики за пределами там чего то. Так закрываются попапы (например комбобоксы или меню) если кликнуть куда то еще.
Не могу сказать как это работает если больше одного окна
В общем то Mouse.Capture работает, но если тебе не нужно отличать куда кликнули - на родитеьскую форму, на десктоп, на титлбар модального окна
иначе тебе придется вычислять куда был клик, что геморно
Да еще всякие там textbox любят срывать capture
потому подход с немодальным окном проще
Чел, у тебя херня мутная пиздец. Ты кидаешь кусок, как ты читаешь, но я не вижу, где ты отправляешь ещё раз запрос туда. Ну и чтения со стороны сервера тоже нет. Ошибку ты не написал, то есть непонятно, кто мудачит. Короче, земля тебе пухом.
> Да мне нужно модальное, чтобы ожидать закрытия
Да, делается через await немодальное окно. Это нормально.
Я так делал когда у меня несколько немодальных форм и если одна из них откроет диалог, то остальное лочит нахер. Поэтому все через await и Preview события на "заблокированных" окнах
все равно держи для примера наивную реализацию на коленке просто для понимания какое оно все го....WPF то есть
https://pastebin.com/UsEPGmg3
использовать в диалоговом окне
<Window
local:OutsideCloser.Close="True"
небольшое улучшение что клик был по родительскому окну, а не абы где
https://pastebin.com/Btmxd3ad
но все еще остается вопрос клика по титлбару модального окна
(это конечно если он используется)
>>418501
О, спасибо. Я сделал через бесконечный цикл и событие деактивейта.
https://pastebin.com/PQ3rqdz4
Мне надо было что-то вроде контекстного или попап меню — для закрытия достаточно, чтобы фокус слетел.
Какча не валидна
непонятно зачем вечный цикл.
Если у тебя Task нужен, то конвертишь событие Closed в Task (с помощью TaskCompletionSource) и все.
Ух ты, что-то подобное я искал.
Только не понял что значит конвертировать. Я Ж
1. создал новый экземпляр TaskCompletionSource
2. в переопределенной функции ShowDialog поставил его на Await
3. в событии Closing использовал TrySetResult.
>непонятно зачем вечный цикл.
а разве внутри TaskCompletionSource не сидит какой нибудь цикл или таймер? Как оно там бесконечно ожидает события?
>Только не понял что значит конвертировать
Любое асинхронное что угодно можно выразить в Task. В этом и есть смысл Task, как реализации корутин - чтобы была унифицированная работа с любой асинхронщиной.
>а разве внутри TaskCompletionSource не сидит какой нибудь цикл или таймер?
нет. это такой же объект как и CancellationTokenSource. Очень простая штука. По просьбе он просто выставляет значение у таски, как CancellationTokenSource у CancellationToken
А смысл существования CancellationTokenSource и TaskCompletionSource - чтобы получатель Task или CancellationToken не могли их изменять.
Точно так же с LifetimeDefinition и Lifetime - спец объект холдер для изменения токена.
>Как оно там бесконечно ожидает события?
никто никого не ожидает. У Task есть ContinueWith (вернее для внутренних нужд там более лекговесный интерфейс, но суть та же), то есть по факту подписка на изменение состояния.
Понимаешь же как работает event в шарпе - никакой разницы нет.
ты не мыслишь асинхронно.
Асинхронно - когда ты дома ждешь посылку, то не бегаешь к окну выглядывать курьера, а он сам тебе позвонит когда приедет.
Так и в тасках - ВСЕ просто подписываются на изменение состояния интересующей их таски (на звонок курьера) и по "звонку" планируют продолжение "позвонил, значит теперь можно делать это". Все эти продолжения планируются с помощью TaskScheduler (дефолтный планирует на тредпуле) на выполнение и потом перемалываются тем, кем запланировано выполнять.
await же просто сахар, где компилятор за тебя пишет многочисленные ContinueWith (на деле конечно не их,а другую более эффективную структуру, но смысл одинаковый)
>Асинхронно - когда ты дома ждешь посылку, то не бегаешь к окну выглядывать курьера, а он сам тебе позвонит когда приедет.
Ну аналогии всегда понятны, но непонятно как это работает в коде.
Почему же если сделать пустую асинхронную функцию, то она просто выполнит себя и завершится? Для этого она должна что-то ожидать, но мы снова плодим очередную асинхронную функцию, внутри которой пустота и которая так же быстро завершится, если внутри нет цикла.
Правильно ли я понял, что запускается задача, смотрит на условный флаг, если он отрицательный, то программа идет дальше, перешагивая через все, что идет после await? И при каждой итерации будет заглядывать в функцию, прыгать "аля GоTo" в задачу и снова перешагивать код, пока в это задаче не будет положительного флага?
>Понимаешь же как работает event в шарпе - никакой разницы нет.
Я это понимаю так, что какая-то функция вызывает событие, которое проходит по списку подписок, которые являются ссылками на функции. Тут мне понятен механизм без циклов. Функция события просто запускает функции по ссылкам и подписчикам не нужен цикл для мониторинга.
Кстати да. Как-то ещё в дельфийские времена читал критику принципа модальности. Типа, если софт слишком сложный, он может выкинуть больше одного модального окна за раз и самозалочиться.
ты как то сложно выразился
но в общем - нет никакого цикла для мониторинга.
Нет никаких условных флагов
попробую упростить на котиках
синхронный метод
void Foo(){
MakingTea()
WaitForCat()
PetTheCat()
WaitForDog()
PetTheDog()
}
пока мы внутри чего то ждем, то поток зря блокируем.
Поэтому очевидная мысль - а пусть пока он ждет то не будет блокировать поток.
Я пропущу шаг с калбэками, потому что это сразу вырождается в калбэк в калбэке в калбэке в калбэке
И сразу перейду к продолжениям (корутинам)
псевдокот:
void Foo(){
MakingTea()
WaitForCat().Then(PetTheCat()).Then(WaitForDog()).Then(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 - сахар, что заставляет компилятор написать все продолжения за нас.
void Foo(){
MakingTea()
await WaitForCat()
PetTheCat()
await WaitForDog()
PetTheDog()
}
MakingTea() выполняется в вызывающем потоке, поскольку он еще не дошел до точки "я ушел в ожидание и вот вам продолжение, выполните его когда нужно"
>сделать пустую асинхронную функцию,
пустая асинхронная фукнция является синхронной, потому что нигде в ней нет точек, где "я тут в ожидании и мне поток не нужен"
async это маркер, что в коде будут await и потому нужно строить стейт машину с продолжениями. Но если await нет, то и продолжений нет и все выполнится синхронно
ты как то сложно выразился
но в общем - нет никакого цикла для мониторинга.
Нет никаких условных флагов
попробую упростить на котиках
синхронный метод
void Foo(){
MakingTea()
WaitForCat()
PetTheCat()
WaitForDog()
PetTheDog()
}
пока мы внутри чего то ждем, то поток зря блокируем.
Поэтому очевидная мысль - а пусть пока он ждет то не будет блокировать поток.
Я пропущу шаг с калбэками, потому что это сразу вырождается в калбэк в калбэке в калбэке в калбэке
И сразу перейду к продолжениям (корутинам)
псевдокот:
void Foo(){
MakingTea()
WaitForCat().Then(PetTheCat()).Then(WaitForDog()).Then(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 - сахар, что заставляет компилятор написать все продолжения за нас.
void Foo(){
MakingTea()
await WaitForCat()
PetTheCat()
await WaitForDog()
PetTheDog()
}
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.
Cудя по https://stackoverflow.com/questions/23752783/httpwebrequest-keepalive-vs-servicepoint-settcpkeepalive
Это для HttpWebRequest
Глядя на это https://darchuk.net/2019/01/04/c-setting-socket-keep-alive/
прописал это
>TcpClient client = new TcpClient();
>client.Client.SetSocketOption(SocketOptionLevel.Socket, SocketOptionName.KeepAlive, true);
Но второй запрос всё-равно чё-то не пашет.
>>418410
Чувак, я же скинул всю инфу.
>Ты кидаешь кусок, как ты читаешь, но я не вижу, где ты отправляешь ещё раз запрос туда.
>>418092
>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 или оффсет какй-то блядь задать, походу, чтобы оно нормально читалось этот ебучий запрос.
Cудя по https://stackoverflow.com/questions/23752783/httpwebrequest-keepalive-vs-servicepoint-settcpkeepalive
Это для HttpWebRequest
Глядя на это https://darchuk.net/2019/01/04/c-setting-socket-keep-alive/
прописал это
>TcpClient client = new TcpClient();
>client.Client.SetSocketOption(SocketOptionLevel.Socket, SocketOptionName.KeepAlive, true);
Но второй запрос всё-равно чё-то не пашет.
>>418410
Чувак, я же скинул всю инфу.
>Ты кидаешь кусок, как ты читаешь, но я не вижу, где ты отправляешь ещё раз запрос туда.
>>418092
>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 или оффсет какй-то блядь задать, походу, чтобы оно нормально читалось этот ебучий запрос.
Это Unity3D. Там своя архитектура, свой подход к написанию кода. Там даже у базового объекта Object переопределены операторы сравнения, чтобы сравнение с null сделать иначе (из-за этого многие начинающие попадаются на трудноуловимые баги)
Кстати вот это синхронное выполнение до первого 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+=
подписка есть подписка и можно легко подвесить приличный граф в памяти.
вот и на моем пике >>418705 TaskCompletionSource захватывает child. Это не страшно, поскольку просто создает кольцевую ссылку, но лучше все таки так не захватывать.
Кстати вот это синхронное выполнение до первого 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+=
подписка есть подписка и можно легко подвесить приличный граф в памяти.
вот и на моем пике >>418705 TaskCompletionSource захватывает child. Это не страшно, поскольку просто создает кольцевую ссылку, но лучше все таки так не захватывать.
понятно, что надо использовать райдер, но на работе мы используем VS
https://www.smarly.net/dependency-injection-in-net/di-containers/unity/managing-lifetime
Возможно это то, что тебе надо. Я не поверю, что в 2022 году Unity не поддерживает DI
Спасибо, я сохранил весть текст. На ходу переварить сложно, пкоа не упрешься в пробелму.
Как на кестреле(!) завести 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 т
к. у меня мелкохуита и он по бенчмаркам а тырнете на порядок тормознутее простого кестрела без прокси оберток.
1) Чувак, ты попутал.
Есть юнити как игровой движок Unity
А есть DI контейнер с таким же именем - Unity.
Это две совершенно разные вещи и у них только имя одинаковое.
2) И, кстати, этот контейнер считается устаревшим и использовать его не стоит.
Сейчас актуальны только два: родной майкросовтовский и Autofac. Про все остальное можно уже забыть.
3) В юнити (движке), вроде как народ применяет DI, но то ли там что-то специфическое, то ли народ просто свои велосипеды пишет. Как-то так.
Вот это расширение попробуй:
https://github.com/drewnoakes/vs-side-scroller
У меня оно на 22-ю нормально ставится и работает.
> Там даже у базового объекта Object переопределены
Object и object это разные классы.
> Там своя архитектура, свой подход к написанию кода.
Нет там ничего такого.
Там просто есть инфраструктура для реализации паттерна компонентов, в основе которой лежат классы наследуемые от MonoBehaviour, и которые ты ещё и можешь вешать на объекты на сцене, а как ты будешь этим пользоваться - дело твоё. Можешь любую архитектуру вертеть, главное чтобы тебе удобно было с ней работать.
Ты можешь игру написать ваще как угодно, в обход апдейтов и всех "нормальных" подходов, а монобехи использовать только для вывода графики. И это не то что-бы что-то плохое - MVC вполне применяют.
Есть даже несколько ассетов для ентити компонент систем(в том числе от юнити), которые тоже подразумевают ваще странную архитектуру, которая очень костыльно вписывается в юнити(но, почему бы и нет)
>>419568
> В юнити (движке), вроде как народ применяет DI, но то ли там что-то специфическое, то ли народ просто свои велосипеды пишет. Как-то так.
Там Zenject(Extenject) юзают. Но можешь чё угожно юзать, это не принципиально, в зенжекте просто много полезного есть, что сразу работает с компонентами и объектами юнити.
>>418804
У тебя че там так много сервисов будет, чтобы такую залупу надо было городить?
Зенжект юзай тогда просто
Еще не могу понят почему на считывающей стороне при первом запуске ругается, что файл с таким именем не найден, но при последюущих обращениях все норм. Причем даже когда я перезапускаю программу или ПК, больше этой ошибки не возникает.
Но ведь MemoryMappingFile не может оставаться после закрытия программы, да?
>Object и object это разные классы.
будни сишарпа. Никогда не понимал, зачем плодить сущности, различающиеся только размером буквы. Хорошо, что в бейсике нет чувствительности к регистру и это не плодит мудаков.
Этож надо сидеть с линейкой и определять отклонение дуги O на несколько пикселей, чтобы понять что тебе высирает интелсенс. Больные люди.
> У тебя че там так много сервисов будет, чтобы такую залупу надо было городить?
Проблема не столько в DI контейнере(его достаточно просто реализовать), а в переключении режимов. У меня, как и в вебе, есть три режима запуска игры: Productuion, Staging и Development. В первых двух меняются только ключи доступа к многочисленным внешним сервисам (бекенд, мультиплеер, аналитика, пуш-нотификации, реклама). В третьем используются фейковые сервисы.
Игра мобильная, но тестирую я её как на мобилках, так и на ПК. А значит мне под Mobile и Standalone уже нужен немного иной набор сервисов (MobileAccountService и StandaloneAccountService; MobileInputSystem и StandaloneInputSystem; DebugAnalyticsService на пк, а на мобилках - реальная аналитика). Из этого получается, что мне нужно 6 конфигов для запуска.
В игре много сторонних фреймворков, которые скрываются за моими сервисами. Мне хочется иметь возможно быстро подменять real сервисы на fake сервисы. Но у fake сервисов есть свои конфиги (фейковые данные, имитирующие бекенд например). Вот думаю, как хранить все эти наборы конфигов и сервисов так, чтобы между ними легко было переключаться, и чтобы в них легко можно было вносить изменения.
Хочу сделать общий набор конфигов (там же будет общий debug-конфиг для всех debug-сервисов и он будет доступен в продакшене, если вдруг мне нужно будет заменить временно реальный сервис на фейк в продакшене для отлова бага или на время разработки). И общий набор сервисов. И потом подключать их в главном конфиге.
Для standalone не буду с нуля заполнять все данные. Воспользуюсь методом AddOrReplaceComponentFromNewPrefab, чтобы заменить тот же MobileAccountService на StandaloneAccountService.
> будни сишарпа. Никогда не понимал, зачем плодить сущности, различающиеся только размером буквы.
Нет, Object это класс созданный для вполнк конкретной цели, он не буквой отличается.
В юнити есть своя система сериализации, через неё работает весь контент в проекте. Для того чтобы ты мог просто взять и перетащить материал на модельку на сцене - материал должен быть Objectом и все объекты на сцене Objectы, у них там есть инстанс айди через которые оно всё работает... Название путающее, но этот класс необхожим.
При этом само собой, ты можешь делать классы, которые НЕ Object, никаких проблем.
Блять, я даже половины из вышеописанного не понял. Как же мне сделоть свою игру? Эхх... Придётся программиста нанимать. Пойдёшь в мою студию? Зарплата - банка тушёнки.
>Нет, Object это класс созданный для вполнк конкретной цели, он не буквой отличается.
Я понимаю, сам писал плагины для графических программ и всегда хочется назвать какой-то элемент объектом, что вводит в диссонанс с логикой .NET
Но я имел ввиду зачем назначать одинаковые имена классам, которые визуально отличаются малой и большой буквой? Ну назви ты UObject или SceneObject.
Даже если я делаю локальное поле, то я обязательно пишу впереди прочерк _object, поэтому даже в самый жаркий день если мне голову напечет, я случайно не перепутаю переменные.
>Название путающее
Вот и я о чем. Разрабы пошли против шерсти. Если бы это был бейсик, то их дезориентирующая деятельность не прокатила бы.
Благо они переносят весь движок на ECS, который лишён всех нынешних легаси-проблем Юнити.
> Как же мне сделоть свою игру?
В какой-нибудь инди-игрушке на ПК всё это дерьмо не потребуется. А вот если ты делаешь сетевую сервисную игру на мобилки, то готовься к Аду.
ECS - это всего-лишь архитектурный паттерн. Сам по себе он не решает проблем архитектуры самой юнити.
>это вопрос сродни "а скажите колеса еще используются в машинах"?
Я ж не знаю что там в продакшне происходит. И видел еще видео какого-то сеньора, который пояснял, что лучше юзать MediatR для этих дел.
1 на асп.нет продакшен не заканчивается.
2 и даже если асп.нет и даже если прямо прямо последнее, то насчет MediatR - его личное мнение. У MediatR есть сторонники и противники - и их больше чем сторонников. (такая же ситуация как и с DDD)
Я х.з. что ты за тесты на шарпе пишешь.
Но если это действительно какие-то автотесты, то имхо ты страдаешь хуйней, т.к. для этого есть более удобные инструменты чем шарп и то, что ты на нем напишешь.
Если же ты имеешь в виду юнит тесты. То там наоборот - чем проще и тупее тем лучше. Т.к. вся суть юнит теста - быть простым, проверять какой-то необходимый минимум функционала за раз и быть легко отлаживаемым.
Если же ты начнешь на них наворачивать какие-либо паттерны и усложнять, то заебешься потом искать где у тебя косяк в коде или самих тестах.
public override bool Equals(A other){
//...
return this.Foo == other.Foo || this.Bar == other.Bar
Как для такого равенства сгенерировать хэш?
> лучше юзать MediatR для этих дел
У меня вообще такое ощущения, что properties и events в C# - это жуткий костыль от которого надо избавляться. Проперти претворяются обычными полями и скрывают внутри себя логику, которая может приводить к неблагоприятным последствиям. Ивенты создают много проблем с утечкой памяти, нужно постоянно отслеживать привязки.
у тебя неправильные ощущения. Конечно event в своем реализации не самая удачная реализация паттерна Observer, но PubSub инвертирует не только недостатки, но и достоинства первого. Получив плюшки, теряешь...другие плюшки. Идеала нет.
MediatR (так паттерн требует)
достоинство - скрывает компонент который обработает запрос
недостаток - скрывает компонент который обработает запрос
Более того, MediatR усиливает это достоинство(а может недостаток) тем, что базируется по дефолту на IoC
MediatR не первая и не уникальная реализация паттерна, Просто очередная с предсказуемым результатом - а хороший он или плохой - фломастеры
Про свойства вообще бред. Тут даже нечего обсуждать. Они были введены в язык потому что тупо нужны. И в тех языках, где их нет, тупо пилят свои кастомные getProp()/setProp() и плачут.
А скрыть логику можно и в явном методе setProp() - как будто вызывающему коду вообще есть разница.
> Про свойства вообще бред
БОЛЬШАЯ проблема свойств том, что ты не знаешь, как работать с конкретным свойством: как с полем или как с методом? Свойство при каждом обращении может выделять память. Свойство при каждом обращении может совершать относительно тяжёлую операцию, например, по поиску. И тебе в каждом случае приходится смотреть исходный код свойства, чтобы понять - я должен кэшировать значение?
>что ты не знаешь, как работать с конкретным свойством: как с полем или как с методом?
А ты и не должен это знать.
>Свойство при каждом обращении может совершать относительно тяжёлую операцию
узнать при первом же запуске. А то, что это свойство, а не поле - видно и так. Врочем поля все равно никто не делает, так что и знание это ничего не дает. Время чтения свойства покажет тормоза, и ты закешируешь если будет нужно.
Будь это метод... и что? как то, что это метод дает знание нужно кешировать или нет? А никак. Ты запустишь - увидишь тормоза...и закешируешь.
а если нет разницы, то зачем херить нужный механизм только потому, что его некоторые люди идиотски применияют. Попробуй сделать без свойств private set поле и сразу же свойства захочешь.
> только потому, что его некоторые люди идиотски применияют
Вот эта неоднозначность напрягает. Я сейчас больше в геймдеве работаю. И есть примеры ебанутого использования свойств. Допустим, есть свойство MainCamera, которое даёт ссылку на основную камеру игровой сцены. Казалось бы всё охуенно, красиво, удобно. Открываешь исходник свойства, а там блять при каждом обращении происходит обход всех объектов сцены и поиск тега "maincamera". Ну, добавь ты метод FindMainCamera(), тогда всё будет очевидно и понятно любому дураку. Нет, блять, хочу свойства, это же сишарп, если есть свойства, надо использовать. Такие моменты часто встречаются.
Нахуевертить можно всегда. Можно и в конструктор запихать сетевую логику, но это не повод отказываться от конструкторов.
https://pastebin.com/HT7Hi6FD
> 4. С# для игр
> Unity-тред в /gd/
Юнити одна из сильнейших сторон современного C#, а ты так невзрачно об этом написал? Можно делать игры и в два клика билдить их на множество платформ. Это же бомба.
Геймдеву вообще не место в /pr/.
Про геймдев есть отдельный тред на отдельной доске. Юнити это рыгня которую делали не майки, поэтому похуй. Тот кто хочет в игры найдет либо анриал енжин или юнити.
У нас в текущей шапке тоже самое. Я не стал менять поскольку никак не отношусь к геймдеву. Можешь написать сюда что считаешь нужным, а я добавлю
В моей компании пишут автотесты на C#. И за это так называемое, страдание хуйней, мне платят деньги.
Да. Бэк.
Тред про шарп, а не про программирование.
Этот класс наследуют еще два класса BaseExtendA и BaseExtendB, в одном из которых переопределено свойство Visability.
Так вот вопрос, как мне универсально обратиться к свойству Visability наследников? Если я буду обращаться к объектам через каст Base, то не сработает переопределившееся свойство.
Я делал через Object и технически работает, но может есть какой-то более элегантный способ?
Конечно закроется
> то не сработает переопределившееся свойство
Почему ты так в этом уверен? Может проверишь в тестовом консольном проекте?
>Если я буду обращаться к объектам через каст Base, то не сработает переопределившееся свойство.
а? откуда ты это взял
Я ща покумекал. Короче, если ты "переопределяешь" методы через new в наследниках, то это не переопределение, а сокрытие. И сокрытие так ебано работает, да. Тебе нужно override метода сделать, в этом вся суть полиморфизма так то. Почитай про виртуальные методы, переопределение и прочее, это база
>>421597
>>421600
Ах, оказывается я неправильно изъяснился. Я через сокрытие Shadows делал.
>Тебе нужно override метода сделать
А тогда можно обращаться к базовому свойству? У меня там суть такая, что выполняется логика базового свойства, плюс еще кое что. Я чет боюсь оверрайд использовать, какой-то он грозный.
Не бойся, вся суть ооп в этом.
Когда в наследнике оверрайдишь хуйню, то ты в нём же можешь использоваться base.Foo(), чтобы вызвать хуйню из предка. Через base идёт обращение к хуйне предка.
Какой именно синтаксис у свойств я не помню, но их тоже можно переопределять, тому что это по факту поле плюс пара методов.
И пихать много логики в свойства лучше не стоит, если ты там че-то исполняешь особое, лучше метод ебани. Свойства удобно юзать, чтобы модификаторы доступа для полей делать красивые, аля паблик гет приват сет.
Лучше почитай обо всём этом, это прямо самая-самая база, ты как-то рано полез штуки писать, раз в итоге начал заниматься вуду магией с сокрытием. На msdn есть всё, что тебе нужно знать.
Мне больно видеть, что ты не определился: использовать ли тебе var или использовать new(). Из-за этого получилась каша. Лично я решил использовать new() только для инициализации полей/свойств класса.
Ну да.
Сам-то я как-бы того же подхода хочу придерживаться, что и ты, но чисто механически так выходит.
Такая же фигня и с is not null. Типа я как-бы понимаю что этот вариант предпочтительнее, но иногда хреначу != null по старой памяти.
Все из-за отсутствия кодревью на работке. И нежелания настроить code-style чтобы оно просто не собиралось в случае отхода от стайлгайдов(((
А, ну и в довесок от того, что на работке нужно то на си, то на плюсах, то на жаве писать, то на ЖС, это тоже немного выбивает.
> Такая же фигня и с is not null. Типа я как-бы понимаю что этот вариант предпочтительнее, но иногда хреначу != null по старой памяти.
Ага, есть такая проблемка.
C# provides a special "using" statement to call Dispose method explicitly.
Блок using - по факту, это что-то типа такого:
IDisposable obj = GetSomeIDisposable ();
try{
...логика
}
finaly{
obj.Dispose();
}
Все. Закроется поток или нет - зависит от того реализовали ли в Dispose - его закрытие.
выделится память на создание цепочки итераторов
далее для каждого итератора будет MoveNext
Если нет действий, где нужна материализация коллекции, то память расти не будет.
Чего-то я тебя не совсем понял - если выделится память на создание всей цепочки итератора - то как она расти не будет?
твоя сложная from ...where просто сахарная форма эквиалентного кода
scores.Where().Select()
каждый этот метод Where/Select просто получает IEnumerable, создает итератор и возвращает его как свой IEnumerable, то есть просто наращивая цепочку.
Так на этапе определения LINQ запроса память расходуется на создание всех этих итераторов и все.
До момента запуска это просто цепочка итераторов. После запуска память будет расти пропорционально необходимости материализации.
В твоем запросе вырастет чуть чуть даже если ты скормишь этому запросу бесконечный источник. Но стоит тебе добавить Distinct() и получишь атата
Взять готовую СУБД, либо посмотреть, как в них это реализовано и запилить свой велосипед.
Там 2 лярда строчек всего можно запхнуть.
>>422293
Ну так хоть бы каких-то слов ключевых накидал, для поиска опернсорцных субд на шарпеге.
Пока вот что https://github.com/username1565/KeyValue/tree/SimpleTXTStorage но дохуя инфы туда не полезет.
> Там 2 лярда строчек всего можно запхнуть.
А ты собираешься такую здоровую хеш-таблицу в оперативной памяти держать?
Совсем бака?
Я просто к тому, что это вопрос не про шарп.
Почитай Introduction to Database Systems, пойми, что ты охуеешь это все нормально на про уровне реализовывать и бери СУБД под свои нужды. Попробуешь какую-нибудь монгу, поймешь что говно, возьмешь нормальную реляционную СУБД, например Postgres и будешь с ней как человек работать.
>> Там 2 лярда строчек всего можно запхнуть.
>А ты собираешься такую здоровую хеш-таблицу в оперативной памяти держать?
>Совсем бака?
Ну если там value порядка Int32.MaxValue, то лучше просто ключи хранить в оперативке, а сами значения - на диске пусть лежат, и обращаться к нему по мере необходимости, кэшируя небольшие но частно-используемые values.
Но если там болеее 2 млрд пар ключ-значение, то одни лишь только ключи - уже в оперативку не влезут, какбэ.
>Я просто к тому, что это вопрос не про шарп.
Ну как не про шарп, на шарпеге же вся хуйня.
>Почитай Introduction to Database Systems
Да бля, нахуя мне тонны литературы на английском лопатить, это простая же задача, как-бэ. Тупо скинуть на диск хэш-таблицу, закэшировать часто-используемые ключи-значения, а остальное пусть на диске лежит, в raid массивах.
Ну и собственно как эту всю хуйню заебенить чтобы годно было?
Всякие там индексы-хуиндексы, оффсеты-хуйсеты, это вот это вот всё байтоёбство как делать - хз.
>пойми, что ты охуеешь это все нормально на про уровне реализовывать
Как-то по непонятному пишешь.
>и бери СУБД под свои нужды
Так а какую - ты так и не сказал. Какая там на шарпеге есть, чтоб была - для BigData?
>Попробуешь какую-нибудь монгу, поймешь что говно, возьмешь нормальную реляционную СУБД, например Postgres и будешь с ней как человек работать.
>монгу
Так она на сях, плюсах, и жаваскрипте.
>Postgres
И эта на CLang'e, как мне этот шланг в шарпег потом припердолить?
К тому же там размер таблицы ограничен 32 терабайтами. https://ru.wikipedia.org/wiki/PostgreSQL#Поддержка_стандартов,_возможности,_особенности
А что если там петабайтная хэш-таблица будет?
Тащемта у меня задача довольно простая. Раздать DHT между пирами, в децентрализованной сети:
https://github.com/username1565/nanoboard/issues/21#issuecomment-1200594467
А чтобы её раздать, эту DHT, надо для начала заебенить норм HT (HashTable), и её уже потом раздавать, чтобы была DHT (Distributed Hash Table). И всё это говно ещё опенсорцное, и ещё и на шарпеге. Понял, да?
>> Там 2 лярда строчек всего можно запхнуть.
>А ты собираешься такую здоровую хеш-таблицу в оперативной памяти держать?
>Совсем бака?
Ну если там value порядка Int32.MaxValue, то лучше просто ключи хранить в оперативке, а сами значения - на диске пусть лежат, и обращаться к нему по мере необходимости, кэшируя небольшие но частно-используемые values.
Но если там болеее 2 млрд пар ключ-значение, то одни лишь только ключи - уже в оперативку не влезут, какбэ.
>Я просто к тому, что это вопрос не про шарп.
Ну как не про шарп, на шарпеге же вся хуйня.
>Почитай Introduction to Database Systems
Да бля, нахуя мне тонны литературы на английском лопатить, это простая же задача, как-бэ. Тупо скинуть на диск хэш-таблицу, закэшировать часто-используемые ключи-значения, а остальное пусть на диске лежит, в raid массивах.
Ну и собственно как эту всю хуйню заебенить чтобы годно было?
Всякие там индексы-хуиндексы, оффсеты-хуйсеты, это вот это вот всё байтоёбство как делать - хз.
>пойми, что ты охуеешь это все нормально на про уровне реализовывать
Как-то по непонятному пишешь.
>и бери СУБД под свои нужды
Так а какую - ты так и не сказал. Какая там на шарпеге есть, чтоб была - для BigData?
>Попробуешь какую-нибудь монгу, поймешь что говно, возьмешь нормальную реляционную СУБД, например Postgres и будешь с ней как человек работать.
>монгу
Так она на сях, плюсах, и жаваскрипте.
>Postgres
И эта на CLang'e, как мне этот шланг в шарпег потом припердолить?
К тому же там размер таблицы ограничен 32 терабайтами. https://ru.wikipedia.org/wiki/PostgreSQL#Поддержка_стандартов,_возможности,_особенности
А что если там петабайтная хэш-таблица будет?
Тащемта у меня задача довольно простая. Раздать DHT между пирами, в децентрализованной сети:
https://github.com/username1565/nanoboard/issues/21#issuecomment-1200594467
А чтобы её раздать, эту DHT, надо для начала заебенить норм HT (HashTable), и её уже потом раздавать, чтобы была DHT (Distributed Hash Table). И всё это говно ещё опенсорцное, и ещё и на шарпеге. Понял, да?
А? Для любой популярной и мало мальски известной субд есть либа на шарпе. Не говоря уже о монге и постегресе
Ох уж эти бигдата бд типа монги )
ну так то в любую бд можно загрузить много данных
даже в sqlite даже можно загрузить 281 ТБ (а еще можно сделать attach таких же 125 баз)
Вот только как быстро это будет работать )))
Я не о том, что их стоит юзать. Чел просто почему-то думает, что нет провайдеров на шарпе для этих субд.
А я то че, Я вообще не шарю, че для бигдаты юзать. Чел просто неправду написал, и я доебался
Реляционки и юзать. Просто есть некоторые дополнительные сложности связанные с масштабированием. Приходится применять вуду-магию с шардингами, репликациями, вынесением баз на отдельные физические сервера, оптимизацией запросов и работы с индексами, и т.д. Но это как-бы закономерный этап развития. На нем обычно приходит лысенький худой чел в очках в команду, с какой-нибудь профессорской степенью, смотрит на все это дело, морщит брови, и постепенно приводит вашу структуру к пригодной для того чтобы с этой самой бигдатой работать, а вам - приходится обижаться, что вот, теперь оказывается база данных не просто хранилище в которое ты серишь без разбора.
Моя удача, что я хуйню пишу, а не нормальные приложения
Там меняется значение, после чего прога снова обращается к 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/
Не будет ли чего недоброго, если я буду использовать первый вариант?
Там меняется значение, после чего прога снова обращается к 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/
Не будет ли чего недоброго, если я буду использовать первый вариант?
Чем тебе этот пример не понравился?
https://github.com/dotnet/corert/tree/master/samples/NativeLibrary
Я пытался юзать unmanagedexports но там как оказалось с кодировкой не дружит. Надо шиндовс переключать в англ регион.
Потом еще пару говен перелопатил и вы итоге свою тулзу написал.
Эту вроде не пробовал, спасибо.
Судя по семплам, там тоже используют IntPtr.
Хотя для стрингов у меня получалось использовать StringBuilder, тоже меняет значение по ссылке.
Есть, я нашел, SharpLab, соррян за тупое описание, лол
Потому что WTF - говно.
да прямо таки много
ВСЕ НУЖНОЕ
само определение свойства + явный геттер и сеттер для текущего контрола.
Вот допустим, я - дебил, хочу что-то делать без фреймворков и движков. В целях обучения.
Допустим это должна будет быть игра. Рогалик именно что классического толка.
Ну так вот.
Я внезапно осознал, что не могу придумать архитектуру того как оно должно быть правильно.
Типа, вот я делаю класс 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 ну и типо в него пихаю один объект и на выходе получаю другой.
Это правильный подход?
Ну вроде все норм, но меня не покидает чувство что за такое могут и обосцать.
По хорошему - стоило бы сделать что-то типа:
interface IMapper<TIn, TOut>
{
TOut Map(Tin @in);
}
На деле - в принципе можно и так, особенно если у тебя какие-то приватные поля используются. Просто засерать такой вот фигней класс - ну такое. У тебя со временем может миллион классов появиться, к которым ты мапить должен, и все это будет вот там и ты уже хуй разберешься.
Если работаешь по DDD, то в принципе норм.
В других случаях лучше выносить все это в экстеншены, чтобы не засирать класс, либо юзать автомаппер.
>>2423030 (OP)
>А? Для любой популярной и мало мальски известной субд есть либа на шарпе. Не говоря уже о монге и постегресе
>>422618
>Я не о том, что их стоит юзать. Чел просто почему-то думает, что нет провайдеров на шарпе для этих субд.
Да речь шла не столько о провайдерах, сколько о кодах их либ, а то всякие пре-компиленные бинарники без исходника, инклюдить к коду, ну как-то совсем не опенсорцно нихуя.
>>422594
>даже в sqlite даже можно загрузить 281 ТБ (а еще можно сделать attach таких же 125 баз)
Эксабайт не потянет, вроде.
Пока, у меня, какие-то вот такие размышления:
https://github.com/username1565/KeyValue/issues/1
Эксабайт вроде должен поместиться, если почикать на части всю ебанину, как в торрентах.
Если чо пишите туда свои предложения, можно на русском, а то тут тупо смоет всю хуйню или я тупо забуду шо хотел, и заброшу.
>Вот только как быстро это будет работать )))
А вот об этом я не подумал. Может прикрутить туда какой-нибудь lock и MultiThreading?
>>2423030 (OP) (OP)
>>2423030 (OP) (OP) (OP)
Господа, можете посоветовать что-то похожее на пикрил? Тут ее неоднократно хвалили и говорили, что после ее полного прочтения можно смело идти в джуны. Но к сожалению, мне не хватает английского, чтобы свободно ее читать и это весьма сомнительное удовольствие по полчаса переводить каждую страницу, тем более после начала ООП.
Мне книга Троелсона зашла в свое время . Пишет легко и доступно объясняет . Не сказал бы ,чтобы уж очень глубоко ,но достатоно для того, чтобы вникнуть
Так же не понял этого дроча со значимыми и ссылочными типами: допустим, есть у меня две переменные инт со значением 10. Получается, у меня в памяти существуют два независимых числа 10?
Если тип ссылочный, например, два стринга со значением "Hello". Это значит, что "Hello" существует только в одном экземпляре? А если я этот стринг решу запихнуть в метод аргументом и изменить его там? Я получу на выходе совершенно другую переменную? Или что?И опять таки - нахуй оно нужоно?
ПЕРЕКАТ >>2423030 (OP)
ПЕРЕКАТ >>2423030 (OP)
ПЕРЕКАТ >>2423030 (OP)
Ебаная моча, ты хули тред не закрепишь?
Я правильно понимаю, что внедрение зависимостей - это один из способов достижения инверсии?
Да
И вообще в чём прикол? Protected метод из интерфейса становиться private методом в классе Car, при этом еще хуй знает как его вызвать в классе наследнике
мимо Великий Java - господин
в чем может быть проблема?
уже переустановил студию и виндовс
Тред перекатился
Мне нужно в 50 часах видео найти движение одного обьекта.
Вот из подвели под один тип TypeOfCl cl и обращаются к ним.
Как это называется?
class Cl3{ Cl3(TypeOfCl cl) {} }
>System.InvalidCastException: Заданное приведение является недопустимым.
Как изгнать это ебучее приведение, которое вселилось в мой грёбанный код?
GDI под прыщами не работает. Microsoft официально предлагает три стула https://docs.microsoft.com/en-us/dotnet/core/compatibility/core-libraries/6.0/system-drawing-common-windows-only#recommended-action
- https://github.com/dotnet/Microsoft.Maui.Graphics
- https://github.com/SixLabors/ImageSharp
- https://github.com/mono/SkiaSharp
Приложение будет написано с нуля заковано в docker-контейнер, поэтому версия .Net абсолютно не важна. Какой из трёх стульев выбрать?
Сам склоняюсь в Мауи, как к официальному решению от самого Майкрософт. Нужен ли Мауи доступ к видеокарте (её не будет в доккер-контейнере, тем более на прыще-сервере без физической видухи)? Что с остальными двумя?
Надо код показать было
Вы видите копию треда, сохраненную 14 октября 2022 года.
Скачать тред: только с превью, с превью и прикрепленными файлами.
Второй вариант может долго скачиваться. Файлы будут только в живых или недавно утонувших тредах. Подробнее
Если вам полезен архив М.Двача, пожертвуйте на оплату сервера.