Литература вторым постом
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
— The C# Player's Guide, третье издание (RB Whitaker) — отличная книга для ньюфагов, всё расписывается довольно подробно, очень много примеров кода.
— C# 9 and .NET 5 – Modern Cross-Platform Development (Mark Price) — подойдёт для ознакомления с платформой. Затрагивает все технологии, имеющиеся в .NET (веб, мобильная разработка, машинное обучение), ни во что не углубляясь.
— C# 8.0 in a Nutshell (Joseph Albahari и Eric Johannsen) — огромнейший справочник, over 1000 страниц, покрывает почти все области, начиная с синтаксиса и базовых типов и заканчивая интеропом и рослином.
— C# 8.0 Pocket Reference (Joseph Albahari и Ben Albahari) — просто выжимка из книги сверху, можно всегда держать рукой.
— Pro C# 8 with .NET Core 3 (Andrew Troelsen) — 1600-страничный учебник по шарпу, покрывает BCL, WPF и ASP.NET, небо и даже аллаха.
8. Более хардкорный материал
— CLR via C# (Jeffrey Richter) — это классика, это знать надо.
— C# in Depth (Jon Skeet) — написана в виде истории версий C#, начиная с C#1.0. Описываются возможности, которые были добавлены в определенной версии и далее достаточно хардкорно и подробно эти возможности расписываются.
— Writing High Performance .NET Code (Ben Watson) — отличная книга. Фокусируется на методах оптимизации приложений, профилировании. Крутейшая и достаточно детальная глава по GC. Рассматриваются достаточно известные проблемы вроде "for vs foreach", "класс vs структура", кастинг, боксинг, перфоманс регулярок, коллекций, исключений. Короче всё, что нужно, чтобы вам перезвонили.
9. Литература по WPF
— Pro WPF 4.5 in C# (Matthew MacDonald)
— Windows Presentation Foundation 4.5 Cookbook (Pavel Yosifovich)
10. Литература по ASP.NET
— Pro ASP.NET Core 3 (Adam Freeman)
— Professional ASP.NET MVC 5 (Jon Galloway, Brad Wilson, K. Scott Allen, David Matson)
11. Литература по асинхронности и параллелизму
— Concurrency in C# Cookbook (Stephen Cleary) — книга, написанная в формате "проблема - решение". Кроме базовых вещей, вроде асинков и параллелизма рассматриваются TPL Dataflows, Rx (реактивные расширения), тестирование всего этого асинхронного добра, ну и работа этого всего на более низких уровнях абстракции.
— Multithreading with C# Cookbook (Eugene Agafonov) — в основном ничего интересного, но есть довольна неплохая глава про синхронизацию, пусть и не слишком детальная.
— Pro Asynchronous Programming with .NET (Richard Blewett, Andrew Clymer) — опять же, интересного немного, но неплохие главы про асинхронность + UI и анализ дампов памяти в windbg.
12. Литература по мобильной разработке
— Creating Mobile Apps with Xamarin.Forms (Charles Petzold)
— Xamarin.Forms Projects (Johan Karlsson, Daniel Hindrikes)
— Mastering Xamarin.Forms (Ed Snider)
13. Литература по машинному обучению
— Introduction to Neural Networks for C# (Jeff Heaton) — изучение нейронных сетей с примерами кода на шарпе. Под конец пишем программу для распознавания символов и нейроботов.
— Machine Learning Using C# Succinctly (James D. McCaffrey) — довольная коротенькая книга на тему машинного обучения с примерами кода на C#. Ничего особого: k-средние, классификация, наивный байес, но с кодом, который всегда можно поразбирать, если что неясно.
14. Разработка игр
Unity-тред в /gd/
15. Но я не знаю английский, как я буду это все читать?
На некоторые из перечисленных книг есть переводы, которые можно найти на том же рутрекере, однако зачастую эти переводы неактуальны и/или содержат неточности. Кроме того, переводы обычно пилятся только для нескольких самых популярных книг, более-менее серьёзный материал не переводят. Всегда можно сесть со словарем и понемногу читать, переводя непонятные фрагменты. Это очень полезно, так как в любом случае в программировании без знания английского делать нечего. Если очень хочется, то гуглить по запросам: "C# 7.0. Справочник. Полное описание языка", "C# для профессионалов. Тонкости программирования", "Программирование на платформе Microsoft .NET Framework 4.5 на языке C#".
16. Что еще нужно знать, чтобы взяли работать за еду?
— Базы данных — подойдет любая книга по MSSQL/MySQL/PostgreSQL. DDL, DML. Джойны, индексы, нормализация. В контексте шарпа еще ORM: Entity Framework, Dapper.
— Системы контроля версий — обычно гита достаточно: add/commit/push, merge, rebase, checkout, remote, diff, разрешение конфликтов.
— GitHub — issues, пулл-реквесты, теги, релизы, Actions.
— Алгоритмы — сортировка, поиск, оценка сложности алгоритмов, рекурсия, алгоритмы на строках.
— Структуры данных — связанные списки, деревья (бинарные, красно-чёрные, b-деревья), хеш-таблицы, графы.
— Если идти в веб — HTML, CSS, JavaScript, веб-сокеты, REST, JS-фреймворки (Angular, React, Vue).
— Паттерны проектирования, стиль кода, архитектура приложения, внедрение зависимостей, MVVM (если хочется в WPF), SOLID.
17. Я не умею читать, что посмотреть?
— C# Fundamentals: Development for Absolute Beginners — https://goo.gl/meyyxO
— Набор курсов по C# от O'Reilly Media (28 часов, на английском) — http://rutracker.org/forum/viewtopic.php?t=5082978
— Канал по C# IAmTimCorey (на английском) — https://www.youtube.com/user/IAmTimCorey
А у вас как было, когда вы вкатывались? Склоняюсь к мнению, что мне стоит почитать общую информацию о работе браузеров и сетях.
У тебя есть несколько вариантов на мой взгляд. Спиздить курсы где рассказывают все рассказывают досконально как будто душевно больным itvdn например либо рекурсией гуглить самому едва ли не каждое слово а затем непонятные слова которые видишь в процессе гугления. Ну либо книги тут в шапке есть, правда сам с ними дел не имел, ничего сказать не могу.
Че там, блядь, знать-то? XAML - обычный xml, по сути, под копотом оно тебе в объектики собирается, охуеть как сложно, биндинги, ну биндинги и хули, что отписываться нужно если решил INotifyPropertyChanged, ну, блядь, это банальность же.
Я вообще не понимаю, что современные вкатыши хотят делать-то на работе и что думают ты там делать будешь. Тебе скажут - ты программист - бери в руки ассемблер и пиздуй вилкой ковырять регистры - пойдешь как миленький, никуда не денешься, а не пойдешь - ну, отправишься на улицу.
Программист, это в первую очередь - инженер, а инженер - это тот, кто не знает фраз: не могу, не знаю, не хочу. Это, считай, твоя должностная обязанность: по первому зову все что скажут делать: скажут верстать - будешь, скажут алгоритм для вычисления оптимального пути придумать и чтобы был круче существующих на 20% - придумаешь, а скажут - пили 5 лет круды - будешь пилить круды. Такая судьба у инженера, который не хочет быть кабанчиком.

1. Нужно было не просто учить, а пробовать писать. До аналога хоста я к 5й лабе в вузе дошел, когда заебался каждый раз кучу одинаковых хуевин делать чтобы графика была на сишечке.
2. Нужно было про паттерны читать, неткор решил наконец хоть немного стать похожим на что-то удобное для разработки.
3. Коды открыты, нихуя там сложного нет.
4. Как программиста - тебя ебать это не должно. Ты же не думаешь в момент написания программы, что там под каптом электрончики транзисторы теребят, тебе до пизды это, как до пизды в 99,(9) случаев во что там с точки зрения машинных команд собирается твой код, как до пизды большинству что под капотом у листа или как так получается что html написанный буквами в браузере превращается в пямоугольники, таблички, списки и вообще всеми цветами переливается.
> А у вас как было, когда вы вкатывались?
Только на первых курсах, пока не осознал, что программист работает с абстракциями. Конечно, базу знать хорошо бы, но, по факту, не это важно в программировании. Ты, блин, свой-то код через полгода-год не будешь узнавать и не сможешь с ходу сказать как он работает, если там хотя бы 20к строк уже набралось.
Дядь, расслабься пожалуйста, я не ворочу еблом. Я знаю слово "надо", и если надо учить но выучу. Просто мне больше по кайфу в шестеренках ковырять нежели рисовать йоба-дизайн, и поэтому уточняю у тех кто хорошо знаком с внутренней кухней, насколько мое " по кайфу" сопоставляется с нынешними реалиями веб дева. Может у многих компаний есть флешмоб поддрачивать бэков лепить какие нибудь приложухи для внутренних задач, откуда я это узнаю если не у того кто собаку схавал в этом дерьме. Домой аригато.
Лол, видели бы люди со стороны как дизайн 99% внутряка выглядит: табличка-табличка-поле-поле-кнопочка-лейбл и это все стандартом абсолютным и срать все хотели на разные разрешения, красивости, анимации и прочее, это внутряк, он должен какую-то внутреннюю задачу решать даже на баги некретичные похуй, все свои, обматерят в курилке, да попросят что-то в следующей сборке поправить.
А сделать таки заставить могут, если задача такая стоять будет и нет тех кто с этим лучше справится. Просто, блин, УЧИТЬ? Ты берешь, гуглишь, 2 вечера читаешь доки - делаешь, что там учить-то?
Забей хуй на то, как это работает, тебе выше правильно сказали аноны. Просто делай и все. Когда привыкнешь к тому, как ASP работает, как на нем что-то базовое и не только делать - тогда уже можно лезть в пизду и пытаться вникнуть, что за черная магия происходит под капотом, и то при необходимости.
Я лично неделю уже уделяю несколько часов в день на изучение ASPа по книге Фримана. Первые несколько дней хватался за голову от того, как все сложно, непонятно и что за черная блядь магия в каждой строчке происходит. Сейчас уже попривык ко всякой ебале. Копипасчу все из книги нещадно, но хотя бы начинаю понимать, что я копипасчу. Сегодня вот даже смог написать свою первую полностью самостоятельную строчку кода - вроде мелочь, а по сравнению с тихим ужасом от первого взгляда на ASP - ебать прогресс.
мимо вкатун
Чем C# отличается от Python?
Эх, вот бы сразу на удаленочку вкотиться а пока резюме даже не смотрят
Вот есть стандартный способ как поменять две переменных местами с помощью третьей:
int c = a;
a = b;
b = c;
в CIL он выглядит вот так:
IL_0022: ldloc.0
IL_0023: stloc.2
IL_0024: ldloc.1
IL_0025: stloc.0
IL_0026: ldloc.2
IL_0027: stloc.1
Ок. Все понятно.
------
Теперь берем метод через деконструкцию кортежа:
(a, b) = (b, a);
Смотрим в дамп, а там практически то же самое, только чуть в другом порядке:
IL_0022: ldloc.1
IL_0023: ldloc.0
IL_0024: stloc.2
IL_0025: stloc.0
IL_0026: ldloc.2
IL_0027: stloc.1
Почему так? По логике деконструкции он же должен взять два значения, закинуть их в стек, а потом просто забрать их оттуда в обратном порядке, т.е. вот так:
IL_0022: ldloc.1
IL_0023: ldloc.0
IL_0024: stloc.1
IL_0025: stloc.0
Зачем он во втором способе заводит лишнюю переменную? Или эта херня уже дальше потом оптимизируется при конечной компиляции?

> Или эта херня уже дальше потом оптимизируется при конечной компиляции?
Да. После компиляции у тебя пикрил получается.
Бамп
так делают только дегенеративные личности. ты любитель наступать на грабли? подкидывать себе какашки в песочницу?
через пол года эта логическая лапша прокиснет. открываешь код а потом думаешь "а почему тут лишний индекс. а почему в него чтото суётся".
или дальше код пишешь и забываешь что тебе надо копировать лол первый индекс в последний при повторной подобной итерации.
нельзя использовать Length/Count как указатель количества элементов. надо вычитать единичку!
ну и наконец случаи когда надо написать просто нормальную библиотечную функцию у которой инпут и аутпут без выебонов.
итд
код надо писать так чтобы ты мог потом в него заглянуть и прочесть не хватаясь за голову. нашел, блядь, что обменивать. читаемость всего связанного куска кода на разницу между делением по модулю и его отсутствием.
async ValueTask foo(){
if(isConfigured) {.....}
isConfigured = true;
....
}
является потоко безопасным или нет? Подозреваю что нет. А как его по нормальному переписать? Шарп ругается на локи в асинке, а плодить таску семафором через semaphore.waitasync, ради такой простой фигни, как-то не хочется.
Что-то вроде такого, предполагаю, прокатит https://pastebin.com/ApGKuZQV. Но в некоторых случаях double-checked locking считается антипаттерном.
Спасибо, перевел бул в инт просто.
Алсо, вопрос по этим мутексам и семафорам. Правильно ли я понимаю, что когда пишу sem.Wait() или lock(), то поток становится залоченым и просто ждет, когда нужный ресурс освободится? И в это время ничто в программе не может использовать этот поток?
Почему тогда в стандартную либу не добавили асинхронные мутексы, локи и тд?
Все таки убрали из шапки про "язык богов".
заебало - постоянные, бесконечный спринты, ебля с юаем и, вообще говоря, история далекая от настоящего проганья
в общем, знаю юнитишные си шарп и питон (довольно много на нем пиходилось писать)
Куда можно вкатиться с такими знаниями без потери в зп? (была 80, тк контора очень мелкая) В бекенд реально?
Реально только в другую бнити контору, иначе охуеешь от того сколько всего нужно знать. Помимо бекенд фреймворков вида асп.нет и сигналР, нужно еще SQL щнаит на уровне не хуже шарповского. Дополняется это всё знанием JS и базовым знанием html+css. Если уверен, что сможешь всё это освоить и не потерять в зп, то дерзай. Но я бы лучше в текущей сфере развивался, благо юнити не теряет в популярности.
Ох, братиш
Ну, в целом то, дохуя. Но смотря что
У нас был стартап, поэтому область отвественности была довольно обширная
Ну понятно, что на юнити висит юай и логика - тут все мало чем у игроделов отличается
Помимо проганья нужен матан и знание основ теории управления (но я этого касался поверхностно, другие ребята занимались управлением).
Я сам сперва, помимо самого юнити, в соляну, потом уже с тимой пилил зрение - обработку облаков точек с ргбд камеры (ну тут был питон).
Короче зависит от размера команды: если мелкая, как у нас, то нужно много чего знать. Если штат крупный, то у каждого будет четко ограниченная роль и необходимый набор скилов. К слову, мы потом набирали людей на юнити именно геймдевных - для всяких оптимизация и прочего, требующего хороших знаний специфики юнити
Всегда ловил лютый криндж с языков типа Java и C#, точнее не с самих языков, а инфраструктуры и специфики разрабов. Всё такое официальное, стандартизирован каждый пук, тысяча уровней абстракции с модными билдерами, фабриками, фабриками билдеров, билдерами визитёров стейта стратегии фабрик и т.д. Ещё очень угараю всегда с сертификаций всяких майкрософтов. В итоге все это вместе всегда вызывало чувство некоей КОЛХОЗНОСТИ происходящего.
Это все так на самом деле? Или мое впечатление ложное и обстановка кодоебов на шарпе такая же приятная, как и кодоебов на всяких Го/Питонах и т.д.? Или реально всё так официально-деловито? Если что не траллинг, прост рил интересно.



а вообще не так и много и довольно размыто. разве что теорию управления я как что-то целостное никогда не изучал, но учитывая что меня обычно звали в проекты делать ИИ, то наверно я знаю больше нуля. и анализ облака точек для меня не кажется таким уж сложным учитывая что мой первый крупный самостоятельный проект был это был навмеш собранный на коленке. пикрелейтед. видеорелейтед.
а че там ещё нужно? вычислительные шейдоры? новомодная хуйня вроде DOTS?
Паттерны проектирования не только в C#/Java применяются. И применения паттернов позволяет писать безопасный код, который устойчив к изменению и расширению. При этом сами языки не требуют от программиста управления памятью. Что в целом делают эти языки отличным выбором для крупных компаний с большой кодовой базой.
Restoring packages for E:\хуйпизда.csproj...
GET https://api.nuget.org/v3-flatcontainer/mysql.data/index.json
Unable to load the service index for source https://dotnet.myget.org/F/roslyn/api/v3/index.json.
Response status code does not indicate success: 404 (Feed does not exist.).
Time Elapsed: 00:00:01.1212230
========== Finished ==========
Это у меня какая-то хуйня с вижаком, или в майкрософте где-то обосрались?
да я не пытаюсь тебя как-то отпугнуть типа "смотри как я крутой, я облака точек знаю как обрабатывать"
типа камон, мне до мудрых дядек, знающих все еще хуячить и хуячить
Да и задачи были не самые сложные - классика робототехники: найти объект в облаке, движение по траектории (ну тут, правда, все чисто на RGB + D канале)
просто я к тому, что чистым кодингом тут не отделаешься, скорее всего, нужно знать еще что-нибудь из роботоетехнической области
шейдоров каких-то сложных у нас не было
У тебя, кстати, интересный опыт, как мне кажется
расскажи вообще, что за проекты с ИИ (Примерно)? навмеш на колентке это просто пет проект? Ты работаешь именно с юнити?
Просто у меня вот этап смены работы и я прям парюсь: валить ли с юнити или оставаться
Буду рад, если ответишь)
Короче хрень какая-то была. Я поудалял из инсталлера ненужные компоненты, обновил вижак до самой последней версии, сделал ему "восстановление", и оно всё равно после этого не работало. Ну думаю, пиздос, придется писать им куда-нибудь. Нажал Install ещё раз чисто чтобы скопировать текст ошибки, а оно взяло и установилось.




да не мне так интересно какой вообще минимальный набор скиллов требуется за пределами гейдева. что-то такое поверхностное то на юнити ебошить то много знать не надо. а то открываешь порой требования для обычных погромистов а там список всяких интересных требований. открываешь к юнити а там можно сформулировать как "не быть говноделом" и "знать какую-то узкоспециализированную хуйню"
>расскажи вообще, что за проекты с ИИ (Примерно)?
всякие. пару раз делал и доделывал ИИ для стратегии, для РПГ одной делал, для хуевого шутана. ничего такого чем я бы гордился. обычно задача ставится "чтобы расширять можно было не через жопу и без моей помощи", а не какие-то интересные решения чтобы принимало. чтобы интересные решения принимало это надо обычно в проект нанимать отдельного человека у которого там своя атмосфера в проекте.
>навмеш на колентке это просто пет проект? Ты работаешь именно с юнити?
юнити просто знаю лучше всего. так то и в некоторых других движках кнопки найти смогу если что. навмеш скорее мой основной проект в портфолио и проект над которым я работаю дольше всего. когда начинал над ним работу у юнити вместо навмеша был пиздец который билдился только в эдиторе, а я хотел именно процедурные уровни. были конечно другие решения для навигации но они мне все не нравились и я стал ебошить своё. в итоге лол юнитеки допилили себе навмеш до того состояния который мне был нужен ранее, но к тому моменту я запилил уже своё получше. вообще навигация конечно мегаважна в ИИ, так как позволяет решать какие-то пространственные задачи. например в той РПГ мне дали задачу научить ИИ использовать предметы в запертых комнатах лол. то есть ИИ должен был построить путь в запертую комнату(уже интересное начало), в этом пути должен был содержатся флажок "тут заперто", вернуть ИИ информацию где находится ключик от комнаты и сказать чтобы он пиздовал туда где ключик, взял ключик, вернулся к запертой двери, отпер дверь, наконец применил предмет в запертой комнате. вроде тривиальная задача, а чем больше информации доступно изначально тем проще её решить. идеально если она доступна сразу вся чтобы поток думалки не лез лишний раз в поток навигации. а ведь задача может усложнится! когда например от комнаты нужно два ключика и один из них у патрулирующего стражника, тогда надо ещё знать какой из ключиков ближе учитывая расстояние хождения.
ну а могущество залезть в генерацию навмеша и какую-то свою хуйню сделать это конечно замечательно. например лол вон у меня есть генерация зон доступных только "присев" где соответственно сложней передвигаться. что-то такое в стандартном навмеше сделать несколько проблемно. или вон та информация о "укрытиях" тоже результат генерации. не руками же такое расставлять!
ну а так то разумеется не один навмеш я умею. умею вычислительные шейдоры, обычные шейдоры, всякую геометрическую хуйню, допиливать функционал самого юнити. это наверно чаще всего просят. ну и по мелочи. вообще я могу тут весь тред засрать всякими интересными картинками и видосиками.
>Просто у меня вот этап смены работы и я прям парюсь: валить ли с юнити или оставаться
с одной стороны на юнити самый наверно повышенный спрос, а с другой стороны много просят тривиальную хуйню а платят за неё мало. но это я сужу с точки зрения гейдева. а тут управление дронами охуеть.


наверно ещё это покажу. один из моих любимых проектов.

уравнение навье стокса вообще клево! смотришь на такое и техномагия какая-то! жаль довольно поверхностно знаю. то на что можно убить пару лет и не заметить. и мало практического применения имеет, не пропорционально тому времени которое требуется на него.
мне тридцатник уже. вкатывался в погромирование лет 8 назад без каких либо скиллов на энтузиазме. сейчас я не работаю, скорее возвращаюсь к погромированию после продолжительной хандры от навалившихся проблем.
надо наверно доделать уже пару фич для навмеша, подучить пару вещей, да завести свой проект.
В итоге решил вкатиться полностью в с#, поясните насколько он перспективен если сейчас учить - смогу я норм работу найти - чтобы при этом не скучную? (как я понял самое скучное это легаси поддерживать - на сколько в с# плохо с этим?)
И еще пытался вкатиться в frontend - не зашло, но что-то как я понял если в с# вкатываться то все равно в итоге придется скорее фулстеком быть??
>на сколько в с# плохо с этим?
Всё плохо, особенно если попадешь на проект который писался на винформс. При этом сам язык и платформа хорошо развиваются, ты смотришь на эти отчеты об улучшениях и облизываешься, потому что на работе у тебя .Net Core и пахнуть не будет, если попадешь на 4.5 фреймворк - считай повезло.
>вкатываться то все равно в итоге придется скорее фулстеком быть??
Так и есть. Если хочешь работать с современным шапром, то должен шарить в JS + HTML + Angular/React в качестве фрона и ASP NET, EF, SQL, Identity, SignalR в качестве бэкенда. Можешь всё перечисленное прям сейчас уже учить, упор делай на SQL и ASP NET.

кекеке. вообще я делал это на стриме, так что особо не заморачивался с именами. хотел чтобы ИИ ходил в лес за грибами! если интересно, но непонятно то на скриншоте в целом тот-же сорт ИИ как в FEAR. довольно клёвый планировщик. https://en.wikipedia.org/wiki/Stanford_Research_Institute_Problem_Solver состояние мира описывается как набор bool, каждое действие имеет прекондицию и то как оно меняет флаги в состоянии мира. а поиск заключается в изменении представления состояния мира пока оно не достигнет целевого.
хорош тогда когда пулл действий должен быть максимально динамичным, так как связи между действиями описаны в прекондициях к ним. можно вешать пулл действий прямо на предметы в мире, например. а в качестве целевого сосотояния использовать какую-нибудь эристику. как в симсах например. хочет срать - роется в планировщике в поиске способа посрать.
>>1916388
карту высот? имеешь в виду что красное = количество воды? так себе идея. между водичкой сверху и газиками снизу есть разница в способе перемещения их. водичка перемещается вариацией https://en.wikipedia.org/wiki/Shallow_water_equations там есть интересный шаг который исключает "потерю" воды при перемещении так как перемещаться она может только в соседние клетки. там где красный дым там просто берётся отрицательный вектор движения для текущего пикселя и смотрит чё там с помощью билинейной интерполяции. синее это очень сильно увеличенная зона где "длина" векторов различается и соответствует повышенному давлению (там есть пониженное, просто оно не отображается тут), зелёное это то где направление различается и оно делает завитушки. изначально хотел сделать такое в несколько слоев и использовать для атмосферной симуляции. чтобы облака были похожи на настоящие! но немного не оценил масштабы проекта. там где водичка землю размывает кстати применяется комбинация обоих методов. эрозия размягченной земли перемещается как красный дым. эрозия под действием гравитации это уже вода где не сохраняется инерция. видеорелейтед.
ну а производительность то что. оно на гпу обрабатывается же целиком. это шейдор. верней конкретно это вычислительный шейдор. https://docs.unity3d.com/520/Documentation/Manual/ComputeShaders.html с клевым API. гпу такое проглатывает и даже кулерами гудеть не начинает.
Есть ли какой-то символ, который выглядит похоже на косую черту типа "/", но на самом деле ей не является и допустим для использования в именах переменных и т.п. Мне нужно не расстраивающее мои чувства о прекрасном написание в енумах вещей типа kg/m3, например kg⳺m3 (не работает, т.к. не допустимый символ).

Хмм, а действительно, нашел в AppData\Roaming\NuGet в конфиге ссылку на этот рослин.
Я когда-то ставил опции для разработки расширений для вижуал студии, видимо они туда этим насрали.
>>1917040
Еблан, ты о других людях подумай, которые твой код потом будут поддерживать. Не все, блядь, в студии кодят, не все используют всякие приблуды при написании кода, та и тупо при сохранении твоего кода в ASCII-кодировку пизда прийдет твоим символам.
Как человек пиши: kgPerCubicMetre, это и набирается легко и найти легко и запомнить легко и выглядит отпрятно. Нет, сука, нужно извратиться, чтобы потом никто нахуй не мог, если ему нужно, найти то что ему нужно.
Давай, ебани еще иероглифов в код, хули, шарп-то позволяет на любом языке писать. А для пущего эффекта - называй классы на русском, чтобы все знали какой ты молодец и постоянно раскладку меняли.
Отвратительно, нахуй. Пидорасу неприятно, а тем кто потом будет 3 часа нужную переменную напечатать - будет охуеть как приятно.

Я ожидал такую реакцию, и я понимаю её, как программист, если оторваться от предметной области.
Я попытаюсь объяснить свою позицию, и хотел бы услышать мнения на этот счёт.
Для читаемости кода, краткость и лаконичность, а также привычное написание известных физических и математических сущностей - превыше всего.
kgPerCubicMetre - это очень длинно. А ведь есть ещё кг/м/с2 или Дж/К/моль. Это ещё длинней придётся так писать. Если таких вещей полно, это абсолютно нечитаемо.
Я ведь есть ещё физические формулы. P = ρ g H - это понятно, легко и читаемо. А вот это: pressure = density accelerationOfGravity height уже в таком простом примере читается тяжело. А если формулы длинные? Намного более длинные? А если код целиком состоит из обилия формул? Мне кажется любители латиницы и длинных верблюжьих названий не писали физических и инженерных приложений, иначе бы они так не думали. И да, есть некоторые термины, которые применяются в российской инженерной практике, которым нет прямого эквивалента на английском. В результате этого одно и тоже понятие в коде разных авторов называется совершенно по разному (в меру знаний английского и понимая предметной области теми или иными кодерами). В таких случаях я также настаиваю на написании имён переменных именно русскими буквами, именно так, как она называется в пост-СССР. Я кстати видел код своих немецких коллег, так вот у них использование немецких названий переменных немецким алфавитом - это норма, подозреваю, по тем же причинам.
Очень печально, что С# не имеет отдельного оператора для возведения в степень.
Лол, няша. Программисту это удобнее для чтения. Потому что программисту - собственно похуй что за этим стоит, он на тестах проверит, что результат тот что нужно. Важно чтобы эта переменная легко запоминалась. И как раз kgPerCubicMeter - запоминается легко, а имя достаточно уникально, чтобы сразу найти место где оно используется.
Программисту до пизды что там за предметная область, какие законы там стоят и прочее - для него это просто данные в памяти, байтики, нахуй, ему нужно их посчитать, передать куда-то еще, потом сохранить или показать результат. Важно, чтобы можно было нажать ctrl+f и сразу найти то что нужно тебе, а не еабться с тем что формула красиво выглядит, до пизды как выглядит в тексте программы, тем более что программист это в первую очередь тот кто программу пишет, а не тот кому есть какое-то дело до предметной области, на фронте уже нарисуют как надо тем кто этим пользоваться будет. Тебе важно, чтобы в 100500к строках кода - ты без труда мог нати то что тебе нужно, для этого и придуманы стандартные нотации, для этого и придуманы стандартные структуры файлов, для этого и пишется velocity = velocityPrevious + (acceleration time); вместо v=v0+at, чтобы ты не зная что, блядь, за v - мог понять что это такое, Тебе завтра скажут вместо физических величин - писть ПО для банка, послезавтра - для роботов, а потом - для самолетов, и ты должен писать быстро, иметь возможность найти то что нужно, ты не на уроке, блядь, где вы зазубрили формулы и дрочите задачки, ты, сука, программист, нахуй, эксперт во всем, и чем меньше ты создаешь сложностей себе и коллегам - тем тебе проще.
>найти место где оно используется
Вот тут не очень понял в чём сложность. Если используешь студию, то она сама всё подсветит, или ты о том, чтобы просто найти все переменные во всём проекте, имеющие подобное название? Но тогда не понятно, зачем это. Если не используешь студию, ну ты сам себе злобный буратино.
>чтобы ты не зная что, блядь, за v - мог понять что это такое
Для такого существует ридми, документация, на худой конец в заголовке файла в комменте освятить основные сокращения, например.
>завтра скажут вместо физических величин - писть ПО для банка, послезавтра - для роботов, а потом - для самолетов
Ну это уже макакинг. Там где предметная область не нужна для таких кодеров будет внешний рафинированный интерфейс, за который ему и лезть не стоит.
> Вот тут не очень понял в чём сложность
Допустим, у тебя проект чуть до среднего не дотягивает, скажем 60к строк. Ты только пришел, тебе говорят: Скорость неправильно считается, пофиксь, пожалуйста. Как думаешь, вот лично тебе будет интересно ковыряться в 60к строках кода в поиске места где твоя переменная находится, ведь нормальным поиском - ты не можешь ее найти, т.к. v не такая и редкая буква, а где что лежит - не знаешь, ты же только на проект пришел. Думаешь тебе кто-то специально в ридми напишет: "Мы рассчитываем скорость в таком-то файлике на такой-то строке"? Да нихуя. И как раз если бы оно нормально называлось - ты просто жмакаешь ctrl+f и пишешь velocity - все, ты нашел все места где оно встречается, за 10 минут прошелся - нашел баг, пофиксил, пошел пить кофе и мацать за жопу практикантку, которая очень хочет научиться программировать и просит тебя, скиллового чела, что баг за 10 минут пофиксил - после работы научить примудростям, а если в проекте используется всякая хуета вида v=a+b+c - ты будешь неделю только вникать где что лежит и как сделать так, чтобы нахуй не поломалось все.
> Для такого существует ридми, документация, на худой конец в заголовке файла в комменте освятить основные сокращения, например.
Да, ты ведь каждую переменную в ридми записываешь, а внутри метода каждую строчку сопровождаешь комментарием, когда тебе нужно за день 10 тасков закрыть, конечно, заняться больше нечем. Действительно, зачем написать название переменной, которое всем понятно - если можно высрать комментарии. 11/10 решение, ничего не скажешь.
> Ну это уже макакинг.
Это обычная такая реальность разработки. Вы - крутые спецы, клиенты знают что вы делаете быстро и качественно, а берете меньше чем в европах/сша кодеры, сегодня к вам клиника стамоталогическая обратилась, нужно софт для ведения карточек пациентов сделать, чтобы в них хранились 3d сканы челюсти и было удобное мобильное приложение, чтобы можно было эксперту скинуть и он удаленно мог провести диагностику; завтра фирме грузоперевозок понадобилось программу, которая будет считать время водителей в пути и прокладывать оптимальный маршрут с интеграцией со всякими картами, местными сервисами и т.д. Сидеть и дрочить одну специфическую область программисты даже в конторах которые занимаются продуктом не могут: тут конкуренты прикрутили стриминг - нужно и нам скорее; появилась охуенная платежная система - скорее нужно и нам; менеджеры по продажам говорят что мобилки рулят - нужно скорее наш софт на мобилки переносить; нам срочно нужно CI/CD организовать и теперь все dev's внезпрно превратились в devops'ов. Кучу хуйни приходится учить ежедневно, куча хуйни меняется, выходят еще и новые технологии, которые ты должен учить, чтобы быть крутым спецом и запоминать как в предметной области X называется какой-то термин, тем более через, допустим, 2 года - ебантизм, ты не всю жизнь будешь вот эту вот хуету писать.

вопрос масштабов же. можно же например как в fishing north atlantic просто бултыхать водичку рядом не меняя её реальный уровень.
вообще опять же метод с газиками годится больше для газиков. так как само перемещение векторов там происходит за счет зон давления, которые чтобы получить надо много итераций (на том видео кажется 30). если давление не нужно то и сам метод не нужен.
для водички как например на этом видео достаточно 2. одну чтобы посчитать статическое давление, приплюсовать энерцию и сколько максимально воды может переместится из клетки. а вторую чтобы посмотреть сколько воды переместилось в эту клетку. если хочется почитать то я ориентировался в основном на этот текст. https://hal.inria.fr/inria-00402079/document "Fast Hydraulic Erosion Simulation and Visualization on GPU"
помню натыкался на более крупный текст про водичку в играх вообще... а во. https://trepo.tuni.fi/bitstream/handle/10024/115052/kellomaki_1354.pdf "Large-Scale Water Simulation in Games" там уже больше методов рассматривается.
хотя вообще всё это в играх конечно имеет довольно маленькое применение. наверно только в From Dust это было главным элементом геймплея.
Где вообще брать задания на этапе изучения синтаксиса? Когда я учил Пайтон по книге Гэддиса и Java по Эккелю, там для каждой главы были задания, благодаря чему я мог глубже осваивать материал.
Есть какие-то ресурсы или книги для вот такого вот комплексного изучения языка?
Я какое-то время смотрел сайт с олимпиадными задачками. Сортировал их в порядке, начиная от задач для дебилов. Там реально простенькое было, но не привязанное к языку.
А вообще, если ты где-то работаешь, лучше находи проблемы из своей практики, пусть даже мелкие совсем, и для них что-то пили.
Я вот на зеленом старте пилил себе формочку с БД для вноса ежедневных трат по категориям и с возможностью вывода статистики по различным временным периодам.
Берешь кодфорс или кодворс или любой другой ресурс, где задачки можно решать, решаешь, закрепляя таким образом синтаксис.
Другое дело, нахуя тебе разные книги по разным языкам читать, блядь? Ты смотришь вакухи - смотришь что надо для работы - дрочишь за месяц и идешь работать. Все, блядь. Я хуею. Я вот ебалн из универа, нам дали базу на первом курсе, но прогать на чем-то кроме ассемблера, С и С++ не давали осбо. Ну и хули, я смотрю, нет вакух по С и С++, потом смотрю в карманы, денег нет, а тяночка хочет жрать, хочет шмотье, ну и хули, пробегаюсь по джаве и через месяц я уже - на испытательном сроке, через 2 недели - в штате и работаю, потихоньку приношу пользу, через год меня заебала джава и я так же с СРешоткой поступил, но сразу на мидла заскочил.
Я хуй знает че вы там учите с синтаксисом эти, 99% языков - сиподобные, тебе просто нужно знать что к тут чтобы получить доступ к члену класса - ты используешь . тут ->, все, блядь, дальше просто пишешь алгоритмы, гугля иногда инструментарий что есть в языке, ну и пишешь так чтобы твой код другие люди понимали. Все, нахуй.
Опять же, ХЗ, может быть я какой-то аурой обладаю, но ни разу меня на собесах целенаправленно не валили, ни разу не ебали кишочками, чтобы прямо знал как там в память все укладывается, ни разу не ебали сверх меры алгоритмами, просто пришел, показал диплом, показал регалии(ыыыы, ездел в Испанию на стажировку, брал места на олимпиадах, дипломчик красненький, статьи - цитируют): Можешь сделать? Могу! Покажи гит - показал, оки-доки, мы пока доки подготовим, используем то-то и то в разработке, поддрочи чтобы как вышел - работать нормально мог. Все, блядь. Иду - дрочу, потом работаю. Короче, хз в чем у людей сложности.
Код:
MediaElement.Source = new Uri("pack://application:,,,/папканейм/1.avi");
MediaElement.Play();
В xaml'e пробовал ковырять LoadedBehavior, тоже ничего не дало.
>просто пришел, показал диплом, показал регалии(ыыыы, ездел в Испанию на стажировку, брал места на олимпиадах, дипломчик красненький, статьи - цитируют): Можешь сделать? Могу! Покажи гит - показал, оки-доки, мы пока доки подготовим, используем то-то и то в разработке, поддрочи чтобы как вышел - работать нормально мог. Все, блядь.
Ты же понимаешь, что тебя легко берут как раз за это? У тебя есть вышка, петпродежкты, стажировка не в СНГ. Этого почти ни у кого нет, максимум вышка задрищенского политеха и скудные знания.
>смотрю в карманы, денег нет, а тяночка хочет жрать
есть релевантная повесть и фильм, лучшие собаководы рекомендуют. жизненно.
https://ru.wikipedia.org/wiki/%D0%9F%D0%B0%D1%80%D0%B5%D0%BD%D1%8C_%D0%B8_%D0%B5%D0%B3%D0%BE_%D1%81%D0%BE%D0%B1%D0%B0%D0%BA%D0%B0

Смотрите, у меня есть контроллер апишный, в него должно постучаться устройство со статическим IP, я должен сохранить информацию и IP с которого стучались, потом переодически что-то с этим делать, например смотреть не отклоняется ли время устройства сильнее чем должно и корректировать, если отклонилось.
Так вот, в чем хуйня. Я думал просто брать IP с помощью context.HttpContext.Connection.RemoteIpAddress, но хуйня в том, что таким вот макаром на моем ПК откуда-то берется IPv6 адрес, который, как я понимаю там где-то маршрутизаторами получается(я не настолько хорошо за сеть шарю пока что, но я знаю точно адрес устройства и он в формате IPv4), а на другом компьютере IPv4, но внутри локальной сети, а не тот что реальный и как-бы доступен всем. Я посмотрел с помощью Dns.GetHostAddresses() адреса и среди них есть тот, который я заведомо знаю что устройству принадлежит, только вот как быть уверенным какой брать? Вдруг в следующий раз нужный адрес будет 6м?
Вообще, кто-нибудь с такой вот хуйней сталкивался? Как это работать должно? Может быть сохранять все адреса разом и по ним простукивать?
Например:
Static string ОдинПлюсДва (_первое, _второе)
return _первое + _второе;
Static void main
a = 2;
b = 2;
ОдинПлюсДва(a , b) //Я ведь правильно передаю параметры в метод?
Консоль.показать(???) Как мне результат то где взять что? Мне ruturn метода ОдинПлюсДва сюда надо. Где значение того что вернулось то взять?
Смотри, для начала можно думать так: Когда ты вызываешь метод, компилятор на самом деле - подставляет туда, откуда ты его вызываешь весь метод. Вот. Таким образом, допустим, твой метод:
string Combine(string a, string b) => a+b;
это все равно что если бы ты вместо метода везде писал то что в нем происходит.
Чтобы получить результат, ты, в зависимости от того что метод возвращает, используешь переменную.
Т.е. в твоем примере ты должен был бы так вот сделать:
int c = ОдинПлюсДва(a , b)
Да, насчет последнего. Не всегда обязательно явно переменную использовать чтобы результат использовать.
В твоем примере ты мог бы делать и вот так, например:
a = 2;
b = 2;
Консоль.показать(ОдинПлюсДва(a , b));
Так делать нехорошо, конечно, но когда дойдешь до Linq и Fluid'ов то там, в принципе так вот и делается зачастую.

>>1918988
Пасиба, ананасик. Вроде яснее стало.
Я не понимал, что получение результата метода происходит в момент когда ты передаёшь методу параметры (а из метода мейн в _первое в метод ОдинПлюсДва и б из мейн во _второе в метод ОдинПлюсДва. Потом тут же отдаёт результат.
Как на твоём примере с переменной, новый метод при вызове из mein сразу получает параметры, сразу их считает/выполняет код и сразу возвращает, присваивая их в переменную "int c".
Надеюсь я правильно представляю всё это. Во всех мануалах это подается как само собой разумеющееся.
У меня почему-то изначально всё представлялось как по строкам кода. Сверху вниз
Отдали параметры. Результат посчитался;
//они где-то там висят в памяти* в какой-то несуществующей переменной куда их записал return
Обращаемся когда захотим к результату;
Задаём другие параметры если надо.
Не пришло в голову, что результат нужно где-то хранить самому и самому объявлять где.
Спасибо еще раз.

>вот лично тебе будет интересно ковыряться в 60к строках кода в поиске места где твоя переменная находится, ведь нормальным поиском - ты не можешь ее найти
Краткие обозначения используются внутри методов. Классы и методы конечно должны иметь самодокументирующие названия.
Ну и твой пример скорее в мою пользу. Если скорость неправильно считается, но считается она сложно, то когда формулы записаны символьно, ты хотя бы можешь их прочесть, сверить с исходниками (статьи, учебники, тех. документация) и увидеть ошибку. Если же формулы записаны по-программистски (с длинными именами переменных, и выносом каждого микровычисления в отдельный метод), то ты никогда в этом не разберёшься, только заново переписать все вычисления.
>Да, ты ведь каждую переменную в ридми записываешь
Ну ты перегибаешь. Комментарии почти всегда нужны, в любом коде.
>Это обычная такая реальность разработки.
Обычная практика такова, что все более менее крупные специализированные компании (банки, нефтяники, медики, с очень узкой специализацией от разновидностей стоматологов до хирургов, военные и т.п.), которым нужен свой софт, БД или автоматизации, имеют своих программистов, которые либо пришли из математиков и АСУ ТП в предметную область, либо наоборот, дополнили предметные знания навыками кодинга. А то, о чём ты говоришь - это сайтошлёпство и обезьяний бигдата+машоб на корзину для пускания пыли в глаза акционерам.
Хотел тут спросить, но пока спрашивал сам допёр.
Вот из-за этой херни целых джва часа тупил тормозил. Метод возвращал Int вместо Int[], пиздосье. Массив интов и инты, это оказывается разные типа. Я весь гугл излазил, не понимая в чём дело.
Есть while(true){} в котором работает основная логика хочу в нее что-то типа менеджера задач чтобы в каждой итерации проходила работа по всем задачам, НО вот тут начинается загвоздка, я хочу иметь возможность в задаче написать что-то типа
stopwatch.Elapsed > 10 sec остановись и дай поработать другим, а на следующей итерации продолжишь.
И все это работает в 1 потоке.
Вот в остановись и дай поработать другим, а на следующей итерации продолжишь. у меня проблема, не понимаю как это вообще релизовать. Так же хотелось бы не просто говорить на следующей итерации, а типа жди Х события или Х секунд или пока тебя не запустят.
Пытался разобраться с этим, но не понял как это сделать.
Вот есть у меня 10 задач на парсинг чего-то огромного что займет по часу времени, плюс надо постепенно закидывать мелкие задачи чтобы они тоже отрабатывали как это на авэйте сделать?
И мне именно надо на 1 потоке, потому что крутить программу я хочу на мелком сервере и занимать на нем ровно 1 поток чтобы остальное что на нем крутится не тормозило.
Анон, есть пара вопросов по github-репозитариям.
Вот, значит, на github'e, там - есть репозитарии всякие,
например этот https://github.com/JamesNK/Newtonsoft.Json
и там, в Releases - https://github.com/JamesNK/Newtonsoft.Json/releases
есть версии различные, и можно скачать их код в zip-архивах,
например, эта версия, которая успешно компилируется в Visual Studio 2010: https://github.com/JamesNK/Newtonsoft.Json/releases/tag/7.0.1
Там, внизу, есть ссылка: https://github.com/JamesNK/Newtonsoft.Json/archive/7.0.1.zip
И если кликнуть на тег, можно видеть этот вот код: https://github.com/JamesNK/Newtonsoft.Json/tree/7.0.1
с последним коммитом 20cc266, то есть 20cc266712a3b361358e1e35ae87518ecf8e0dfd .
Если кликнуть на Branches, то такого бранча, v7.0.1 нет, но рядом есть вкладка Tags, и там эта версия есть, и код доступен - по тегу.
Пусть теперь, я хочу качнуть код именно этой версии. Как это сделать?
И ещё...
Пусть есть репозитарий, в котором этот код является подмодулем.
Как в .gitmodules включить именно версию v7.0.1, чтобы не качать весь исходник и не заливать его снова. Там около 1000 файлов, блядь, не хотелось бы раздувать репу. Может можно как-то попроще, что-то вроде:
>[submodule "имя"]
> path = папка
> url = https://github.com/user/repo.git@версияЕбать.
Ага. Спасибо. Я остальное то вроде усвоил. Дальше только зажать нос и нырять в раздел книжки ООП.
Там у меня чисто для себя чтоб понять методы образец. Я просто не понимал почему ретюрн отказывается возвращать. Пытался и его как-то конвертировать, думал может каждый индекс массива нужно отдельно доставать в новую переменную, а потом обратно собирать в массив.
Там у меня в посте было просто максимально коротко чтоб ясно изложить свой затуп.
Там у меня требуется ввести количество элементов в массиве.
Можно запрос на ввод и в методе организовать наверное. Хотел себе позже много-много методов сковать и в каждом каждый запросить. Чтоб прям стресс тест себе устроить.
Надо конечно наверное сразу приучать себя проверять ввод на правильный возврат с консоли. Но я слишком начинающий еще, едва только циклы усвоил. Если сущностей наплодю потом, то конечно более подробно буду описывать вызов и консолей и исключения обрабатывать.
Спасибо за совет

Почему C# сам не может нормально собирать COM-мусор, и мне приходится на кучу промежуточных объектов вызывать Marshal.ReleaseComObject(obj) ???
Самое простое известное правило - не использовать два оператора точки в одном выражении при работе с COM-объектами. Вот например, такая штука обычно оставит висячие ссылки на КОМ-объекты: Excel.Sheets sheets = app.Workbooks[1].Worksheets; .
Но и использование этого правила помогает далеко не всегда.
Вот например код из приложенной картинки без вызова Marshal.ReleaseComObject(books) оставляет висеть в диспетчере задач процесс Excel после закрытия приложения и всего, что с ним связанного. Хотя казалось бы, почему я тут должен маршала просить релизнуть объект?
Вызывать Marshal.ReleaseComObject() на всё подряд также нельзя. Вот почему:
Excel.Workbook b1 = app.Workbooks[1];
Excel.Workbook b2 = b1;
Инициализация переменной b1, а точнее, вероятно, вызов app.Workbooks[1], увеличивает счётчик ссылок на возвращаемый Workbook на 1. Но вот эта операция b2 = b1 не увеличивает счётчик ссылок. Поэтому если после того как b2 станет не нужна, если я сделаю Marshal.ReleaseComObject(b2), то b1 тоже будет освобождена и перестанет работать.
Конечно из всего этого можно примерно догадаться, как всё это работает. Но только догадаться.
По существу, я не могу надежно понять, когда счётчик ссылок на КОМ-объект:
1. приращивается автоматически?
2. когда он автоматически уменьшается? В норме релизить через маршал нужно далеко не всё.
3. когда он автоматически НЕ уменьшается после присвоения объекту обёртке значения null, и, возможно, отработки GC.
4. как узнать текущее значение счётчика ссылок на КОМ-объект?
https://docs.microsoft.com/en-us/dotnet/api/system.object.finalize?view=net-5.0
Выводиться должно что-то типа этого:
> The example displays output like the following:
> Instantiated object
> This instance of ExampleClass has been in existence for 00:00:00.0011060
> Finalizing object
> This instance of ExampleClass has been in existence for 00:00:00.0036294
У меня же до Finalizing object не доходит и не выводится в консоль. Даже если ставлю точку останова в финализаторе, до неё не доходит. Почему так?

У меня всё работает, попробуй переустановить шиндоус.
Я никогда не работал с COM через C#. Но потребляю .NET код через COM в С++.
Допустим у нас есть COM visible класс типа Human в C# , при использование в С++, класс можно будет юзать через Human или HumanPtr, так вот HumanPtr - это смарт COM поинтеры, которые очищаются автоматически, а вот если юзать Human - то он останется висеть в памяти и чистеть надо вилкой. Как это разделение будет выглядеть через C# код - наоборот - не знаю.
Теперь, допустим у нас есть массив, какой массив у нас есть в COM? Я лично использую и знаю про SAFEARRAY. Так вот, даже SAFEARRAY наполнен объектами типа HumanPtr - он автоматически не обрабытвается, и нужно вызывать SafeArrayDestroy().
Так что, как мне представляется, твои books - являются SAFEARRAY объектами, которые не обрабатываются, и в C++ коде нужно было бы вызывать SafeArrayDestroy(books). Почему - не знаю, но я хорошо в лужу сел, когда выяснил что у меня память проливается c SAFEARRAY.
У меня будет очень много словарей, у каждом из которых будет по несколько элементов чаще всего 1-3, но в некоторых может быть до ста где-то, подойдет ли для этого Dictionary?
гонять бенчмарки впадлу, да и с листом все норм работает, просто спрашиваю вашего мнения
фриланс/аутстафф? Не хочу за бесплатно работать на конвеерной галере и слушать выебоны какого то прыщавого инфантильного долбоеба. Что имеется:
1. Опыт писания кода на # (около 2 лет) - ASP.NET MVC, Core (за WPF молчу - мервое говно);
2. Английский уровня B2+ (Общение, чтение);
3. Опыт в фронте (такой себе, но ковырял React, могу сверстать под адаптив или поправить, чтобы не наебнулось);
4. Нелюбимая, в тоже время не напряжная РАБотка под $800, на которой стал мертвым грузом и хочу перемен.
Реально залететь на проект и хотя бы за 300-400 американский рупий перенять опыт, носмотреть что и как с upwork или freelancer.com?
Делитесь опытом, кто через это прошел.
А как можно инжектить длл-ки в процесс с помощью шарпа? Есть какие-нибудь гайды нормальные?
На проектах, с которыми удалось поработать, да и в смежных тоже, я какого-то засилия C# не увидел. В довольно крупной конторе, где я сейчас как контрактор работаю, от силы два три репа на C# из 200+. Язык хороший, инфраструктура тоже сейчас отличная стала (я имею в виду поддержку кросс-платформенности), только вот работы интересной походу нет нихуя.

Я не троллю, я не тролль-джавист, я рил спрашиваю. Без наебала.
Тип зырьте, в чём вообще преимущество виртуальной машины над конпиляцией. Это кроссплатформенность. Один раз скомпилил, запустил где угодно.
C# это на 80% веб-петушня, круды-хуюды и прочий фуллстек анал.
За вычетом юнити девелоперов все пишут под винду и в visual studio. К чему вообще эта кроссплатформенность? На линуксе хоть и есть моно, но кривое и никто с linux сервером не будет бэк ебошить на C# когда есть Java.
Мобильная разработка мертва. Ксамарин мёртв. Universal Windows Platform мёртв. C# это язык для крудов. К чему эта кроссплатформенность? Просто чтоб какуджавы?
>ссылкой на скачивание
Это шутка такая или ты правда думаешь, что в 2к21 кто-то будет качать дерьмо по ссылке?
>как в нормальной разработке делают
Вот так: https://lichess.org/source
>Это отсутствие необходимости управлять памятью в ручном режиме.
Паясни. Разве ГК это только с виртуалкой бывает? Разве в ПЩ нет ГК?
> Ну да, скомпилировал под 32 битные ARM системы, запускаешь на 64 битных Intel. Всё так.
Нак нахуя? Ты же это всё равно будешь компилить под одну и ту же архитектуру винсервера?
Думаю что хуйня.
Плюс, на сишарпе не так много вакансий, при этом в вузах его учат, т.е. ежегодно выпускается насколько тысяч студентов, среди которых многие довольно хорошо знают шарп, умеют кодить и при этом как раз готовы идти работать за еду первые пару лет.
Я эт к чему. А вот к чему: Либо переставай из себя целку строить и иди работать как есть, все равно в конечном-то итоге ЗП поднимут; либо вкатывайся в JS, там хоть конкуренция и больше, но средний уровень вкатышей наоборот ниже и если ты осилил шарпы, то уж как-нибудь, да справишься с тем, чтобы с вебпаком каким-нибудь разобраться да npm, а дальше будешь делать кнопочки да посылать запросики.
Еще один чел, что в последний раз смотрел что такое шарп в 2005м?
Под линуксы уже давно есть неткор, а уже и нет5, весь бек шарповский сейчас пишут именно под него. Ну и довольно удобно, что код писать можешь на винде, а работать без какой либо ебли он будет одинаково и на линуксе.
Я даже малинку в качестве сервера для пет проектов использую и все работает.
А вот зачем его сделали на виртуалке в самом начале, в нулевых, когда он под был только под виндой, я понятия не имею. Мб просто хотели чтобы было как в модной на тот момент джаве.
> но кривое и никто с linux сервером не будет бэк ебошить на C# когда есть Java.
Хуя сказанул, на шарпе и пишут только потому что он лучше джавы. Если бы майки не протупили и сделали его сразу опенсорсным, вряд ли джаву вообще сейчас бы вспоминали.
>на шарпе и пишут только потому что он лучше джавы
А в чем шарп существенно лучше джавы? Имхо, принципиальных отличий в лучшую сторону, кроме синтаксического сахара, почти нет. Ну дженерики сделаны по-человечески, да. И костылей меньше, работа с массивами, примитивами, коллекциями удобнее.
Но все это не так уж и критично на самом деле. Видимо поэтому вакансий на джаве больше аж в 2 раза в крупных городах.
>Имхо, принципиальных отличий в лучшую сторону нет
А что это за такие принципиальные отличия? Шарп это не хаскель, а просто лучшая джава. Очевидно что в двух ооп языках, один из которых создавался как копия второго, много общего. Но писать то приятнее на шарпе и это факт. Не думаю что в джаве есть хорошие аналоги ef core, async/await или хотябы геттерам/сеттерам.
Код конечно и без этих вещей можно писать, но блять, кодить можно на любом тюринг полном языке и вопрос состоит лишь в том, где это делается приятно, быстро и удобно.
я писал на JS (react) - нормально, но без ООП это хуйня. Лучше уже жабу дрочить, если работу не найду. Так или иначе - C# мертв на всем, кроме веба, за бугром так то я вакансии видел, но н мидла требования конские, а джуны никому нахуй не нужны. Вот тебе и два стула.
По поводу работы на галере - это зашквар, ибо приходят готовые мидлы (возможно без опыта в интерпрайзе) и их мокают в говно первый год-два. У меня жопа бомбанет от такой хуйни.
Пацантре, у меня возник вопрос.
Предположим в у вас есть tabControl в котором 2 вкладки (tabPage). И вам нужно чтобы при открытии одной из вкладок информация на ней начинала периодически обновляться, а при закрытии вкладки нет.
Так вот, как сделать так, чтобы при открытии вкладки создавался таймер, а при закрытии вызывался его метод dispose?
Если создать таймер при евенте enter, то мы не сможем обратиться к нему из метода leave.
Единственный вариант создавать "глобальный" объект?
при открытии в вижле разделяет тесты на .net2.0, .net3.1 и .net5.0. Как такое повторить? Тесты на Xunit написанны.
ЗП на жизнь хватает, 140, ДС.
Бэк? В плане? Всё на шарпе пишем. Апишек куча старых, написанных как попало, новые да. Тесты почти никто не делает, я в своих проектах клепаю. По эстимейтам не парят, если задачи не очень важные, но задачи у меня, так уж получилось, есть всегда.
походу апихи с простой работой по get-post данных из БД, без особой логики? 140к (я хз, сколько это в $, около 2к походу) - не плохо, думал меньше.
Всегда поражаюсь опенсоурсу, где все обсосано, все по паттернам, дженерики-хуерики, абстракция, тесты. А по факту, с кем не общаюсь - все клепают, только эстимейт закрыть (это не камень в твой огород, просто суровая реальность).
>>1922008
как пример, хотел закинуть пул реквест, чтобы была галочка на CV на участие в проектах, но в нем только разбиратся нужно хуеву тучу времени.
Так или иначе - спасибо за отзыв
Не, простыми крудами тут и не пахнет, тут ты пишешь методы, делающие определенную бизнес-логику. Это сделано для того, чтобы соседние системы своими руками не лезли в наш процесс, а довольствовались лишь некоторыми методами, торчащими наружу. Иногда эта логика конфликтует с плагинами Dynamics, тогда приходится искать по цепочке вызовов, что же именно там происходит. В общем, достаточно весело, да и в бизнес-процессе клиента кое-что понимаю, это интересно.
По поводу быстрого закрытия тасок - тут уж как повезёт с загруженностью и с руководителями. Обмазываться абстракциями и паттернами никто не мешает, главное, чтобы люди после тебя могли доработать проект без особых проблем.
Сам чем занимаешься?
> с плагинами Dynamics
не понимаю, потом погуглю
>Сам чем занимаешься?
финансист/экономист/аналитик/хуй пойми кто
Я летом хотел перекатится - подготовился, CV, пет проекты, вся хуйня. По факту прошел 3 собеса, по одному предложили $200 (типо джун), по другому не прошел по софт скилам (Швейцарская компания), по третьему предложили за бесплатно стажером на 3 месяца.
Сам на решетках уже пишу хуй знает сколько, года 2-3 точно, начинал с WinForms, WPF, потом когда понял, что Desktop мертвый, начал корвырять ASP.NET MVC5, потом Core2.0 и т.д. Сейчас начал смотреть .NET5, по тому опенсоурсу, что скинул выше, что то пиздец, даже влень разбиратся, чтобы закрывать какие то таски в issues.
Планирую поковырять что ни будь, повспомнить, уже много чего из головы вылетело и пытаться вкатыватся, но уже делать ориентир на фриланс или буржуйский аутстаф (напрямую)
Допустим у меня есть апач(чтобы фронт запускать), есть гейтвей, есть пара вебапишек. Все это в докере. Допустим я хочу иметь возможность одним из сервисов какой-то ip получить(чтобы добавить в ЧОРНЫЙ ЛИСТ). Я правильно понимаю что для этого я должен пошаманить с докером? Или можно как-то просто в гейтвее дописать заголовки? Просто я чет не ожидал что у такой вот фигни возникнут сложности, опять же вскрылось это только когда таки в докере запустил, до этого тестил так и нормально ip просто из контекста доставал - все работало, а тут, не то чтобы выжная функция, но раз уж сделал ее - хорошо бы разобраться почему в докере оно не работает. Вернее как, ip-то отпределяется, но видй 172.xxx.yyy.zzz эт сосвсем не тот что настоящий, я гуглил, это вроде как на ip что докер выдает при запуске контейнеров, но я опять же не настолько щарю, просто хотел разобраться как оно работает на самом деле и как надо делать.
Двощик, не бей лучше обоссы, но я совсем дурак и так и не могу понять методы.
Вот смотри, почему если убрать/заккоментить метод Reverse который переворачивает цифры в массиве задом наперед, то всё идёт нормально.
Но когда он выполняется, то он переворачивает и массив который должен оставаться неперевернутым?
Я ведь "создаю" две разных переменных с массивами? Или не "создаю"?
int [] numbers (Этот создаётся в методе GenerateNumbers)
и
int [] reversedNumbers (Этот создаётся путём переворачивания задом наперёд первого)
Или второй вообще не создаётся, а ссылается на первый или как понять?
Или нужно вызывать как-то метод в методе (или прям в Main вызывать метод в методе через метод чтобы было правильно?
Я хотел.
Создать массив от [0] "1" до, например, [4] "5".
Напечатать его,- 1,2,3,4,5
Напечатать его же но перевернутым 5,4,3,2,1
Почему переменная numbers то меняется?
Или мне дальше изучать, а там придёт? Инкапсуляции всякие и прочие приват, протектед нужны?
Да я гуглил же. Хотел посмотреть. И их у меня нет, кек. При том что в мидлваре - прописано все.
Вернее как, они есть, когда запрос идет от фронта или через гейтвей, но если напрямую в контейнер постучаться по тому порту что я ему в докере прописал - нету. А я как-бы исходя из того что каждый контейнер должен быть самостоятельным - хотел понять, почему так вот выходит.
Хотя ладно, наверное надо лучше погуглить. Хотя я вроде гуглил часа 4, на стековерфлоу тоже просто про X-Forwarded-For пишут, на сайте майков так же, на гитхабе видел ишью как раз по поводу того что не удается узнать верно ip клиента из докера, но не стал вникать, оно вроде закрыто было, а значит если это баг, то должны были пофиксить, а если не баг, то хз, я там беглым взглядом не нашел решения проблемы, может жопой читал.

Из-за соображений, почти все, в шарпе являются ссылками(есть еще типы значений).
Когда ты пишешь, что
int[] newArr = arr - ты считай создал ярлычек на рабочем столе. Ты можешь создать много таких, но вести они будут к одному файлику и если ты его удалишь, как-то изменишь или что-то еще, то когда ты будешь пытаться по ярлычку кликнуть - тебе будет выдано то что стало с настоящим файлом.
Аналогия конечно, но для того чтобы суть понять я думаю сойдет.
Так вот, массив - ссылочный тип. Всякие int,double и структуры - значения, они копируются при передачи в метод или при присвоении.
Т.е. чтобы не происходило изменений с исходным объектом - ты должен скопировать его, либо как в прикриплейде - создать новый массив и заполнить его самостоятельно.

Пасиба огромное. Стало понятней.
Побаловался с копированием массива и созданием через метод GenerateNumbers, всё стало чуть ясней.
А вообще, ты молодец что стал разбивать на методы. На начальных этапах многим это кажется не оч полезным, но потом такая боль, когда на реальной работе приходится приучать себя к этому. Лучше это делать сразу, а то как я будешь: 400 строк метод - хех, ну не 600 же; 600 строк метод, ну, бывало и хуже; 2к строк метод - ай, потом отрефакторю.
Я в рот ебал советующих изучить английский.
Пацаны.
Есть такая проблема.
Есть объекты класса. Нужно, чтобы изменение в этом объекте приводили к изменению в control'ах (textBox например), причём нужно, чтобы изменение в разных объектах приводили к изменению в разных контролах.
Как это сделать? Про эвенты я знаю, но как сделать так, чтобы при обработке эневна изменялось свойство нужного мне контрола?

Мой говнокод здеся:
https://pastebin.pl/view/c495c232
Вот, блядь, я наговнокодил штуку. Она работает, клиенты довольны, но там реальный пиздец. Думаю: Проще переписать, чем пытаться рефакторить. Создаю новый проект и часа 2 просто сижу - туплю, думаю о том что и как лучше сделать, а потом удаляю проект и начинаю делать задачи которые стоят. Говнокод копится, рефакторить не хочется, потому что кажется что проще новый сделать. Так уже 3й год идет.

Ты прав, спасибо!
Есть какой либо способ верификации приложения?
Возможно не правильно сформулировал вопрос, объясню на примере.
К примеру есть телеграм бот код которого выложен на гитхаб. Есть какой нибудь способ сделать так что бы юзер мог узнать когда будет писать в этого телеграм бота что код этого бота не менялся.
Понимаю что скорее всего нет но все же решил уточнить.
> код которого выложен на гитхаб
> Дак а причем тут гит?
...
> Есть какой то апи который может верефицировать запускаемое приложение?
Нету. Зато есть системы контроля версий.
Блять, короче. Если ты менял код делаешь коммит (точка сохранения). У этого коммита есть id, вот этот id ты можешь цеплять и сравнивать.
>>1923677
Да вы не поняли просто что нужно.
Еще раз повторю.
Есть к римеру бот на гитхабе. Ну к примеру мне нужно гарантировать что именно бот который я выложил будет запускать юзер.
Но юзер может его скачать и модифицировать, и просто подсовывать нужный хеш.
А мне нужно как то гарантировать что код запущенного бота это код на гитхабе. В частности бот не должен сохранять ни каких данных о пользователе который ему пишет. Но как я могу подтвердить что мой бот не сохраняет данные? Только выложить бота на гитхаб. А как пользователь может проверить вдруг на гитхабе один бот а запущен у меня другой?
Смотрите, допустим есть некая база. В ней есть довольно общая сущность, допустим это товар. У нее есть связанная таблица атрибутов, в зависимосмти от типов товара - там разные могут быть атрибуты, они привязаны через доп-таблицу: ТоварАтрибут
Так вот. Суть в чем. На клиенте для разных типов товара должны быть разные вьюшки. Ну, типа: Технические характеристики, размеры для товаров что имеют эти характеристики, поддерживаемые интерфейсы для товаров у которых есть уже эти вот характеристики.
Ну, собвственно, мне интересно, как это было бы лучше реализовать. Пока что я думаю о том, чтобы просто добавить поле группа для таблички атрибут, ну, соответственно фронту будут отдаваться данные в сгруппированном виде и на нем можно будет просто отрисовать.
Может быть есть какие-то более изящные решения?
Ну, да, чому в шарпотреде - потому что я шарпоняша и это все на шарпах пишется.
Йоу, пацантре.
Такой вопрос. Есть WPF приложение. Нужно периодически проверят коннект с сервером и отображать это. Есть самодельный класс, который отвечает за запись и чтения с сервера. Собна каким образом всё это можно сделать?
Таймер для этого нормально или есть какие-то более современные и нормальные подходы?
1. Сейчас адекватные мобильные игры на джаве не пишут. Используют шарп.
2. Сейчас мобильные приложения пишут на Kotlin. Не на шарпе.
Вопрос: вне контекста трудоустройства, мешает ли мне что-то клепать приложения на шарпе? Просто геймдев у шарпа, как я понял, гораздо лучше чем в джаве. Но и мобильные приложения тоже есть идейки. Подойдет ли шарп и для этого?
вот у меня пример моего говнокода который где много раз повторяются похожие функциии и методы, они работают так же единственное что отиличается так это тип данных, как мне фиксить такое и вместо 20 одинаковых функций под каждый тип данных сделать одну под все без ифов форов и медленных проверок?
>конструктор
Дружище, у тебя статический класс.
>абстракции
Опять же, статический класс.
>много раз повторяются похожие функциии и методы, они работают так же единственное что отиличается так это тип данных, как мне фиксить такое и вместо 20 одинаковых функций под каждый тип данных сделать одну под все
Загугли дженерик классы и дженерики вообще. Они для этого и нужны.
И вообще. Не используй слово static без четкого понимания, зачем оно нужно. Статические классы только в соснольке с сотней строк кода удобно использовать, в чем-то мало-мальски серьезном ты только говна поешь, пытаясь понатыкать лишних статиков.
так ведь для использования например не статических классов я должен буду создавать новый экземпляр класса каждый раз когда я хочу его использовать, учитывая что у меня будет много пользователей и много данных мне никакой памяти не хватит что бы хранить все эти экземпляры отдельно
нет, сингелтон точно не используется, потому что дб может изменять свое состояния и кешировать данные динамически, сингелтон это вообще про другое, насчет Dependency Inversion я не совсем понимаю к чему ты это, это просто паттерн, и да я спросил именно про то какие образом можно реализовать такой патерн в концепции inMemoryDataBase
>я спросил именно про то какие образом можно реализовать такой патерн в концепции inMemoryDataBase
1. Убираешь статики
2. Делаешь класс дженериком и сокращаешь с помощью этого код
3. Делаешь для класса интерфейс и наследуешь его классом
4. Используешь DI-фреймворк/пилишь DI вручную (по сути хуячишь инстанс своего класса в ~мейне и прокидываешь этот инстанс через конструкторы или методы к классам, где он нужен)

Ты троллишь, что ли, блять? Памяти у него не хватит, видите ли, если создавать объекты. Профилировал уже?
Пиздуй пикрелейтед читать.
> ведь для использования например не статических классов я должен буду создавать новый экземпляр класса каждый раз когда я хочу его использовать
С хуя, лол?
Вот серьезно, с какого хуя-то? Ты можешь создать один экземпляр и передавать его сколько хочешь кому хочешь. Можешь ебануть синглтон и закрыв конструктор получать один и тот же экземпляр откуда угодно.
>я должен буду создавать новый экземпляр класса каждый
>насчет Dependency Inversion я не совсем понимаю к чему ты это, это просто паттерн
На пальцах.
1 изначально дергаем статик класс зависимость или синглтон зависимость прямо из класса. Работает, но все прибито гвоздями и невозможно ни нормально тестировать, ни подменить реализацию
2 Вносим Dependency Inversion - не лезем к зависимостям сами, а получаем их через конструктор. Тестируется на отлично и подменяются реализации. Но как результат - нужно создавать экземпляры
3 И если у нас экземпляры, то как же синглтоны? Решение простое - прокидывать всем один и тот же экземпляр зависимости.
4 И тут на сцену выходят IoC контейнеры (которые суть автофабрики, которые рантайм просто пишет за нас) и в них декларативно задается время жизни зависимости в рамках контейнера.
И поскольку все создается с помощью IoC контейнера, то он позаботится о том чтобы все получили один и тот же экземпляр "синглтона"
любой, кто увидел static, разумно делает предположение, что нужен синглтон
ведь для этого static и применяется - не создавать экземпляры.
и реализовать опять же очень просто - нужные разные экземпляры...так создавай разные экземпляры там, где они нужны разные.
Проблемы то нет
>Решение простое - прокидывать всем один и тот же экземпляр зависимости.
не валидно
судя по постоянными переложениям юзать синглтон я понял что никто не читал код который я выложил поэтому объясню на пальцах
для каждой сущности (продукты, счета, и тп) данных свой класс, а для каждого пользователя свой экземпляр с ЕГО сущностями
сейчас работает так, 20 классов которые возвращают из физической базы и кешируют в память свои сущности, они биндятся в 20 словарей под каждую сущность, ключем является пользователь, данные обновляются реальном времени, а если пользователя нет/сесия пользователя нет, то и данных нет/данные удаляются
и очевидно что все словари с данными должны ДОЛЖНЫ быть статическими, и их должно быть 20 по каждому на сущность, другой вопрос нужно ли мне 20 статических классов которые возвращают каждый сво сущность или это можно сделать умнее
конечно не читал. никто не понял зачем нужен этот инмеморидб и что он делает
а когда увидел множество "new Thread()" то тут аж сердце прихватывает от такого
А "20 классов" - ты тут криво описал нечто похожее на обычные repository с кешированием внутри себя.
>не валидно
конечно не валидно. ведь это середина истории. А самая суть под пунктом 4
>что все словари с данными должны ДОЛЖНЫ быть статическими
ты путаешь понятие "статический" и "один для всех". Для "один на всех" не нужно быть статическим - достаточно сделать так, чтобы был один инстанс для всех
Тебе нужно понять концепт
Задача разбивается на ответственности. Затем, в соответствии с SRP, реализуешь классы, где каждый класс отвечает за свое.
Далее из этих классов (как из кубиков) собираешь граф объектов с зависимостями.
Ну а потом просто пнуть его и оно заработает.
И вот тут при создании графа ты и решаешь что должно быть в 1 экземпляре, а что создаваться каждый раз. А еще есть скоупы, где экземпляр переиспользуется в рамках скоупа.
Вот эту концепцию вкури, а "статики/синглтоны для того чтобы он был один" забудь как страшный сон
Можешь не любить IoC, а написать код инстанцирования руками (IoC просто генерит тот же код за нас, позволяя нам декларативно задавать).
Статики/синглтоны - зло
Экземпляры, но гарантирована1 штука - добро.
У тебя класс inMemoryDB, у тебя 20 классов реп, которые читают из бд. Каждый из них может кешировать тупо в словарих внутри себя. А может быть у них общий кеш - тогда еще один класс. И все это НЕ-статическое.
А что из них создается каждый раз, а кто один раз - решит тот, кто собирает граф.
ну смотри, предположим у меня 10 пользователей, они будут получать данные по своему айди но данные у них одинаковые, тот же набор продуктов и тп, правильно я понимаю что с нестатическими классами они все забиндуют в словарь 10 одних и тех же копий тех же данных, но в разных потоках которые не будут иметь отношения друг к другу? потому что мне кажется что именно так и будет и это уже не похоже на базу данных в памяти, это просто кеширование,

> new Thread
Ты же понимаешь, что я описал DI-реализацию ТВОЕГО кода с ТЕМ ЖЕ функционалом? Где вместо статика (который по определению является одним инстансом) мы используем один инстанс? Пиздец у тебя каша в голове.
А по факту делается это так:
1. Добавляешь в интерфейс строку
static void GetInstance() => throw new NotImplementedException();
2. Добавляешь в класс строку
static void GetInstance() => new inMemoryDB();
3. Вместо имеющегося инстанса кидаешь в конструкторы _instance.GetInstance()
А по факту это не делается, а используются DI-фреймворки, которые делают все вышеперечисленное вместо тебя, а тебе нужно написать одну строку. И ты бы быстро нашел этот функционал в любом из них, потрать ты хоть секунду на изучение темы, а не беги на двачик с вопросом, который при твоем непонимании статиков объяснить примерно нереально.
А в чем проблема лока кроме того что он статический? и что в данном случае можно использовать кроме сторонних фремворков?которые типа "написал строку и ок" а в реальности "написал строчку и там выполняется полная каша которая делает код процентов на 200 медленнее как например с ЕФ
Можно, например, использовать ConcurrentDictionary. Тогда, может, кому-то и захочется читать ту простыню.
На Энтити гон абсолютно необоснованный, он генерирует запросы, которые от рукописных отличаются только переименованием полей. В два раза медленнее он, потому что вместо тебя реализует вот это кеширование, транзакции и другое.
Так вот, когда я пробовал вот так вот
Dictionary<string, Dictionary> - студия меня матом послала, дескать нужно указать типы для ключа и значения. Но ведь в том и суть что мне нужно чтобы словари что являются значением - могли быть любыми. При этом хотелось бы чтобы тип был виден нормально и не нужно было преобразования эти делать.
Есть хак какой-нибудь, кроме как: Dictionary<string,Dictionary<object,object>>?


Experience with ADO.Net, MVC, WebAPI, SignalR
Experience with Lucene.NET
Knowledge of JavaScript, TypeScript
Knowledge of xUnit, MsTest, Moq
Experience with SQL (Microsoft SQL Server)
Familiarity with Agile process, Scrum, Git
Можно завернуть Dictionary<object, object> в класс Yoba и прописать проперти Type - будешь хоть как-то видеть тип. Или завернуть Dictionary<string, Dictionary<object, object>> в класс Yoba и прописать свистоперделки для удобства. А так - только Dictionary<object, object>, динамическая типизация не предусмотрена, так что придется иначе ставить задачу или терпеть неудобства.
>>1926921
Так можно сделать, но по сути это то же самое, что Dictionary<object, object>, только без предохранения от Студии и компилятора. Любой обосрамс в коде ебанет только в рантайме, и местами выявить проблему очень непросто. Лучше писать эксплицитно Dictionary<object, object> - меньше вероятность выстрелить себе в ногу, хоть и придется везде прописывать приведение вручную.
Два года назад стал разработчиком. Писал на C#, в основном на фреймворке Террасофта (бэк на C#, фронт на их специфическом JS).
Сейчас у компании свой новый проект на Java, без Гибернейта и Спринга.
В каком направлении развиваться. Я работал немного с Java в своё время, он показался мне всратым по сравнению с дотнетом. Но вопрос в рынке труда и перспективах.
Плюс, на изучении чего сосредоточиться, какие вопросы нужно хорошо знать, а что можно подглядеть по ходу работы?
Можно как-то в WPF'e с код бехайнда изменять текст в TextBlock'e с разметкой/форматированием?
Вот такая хуита https://stackoverflow.com/questions/53508956/wpf-c-sharp-how-to-set-formatted-text-in-textblock-using-text-property кидает на каждый чих эксепшн (<UnderLine> not found).
Когда вас спрашивают кем вы работаете - вы скрываете, что пишите на C#? Это ведь зашквар.
Не понял что ты спросил.
Пишу на винде, потому что студия тупо удобнее чем все всякие vsCode и дргуие говноредакторы, типа райдера. И попробуй пусть хоть один пидорас скажет, что студия неудобна, почти каждый плсюовик - в ней кодит, хоть и не все признаются. Просто вот так уж вышло, что по факту - лучше студии и нет ничего для разработки. Разве что в нишах всяких, типа под яблоко - лучше их xcode (или что там у яблочников сейчас, я давно не следил), под андроид - андроидстудия; но если смотреть в общем - студия все еще остается лучшей иде, если ты на плюсах или языке из .net кодишь.
А то что пишу сейчас - запускают как на линуксах, так и на винде.

В базе уже есть таблица с результатами, только они сохраняются в конце. Я хочу переписать так чтобы запись апдейтилась после каждого вопроса. В таблице есть поле - перечисление ответов, туда запихивается сериализируемый list<answer>.
Дальше у меня начинаются вопросы. При загрузке теста нужно определить есть ли запись или нужно начинать новый тест. В начале я подумал что нужно доставть тот лист и смотреть сходятся ли каунт листа и каунт вопросов, но это мне не совсем подходит. Дальше я подумал что мне нужно добавить флаг - пройден ли тест, но добавить поле в таблицу не совсем правильно т.к. у меня шифрование/безопасность и юзверь может залезть в файл бд и поменять флаг. Дальше я подумал что нужно этот флаг засунуть в само поле ответов, т.е. в лист, но лист это перечисление ответов, а мне нужно записать как-то поверх него вот этот стейт. Подумал записывать в поле словарь, но у меня не соблюдается уникальный ключ, т.е. ответы могут быть идентичными. Короче как это правильнее реализовать? Или можно как-то юзать словарь без уникального ключа?
Так и не понял в чем проблема еще одну таблицу создать и что там у тебя шифруется и почему новая таблица не будет шифроваться.
У тебя ответы в ОЗУ "шифруются"? В чем проблема юзеру сейчас "залезть в файл бд и поменять" что-то?
Хуй знает. Непонятно что там у тебя накостылено. Нарисуй на бумажке нормализированную схему БД типа: Test (Id, IsCompleted), AnwerFact (Id, QuestionId,...) и подумай, сможешь ли ты осилить рефактор нормальный.
Подскажите куда смотреть. Нужно получить доступ к скроллу другого приложения.
Что для этого надо?
Где можно почитать что у синьёра на собеседовании обычно спрашивают? Интересующий стек ASP.NET MVC/Web Api + вопросы по самому шарпу.
let me google for you
https://stackoverflow.com/questions/5272177/console-writeline-slow
Why Console is slow:
Console output is actually an IO stream that's managed by your operating system. Most IO classes (like FileStream) have async methods but the Console class was never updated so it always blocks the thread when writing.
Console.WriteLine is backed by SyncTextWriter which uses a global lock to prevent multiple threads from writing partial lines. This is a major bottleneck that forces all threads to wait for each other to finish the write.
If the console window is visible on screen then there can be significant slowdown because the window needs to be redrawn before the console output is considered flushed.
Что почитать по azure?
Приложение на asp накидал(простенькое говно), подумал что стоит повоевать и в ту сторону.
Я хз с чего как найти то что надо мне.
Вопрос такой. Есть такая игра path of exile, для нее есть сторонний софт который по нажатию клавиш получает данные о предмете из игры. И вот вопрос как он получает данные из игры ?
Вот пример такой программы. Она сильно сложная для меня. Хотелось бы сделать что то похожее но вот не могу понять как программа получает данные о предмете, на сайте игры ничего нет такова(
https://github.com/domialex/Sidekick
Есть один паттерн для написания приложение на WPF под названием MVVM. Узнал об этом паттерне несколько лет назад, за это время успел выучить Python на нормальном уровне, но ебучий MVVM так и не освоил.
Я могу без проблем передать свойства объекта из View в Model, вернуть их, отобразить, с этой частью проблем нет.
Но ебучее нажатие на кнопку реализовать - это же тотальный пиздец. Какие-то нахуй ICommand айхуйкомманд, RelayCommand на несколько десятков строк, да это, ебись оно в рот, не стоит того ради выполнения пары строк кода для изменения интерфейса.
А когда начинается открытие дополнительных окон в приложение то всё нахуй, дальше пешком быстрее будет.
Есть какой-то нормальный аналог этому паттерну? Я с этим говном заебался возится. Костыль на костыле, блять, и никто этого не видит.
Справедливости ради - сам-то паттерн понять не проблема.
Хуйня в том, что он не нужон и вообще больше проблем вызывает, особенно в контексте WPF. Ыыыы, как весело сидеть с профиллировщиком и искать где же ты от INotifyPropertyChanged забыл отписаться.
А вообще, большей справедливости ради - WPF - говно. Серьезно. Лучше чем формы не придумали еще. Вот это как раз охуенная штука была: пишется легко, работает быстро, куча вещей прямо из коробки, еще и не нужно эту залупу XML'нуй под названием ЗАМЛ использовать. Если бы я все еще писал под десктоп, тем более виндовый - то брал бы формы, охуенная штука была, однако.
>Но ебучее нажатие на кнопку реализовать - это же тотальный пиздец. Какие-то нахуй ICommand айхуйкомманд, RelayCommand на несколько десятков строк, да это, ебись оно в рот, не стоит того ради выполнения пары строк кода для изменения интерфейса.
Ну, раньше как было? Нажал на кнопку, сработало событие, которое вызвало нужный метод. А ща нажал на копку, сработало событие, которое вызвало команду, которая вызвала метод, который на нее подписан
Прошел 40 уровней джавы, начал переводить один исходничек на джаву, который был только на пайтоне, да так там всё охуенно, что я на 3 месяца в пайтон перекатился и прошел лэтпай. Но сейчас понимаю, что пора бы и честь знать, надо взрослый компилируемый язык учить. Свёлся к шарпам... но ссука открываю это после 3 месяцев питона и плакать хочется, как не хочется опять в эту джаву. Уговорите меня, пожалуйста, парни. Дайте леща, что бы я с питона слез. Как мне обмануть мой мозг? Чем питон хуже сишных? Ведь там, где я два дня матерился в джаве, в питоне я просто пару строк практически наугад написал и оно заработало.
Ну так шарп не джава, а язык в котором можно умереть от сахарного диабета. Думаю, код на нем лаконичнее чем на питоне.
> Ведь там, где я два дня матерился в джаве, в питоне я просто пару строк практически наугад написал и оно заработало.
Наведи пример задачи плез.
У меня ситуация обратная. Я блять искренне не понимаю людей добровольно идущих на питон после джавы/шарпа/плюсов(особенно после плюсов), это же конченная песочница в которой буквально все сделано за тебя и ты как макака импортишь модулей 20 и пишешь 3 строки кода. Да я js уважать стал, когда увидел что творится на питоне.
>А почему формы умеют
а кто сказал что такой подход правильный
>Может WPF еще и в кнопки уметь не будет и надо свой контрол писать?
Кнопки это базовый функционал и нужны каждому. Более того, они нужны как "кнопки разве что с разным внешним видом" в отличие от графиков, где каждому нужно свое
https://dotnet.microsoft.com/download/dotnet/thank-you/runtime-desktop-5.0.2-windows-x86-installer
Среда выполнения .нет 5 весит 47 в сжатом состоянии. У жавы не знаю, можешь зайти и скачать самостоятельно.
У меня синдром дефицита внимания, мне сложно концентрироваться долго на определенных вещах, собственно я невнимательны и расссеяный но это касается только мелких вещей, забыл кому поставить, забыл букву написать, пропустил слово на диктанте и тп, но я слышал что в современных программах для писания кода все так умно что программа сама подсказивает тебе что писать, что забыл написать и где программист допустил.
Так какой шанс вкатиться в программирования?
Я б с радостью, дружочек-пирожочек, но я до лета перекинулся на дроч егэ.
Нет, я не школьник, мне 30. Ага..
Взял 5 доп. предметов для сдачи на егэ. Хочется сдать хотя бы 2 + рус.мат. Я ебанутый немного,- жить не хочется ну, чуть больше чем обычно уже спустя неделю подготовки. Помогает, разве что, что мне кроме этого и работы ничего делать не нужно т.к друзей нет, растительности нет, населена фаготами.
Но будет интересно посмотреть чего ты достигнешь. Напишу через год, постараюсь не забыть.

Допустим, вот пример на пике это как раз та хуйня о которой я говорю.
Так вот, допустим мне хочется чтобы в наследниках я мог получить явный тип, а не интерфейc. При этом мне не нравится вот эта вот залупистика с дженериками.
Есть ли какой-то более изящный способ получить подобное поведение?
Может быть тут непонятно. Но вот реальный пример. У меня есть TCP-сервер на сокетах. На одном порту слушаются и обрабатываются одни сообщения, на другом - другие, на третьем третьи и т.д.. Я хочу иметь возможность получить явно тот тип сообщения и не париться с приведением типа. Потому я TCP серверу ебанул в параметрах женерика - тип сообщений, чтобы можно было прокинуть нужный парсер и обработчик. Но эти дженерики оч сильно раздувают код, оч тяжело читать, оч тяжело потом что-то изменять, мне хочется от них отказаться, а как - хз. Пока что я думаю о том, чтобы вообще просто уйти от наследования и просто сделать два несколько классов, которые просто повторяют частично логику друг друга, да будет копипаст, но будет и легче с этим вот работать, если что-то поменяется, я буду смогу меньше костылей использовать, потому что сейчас иногда выходят жуткие способы обойти наследование. Как второй вариант - я думаю о том, чтобы этот базовый класс уже превратить в сорт оф компонент и просто его передавать в конструкторе дочерним, а общение с ним на события повесить.
Вот примерно про это я писал:
import pyodbc
driver = 'SQL Server'
server = 'xxx.xxx.xxx.xxx'
database = 'Peoples'
uid = 'Кулхацкер'
pwd = 'pwd'
cnxn = pyodbc.connect('DRIVER=' + driver + ';SERVER=' + server + ';DATABASE=' + database + ';UID=' + uid + ';PWD=' + pwd)
cursor = cnxn.cursor()
cursor.execute("UPDATE Freaks set Huy = 'Pizda' WHERE Gender = Transgender")
cnxn.commit()
>>1932026
Т.е. понимаешь, да?
На питоне я ничего даже не написал. Просто настройки и собственно SQL запрос. У меня первая мысль была - а что тут учить то надо, какие библы импортировать штоле?
А шарпы с джавой я сравниваю чисто по синтаксису. Ну одно и то же ведь. Только на джаве я бы для этого неебическую портянку писал и еще оно бы не работало с полоборота, ебался бы два дня.
мне нужно вывести таблицу в datagridview с определенным значением, но проблема в том , что если переменная в sql запросе написана на английском, то он ее находит и выводит без проблем , а если на русском, но он нихуя не выводит, кто знает как это пофиксить?
>>1931794
Можно всё сделать через операции: прокидывать в args[] Main название операции и главу, например, Chapter_1, Exercize_8 кидаешь, все упражнения у тебя наследуются от абстрактного BaseExercize, где у тебя есть абстрактный (или виртуальный, тут как хочешь) метод Process
Отбираешь нужный класс
var operation =
Assembly.GetExecutingAssembly().GetTypes().Where(t => t.Name == args[1] && t.Namespace.Contains(args[0]) && !t.IsAbstract && t.IsSubclassOf(typeOf(BaseExercize))).Select(i => (BaseExercize)Activator.CreateInstance(i)).FirstOfDefault();
operation?.Process();
Всё это получается через рефлексию, хреново оптимизированно, но можно обойтись без кучи проектов
Ну и естественно аргументы - имя класса и неймспейс (или его часть)
>сырой скл
>2к20
Ты сейчас серьезно? В шарпе конечно немножко больше надо ебаться - обьявить свои классы для модели, сделать свой контекст и указать какие в нем таблицы, но это же делается чисто для того, чтобы ты потом вместо
> UPDATE Freaks set Huy = 'Pizda' WHERE Gender = Transgender
Написал
>foreach (var freak in dbcontext.freaks.Where(t => gender == Transgender))
> freak.huy = "Pizda";
>database.SaveChanges()
И при этом шарп за тебя еще базу данных со всей моделлю, если ее нет, создаст. И при этом будет еще следить за изменением всех моделей, чтобы ты в одну консольную комманду мог синхронизировать бд модель с шарп моделью. И да, в 2к20 на шарпе даже скл можно не знать, ведь запросы пишутся на шарпе и юзают шарповые типы.
Но настройка это одноразовая, при создании проекта. В самом же коде тебе этот контекст даже создавать не нужно - просто передай его как аргумент в конструктор твоего класса-сервиса, и шарп сам создаст контекст.
А твой вариант подойдет разве что для одноразового скрипта к существующей базе данных. Но никак не к основному приложению, для которого создается бд.

Условно есть параметр "удача на побег", обозначен массивом int[] luck = { 0, 0, 0, 5, 6 };, который в процессе игры может меняться каким либо предметом, повышая параметр.
Сам он работает так - бросается игровая кость АКА рандомное число переменной dice от 1 до 6, если значение из массива равно значению на игральной кости, то игрок сбегает.
Проблема: не могу понять как сравнить значения в массиве со значением переменной.
Пробовал через for (int i = 0; i < length; i++); { if (dice == luck; ... }, но значение i всегда было равно 0.
Сейчас сделал через сравнение каждой отдельной переменной в массиве - if (dice == luck [0] || dice == luck [1] || ... || dice == luck[5]), но есть же по-любому способ компактнее это сделать
Please help.
Если ли какой нибудь способ описать группу элементов на xaml, а потом в том же ксамле вставлять что-то типа <myGroup></myGroup> несколько раз
>for (int i = 0; i < length; i++); { if (dice == luck; ... }
Точка с запятой не нужна, т.к. это означает, что ты закончил описание цикла. То есть следующий блок кода в { } расценивается как отдельный блок со своей зоной видимости и не более.
В твоём случаи, можно сделать либо так:
for (int i = 0; i <luck.length; i++){
if(luck == dice){
//побег
}
}
Либо можно воспользоваться этим https://docs.microsoft.com/ru-ru/dotnet/api/system.array.exists?view=net-5.0
Но первый это самый очевидный способ и он не содержит в себе никаких недостатков, помимо того, что занимает 5 строки кода, место 2 или 1
>на нем же дохуя всякого барахла еще крутится
Ну вбей в гугл 'check if port free %OS%' и проверь свободен прт или занят. Плюс можно на вики посмотреть
https://ru.wikipedia.org/wiki/%D0%A1%D0%BF%D0%B8%D1%81%D0%BE%D0%BA_%D0%BF%D0%BE%D1%80%D1%82%D0%BE%D0%B2_TCP_%D0%B8_UDP
>А если я написал охуенное приложение, которое все покупают и используют?
Подай заявку в IANA https://www.iana.org/form/ports-services, и другие смогут нагуглить что этот порт использует hellowrd Пупкина.
>Тогда ведь их сервера мне не подконтрольны.
Но тогда и айпи тебе не подконтрольны, а значит надо клиенту где-то указывать IP, тогда там можно и порт попросить указать.
>а значит надо клиенту где-то указывать IP, тогда там можно и порт попросить указать.
Да, и вот потом клиенты будут в тп обрывать телефоны, какой порт писать. Почему 555 не работает, ряяяя.
Вот в промышленности проще с этим. 502 - modbus tcp и все. Хоть и можно порт указывать в программах, но никто этого не делает, есть уже выделенный
>Да, и вот потом клиенты будут в тп обрывать телефоны, какой порт писать. Почему 555 не работает, ряяяя.
Так это проеб админа, если у него серв слушает 15000 порт, а клиентам сказал подключаться на 17000. Тут уж какой не выберешь порт можно поломать. А вдруг ты выберешь порт ххх, а он у кого-то фаерволом заблочен? В общем ты пытаешься решить проблему, которой нет.
>Тут есть версии же, с какой начать изучение?
Спроси у заводчан. Ты же, наверно, не единственный там программист (а если единственный - сочувствую). Какую версию дадут - такую и изучай. Если ты в свободном полете, то изучай сразу .NET 5.
На самом деле, с фреймворка на кор и обратно можно пересесть за неделю-две, они во многом похожи. А для дроча всяких циклов-ветвлений в процессе обучения разницы между ними вообще нет.
>И вообще, как язык сам по себе: трудный, лёгкий?
Примерно средний. Местами может быть не очень понятным (например, со ссылочностью типов), но когда начинаешь о языке иметь представление - он становится охуенно удобным и понятным.
Алсо, если нет опыта программирования - не рассчитывай, что даже через месяц интенсивной учебы сможешь писать хороший код. По-нормальному нужно уделять на учебу пару месяцев, и желательно еще ментора иметь хотя бы на работе, но я хз, как у тебя с этим дела обстоят.
> с какой начать изучение?
С второй. Раз уж так о легаси волнуешься.
А вообще с любой на самом деле, разница там не так велика.
> А если будет легаси год, то придётся и старые версии знать?
Что это значит? Версии языка отличаются в основном тем что тут мы можем написать array[1..5] а там - не можем, тут у нас есть рекорды, а там - нету.
> Может кто пояснить за версии
https://docs.microsoft.com/ru-ru/dotnet/csharp/whats-new/csharp-version-history
> И вообще, как язык сам по себе: трудный, лёгкий?
Если говорить о том, чтобы сесть и что-то работающее написать - легкий(я сравниваю с сишечкой и асмом, которые были в универе). Если начать копаться в кишочках, то любой язык - сложный.
Лол, ты серьезно думаешь, что на заводе, где ВЕДУЩИЙ ПРОГРАММИСТ, обычно получает что-то в районе 60к-80к - какой-то адовый отбор и дроч?
Я вот когда в вузе диплом писал, как раз проходил практику на заводе, так вот, за время практики на всего пришли 5 человек, 4 из которых впервые вообще ИДЕ видели и по образованию эт были прикладные математики, ну и хули, дали им книжку, интернет - за месяц изучите, через месяц мы вам придумаем какую-нибудь работу, справитесь - возьмем на постоянку. Никого, блядь, не отсеяли, даже тех кто не справился с элементарными задачками - послали в сисадмины, кек.
>Спроси у заводчан.
Я там ещё не работаю. Я пока планирую изучить C# потому что он там требуется, C/C++ как плюс, но не обязательно вообще. Просто знаю что там требуется такой чел, а в моей мухосрани людей, знающих, что такое C# максимально минимальное.
>>1933437
>Посмотрим как быстро скобачьки с твоей рожи слезут
А ты чего такой обиженный то? Опять дропнули на собеседовании из-за того, что ты не можешь жопку свою продать? Ну не расстраивайся, как через полгодика-год обучения шарпа, устроюсь на заводик, напишу тебе, будешь стажироваться у меня под столом.
Это не у меня розовые очки. Это у тебя и таких, как ты - серые. Вы думаете, что надо хуеву гору времени потратить, чтобы найти нормальную работу.
На своём опыте убедился, что сами знания в программировании решают процентов на 25 при трудоустройстве. Остальное это наглость, уверенность, чувство юмора и умение найти и решить то, чего ты не знаешь и не понимаешь и самое главное понять, как это работает и запомнить. Всё.
>Вы думаете, что надо хуеву гору времени потратить, чтобы найти нормальную работу.
Для большинства людей так и есть. Каждый знает хотя бы одного человека, который с шутками-прибаутками, не зная совершенно нихуя, спокойно устраивается куда захочет. Проблема в том, что эта стратегия работает только у него, а всем остальным шутки на собесах ничего не дают. Там, где взяли одного шутника - завалили сотню не менее компетентных людей, которые не наглость и уверенность поможет, а только бог.
мимо

Есть ли декомпиляторы которые сразу могут накидать дизайнер формы или какие-то инструменты скрипты которые могут это пофиксить?
Кстати у нас например если кандидат дохрена либиться таких даже не рассматривают, улыбнуться им в ответ и скажут мол "мы перезвоним", у хорошо программиста всегда ощущается проффДрифт на характере, самые охуенные програмисты нихуя не ладят с людьми, черты программиста отражаются на харатере и это уж точно не "умение шуточки шутить и либиться на все зубы" хочешь шуточки свои ебаные шутить пиздюй в бугалтерию к тете Любе
public MhiPerIncome()
{
Remainder = 0;
IncomeAmount = 0;
PartsOfMhiAmount = new List<IncomeModel>();
}
Почему последняя строка нормально работает в VS 2015, а в старых версиях выдается ошибку "PartsOfMhiAmount is read-only" ?
Я могу забайндить СелектедАйтем, потом найти его строку или колонку в дататейбле, а потом удалить их. Но это хуйня какая-то, совсем неэффективно, особенно если таблица большая. Если бы я мог сделать байндинг на номер колонки и строки например - все было бы намного проще, но я могу сделать бацндинг только на номер колонки - а на номер строки никак.
Он не занимает меньше места, более того, если ты не всегда используешь статичный класс, то сделав его не статичным ты сэкономишь оперативную память.
>почему не делать статиком все что можно?
А если тебе нужно n экземпляров каждый из которых будет хранить своё состояние?
>Он занимает столько же но не повторяется в отличии от не статиков
Ну вот я тебе и привел пример в котором твой статик будет занимать больше места. Допустим у тебя в программе есть условие и выполняется оно раз в сутки, после выполнения идёт вызов метода класса. Ты этот класс сделал статичным, т. е. он у тебя занимает n места на протяжении работы программы. Кто-то его сделал не статичным и он у него занимает n места только один раз за сутки.
Теперь представь, что таких классов нужно не 1, а несколько тысяч. Если сделать их всех статичными, то тебе может не хватить места для того чтобы программа работала, при этом во втором случае достаточно распределить ресурсы оптимальным образом для того чтобы всё работало. И если даже тебе хватит места для хранения тысячи статичных классов, то все у тебя будут спрашивать, почему твой вариант с статичными классами постоянно жрёт несколько гигов оперативной памяти, а другой вариант без статичных классов потребляет в разы меньше в любой промежуток времени.
Сап програмач. Только что не перезвонили после тестового. Сказали что по функционалу всё ОК, а арохитектура как у уебана.
Где можно щаблон проекта ASP,NET MVC Core красивый найти. Ну и что по архитектуре почитать?
Лучший способ попросить ьу них ознакомиться с исходным кодом, потому что все зависити от того как ПРОЕКТИРУЮТ они, у меня часто бывало что прихожу мне говорили архитектура говно, делаю как у нас, начала делать, прошло время, прихожу к другим, то же самое, архитектура говно делай как у нас, у всех свои мерки, свои конвенции, поэтому изучи их код и подстройся к их конвенциям
Даже если бы статик в твоей программе давал буст по памяти/времени (которого обычно в лучшем случае нет, в худшем - от статика идет убыток), то ты бы все равно его не использовал, потому что если это так - то у тебя требования к производительности настолько дикие и код настолько низкоуровневый, что ты должен не статики хуячить, а unmanaged код.
А плох статик потому, что он с солидом не совместим от слова "совсем" и поощряет написание адского быдлокода, который невозможно ни поддерживать, ни расширять. Используй правильные скоупы в IoC-контейнере и не выебывайся.
>А чем плох низкоуровневый код
Ничем. Просто C# - язык высокоуровневый и применяется чаще всего именно для высокоуровневых задач. И если ты пишешь условное приложение для десктопа, оптимизируя каждый бит в памяти - ты хуйней занимаешься вместо разработки своего приложения. Реальность такова, что требуются фичи и багфиксы, а не оптимизация всего подряд.
Конечно, есть задачи, когда оптимизация кровь из носу как нужна, но даже там не пишут все через статики, ибо:
>удаление не нужных статиков
Ты как себе это представляешь? Статики по определению не могут наследовать IDisposable и потому статический инстанс не удаляется ни GC, ни руками. Про кеширование тоже непонятно - статик у тебя висит всю программу, от запуска до выхода. Че ты там кешировать собрался?
Короче, прочитай, что такое статики вообще, и вопросы отпадут. И бога ради, не превращай код в говнину лишними статиками. Если тебя волнуют вопросы оптимизации - всегда есть unmanaged код, который C# поддерживает.
>удаление не нужных статиков
просто удаляешь не нужные данные из класса и оставлфяешь статик пустым, все, он не занимает места, практически.
>требуются фичи и багфиксы
зачем фиксить если можно писать быстрый код без багов?
>не превращай код в говнину лишними статиками
какая разница что код не читабелен и выглядит как спагетии, главное что бы все работало быстро и что бы ты мог в этом ориентироваться, а если надо будет что-то дописивать, ну так пусть заплатят мне денешку а не будут искать какого-то говноджуна или прости господа индуса потмоу что они тупо не смогут понять что там написано
>просто удаляешь не нужные данные из класса и оставлфяешь статик пустым, все, он не занимает места, практически.
Ебнуться можно. Ты вообще представление о том, как в C# работает память, имеешь?
>зачем фиксить если можно писать быстрый код без багов?
Напиши 10к строк статиками, посмотрим, как мало у тебя будет багов.
>какая разница что код не читабелен и выглядит как спагетии
А такая, что если тебе понадобится кому-то код показать или посмотреть его самому спустя год - ты знатно охуеешь.
>главное что бы все работало быстро
Опять же, в лучше случае разницы с человеческим подходом не будет, в худшем (и самом распространенном) случае статики производительность отнимут.
>а не будут искать какого-то говноджуна или прости господа индуса
Ты случайно не помогал писать программу для голосования в Москве? А то звучишь как бюджетник с соответствующей квалификацией.
Заебал, короче. Если тебе реально интересно за производительность - читай Рихтера и MSDN, спойлер: статиков там нет. Если тебе хочется просто набыдлокодить максимально мерзкий код - вперед и с песней, сам же говна поешь за обе щеки из-за этого.
я мимокрок.
конечно можно обнулить поля в статик классе, только это будет уже говнокод.
даже в какой то книжке по чистому коду рекомендуется для задачи создать граф объектов и потом новый граф для нового случая, а старый позволить скушать GC, а не делать методы типа Init(newState) пытаясь сэкономить на "ну у нас же все уже есть, только немного подменить новыми данными".
Лично у меня такие статитки допустимы только в разном кешировании при кодогенерации, правда обнулять их нет смысла, ведь они кеш
В возможном нарушении инвариантности класса, что нежелательное явление.
Конечно может работать без побочных эффектов - мы ведь знаем про "чего где когда вызываем обнуляем". Но и метод на 10к строк может работать идеаьно - однако это говнокод.
Код должен стараться быть стабильным по максимуму не заставляя тебя помнить про возможные побочки
Но десериализовать Newtonsoft Json не хочет по понятным причинам - у него нет сведений о том, куда запихивать элементы этой коллекции, а в абстрактный класс нельзя.
Есть два стула. 1) создать конвертер, который указывает каждому экземпляру его тип
2) использовать не List, a ArrayLIst.
Что выбрать?

что лучше, код который заставляет тебя писать документацию и описивать функционал но который работает быстрее и который требует от клиента что бы с ним работал только ты, или пикрил который работает медленно, который может написать даже дедушка с деменцией но зато все согласовано с современними подходами к программированию?
>но который работает быстрее
насколько быстрее? На 1% в лучшем случае? Насколько это оправдано?
Так что очевидно второе. Это и быстрее и в разы надежнее. И даже если вдруг нужно будет оптимизировать, то в 99.99999% случаев это будут не статики, которые не дадут ни капли в оптимизацию
для пользователя речь идет не о процентах, а о секундах, потому что там ответ на 1 процент быстрее, там один, там на процент быстрее, и в итоге это выливается в ответ конечному пользователю на милисекунды или даже для требовательных проектов и на секунды быстрее, про такие веди как тепловые и енергетические потери я вообще молчу, и это если предположить что реально на один процент, но в реальности будет от 0 до нескольких процентов быстрее, иногда и на порядок процетнов быстрее
обычно это выливается в конечному пользователю в "ваще не вижу разницы" (потому что статик vs не-статик никогда не было hotpath) и в колоссальную разницу в сопровождении проекта для любителя преждевременных оптимизаций и экономий на спичках.
Я не знаю какие нужно иметь кривые руки, чтобы перевод с инстансов на статики дал выигрыш в секунды. Тут 100% дело будет в другом, нежели в этом.
>пикрил
>браузер
Но ведь на твоём пикриле не браузер, а обычный говнокод который выводит в консоль текстовое представление страницы находящейся по адресу http://data.pr4e.org/page1.htm
Это хорошо отражает суть тех кто пишет на петухоне - они даже не понимают что конкретно делает их код.
Я это кинул именно как пример СОЛИД ПИТУХОВ, потому что этот код стандартам "высокоуровневых програмистов" верх совершенства, понаподключал библиотек, сделал инициализации, написал несколько рандомных кодов и бегут на борду мерятся у кого меньше строк получилось при это понятие не имея что там твориться внутри этих библиотек
>пошли маняманевры
какие еще маняманевры
я задам прямой вопрос
ЗА СЧЕТ ЧЕГО БУДЕТ ВЫИГРЫШ В СТАТИКАХ?
GC можешь даже не упоминать - сразу разобью в хлам. Скорость поиска по таблице методов? - ну такое бывает с виртуальными с методами (небольшая разница).
Проблема поиска методов при дженериках (о которой знают вообще единицы) в данном случае одинакова для статиков и нет
так в чем выгода то? где ты секунду набираешь?
>меньшие потери на харвере
основную нагрузку делает выполняемый код, который что-то делает неоптимально (алгоритм не тот) или не очень эффективно (не продумали кеширование, оптимизацию выполнения и так далее)
и оптимизация пути выполнения дает много
но это не про статики
Ну так на твоём пике с браузером и есть говнокод. А солид как раз не обязательно приводит к уменьшению кода, а чаще наоборот, потому что его предназначение это облегчение поддержки, расширения и использования данного кода, а не сокращения количество написанных строк.
Тем что не надо каждый раз создавать новые екземпляры класса, ждать пока система зарезервирует место в памяти для них, ждать конструкторов и тп, ты заполняешь существуюзий и уже аллоцированый класс данними, и так же быстро их читаешь, разница конечно не секунда, но по ходу работы программы большой проект может обращаться к классам сотни и тысячи раз, и какждый раз будет ждать ответа пока не пойдет дальше, все эти потери будут сумироваться и в итоге выльются в ощутимие милисекунды,
>основную нагрузку делает выполняемый код, который что-то делает неоптимально
и что? нужно сделать алгоритм оптимальный и дальше заниматься архитектурними и системними оптимизациями, использовать низкоуровневый код где это возможно работать непосредственно с устройствами, а не использовать какие-либо универсальние библиотеки с кучей заплаток
>что не надо каждый раз создавать новые екземпляры класса
>ты заполняешь существуюзий и уже аллоцированый класс данними, и так же быстро их читаешь
Тут есть такая тонкость. Статические классы нельзя инстанцировать. Что ты будешь делать если тебе нужно будет 2 экземпляра твоего статического класса с разным внутренним содержимым?
А если у тебя статики только там где "гарантированно не нужно 2 инстанса" то чем такой статик отличается от такого же "создали 1 инстанс и юзаем получая все плюшки ООП и DI до кучи)????
Ну а так то - Если по какой то причине аллокация создает проблемы, то вводим кеширование ака "пул объектов". Но это уже оффтоп, потому что статик класс не может заменить то, где нужно 2+ инстансов единовременно.
>нужно сделать алгоритм оптимальный... где это возможно работать непосредственно с устройствами
так а статики тут причем вообще? Я вот активно использую Span, которые дают выигрыш, а вот статики нет - от них толку нет
Изначально я просто спросил почему народ не использует статики там где можно, и не пойми меня не правильно я не считаю статик что это решение всех проблем,я просто пишу что по возможности код должен работать быстро настолько это возможно а не быть читабельным настолько что бы тебя мог заменить школьник который учил программирование на ютубчике, из за как мне кажется не верного подхода к программированию производительность кода постоянно уменьшается, и в сраном 2021 году на 16 ядерном проце жду 5-10 секунд пока откроектся ебучая фотография на этой ебучей десятке, я понимаю что расширения фотографий уже не то что было 10 лет назад, и все дела, но бля
>спросил почему народ не использует статики там где можно,
очевидно потому что статики ограничивают свободу. их нельзя создать 2 экземпляра, нельзя интерфейсы, нельзя нормально очистить просто забыв о них, нельзя замокать в тестах, нельзя заменить на другую реализацию
по факту "все статики" это процедурный подход в противовес которому и был рожден ООП со всеми его плюшками.
> и в сраном 2021 году на 16 ядерном проце жду
не буду спорить. сам в шоке от этого. потому что пишут "(матерится ж низзя) и в продакшен" для простых решений берут мегалибы. Только дело не в статиках же, а в засилье говнокодеров которым важно быстро написать и продать, и "пусть пользователь покупает новый девайс".
> почему не делать статиком все что можно?
Потому что такой код трудно расширять и поддерживать. При этом ты не можешь нормально его тестировать. Все вот так вот просто.
Вот давай представим. Тебе нужно сделать туду лист. Тебе изначально так задачу и поставили. Ты, допустим, таки сделал его для консоли. Тебе говорят - ты че, ебанутый, нужно ГУЙ. Ты делаешь гуй. Уже будут проблема со статикой, ну, допустим ты таки уже тут не понял, что затея провальна. Все всем нравится. Но пользователь А - хочет использовать SQLite, пользователь B - хочет чтобы оповещения были на почту, пользователь C - чтобы это все работало в браузере, а D - робко просит добавить возможность кастомизации гуя через CSS. Вот как думаешь, справишься с этими требованиями, если хучил статикой?
Я сам - пользую статику внутри библиотек, типа мне вот все еще кажется, что запилить свой ThrowIfNull - лучше, чем эти ?? ебашить везде. Ну и экстеншин методы без статики не сделаешь, а не всегда есть доступ к исходникам или не хочется делать обертку, ибо многословно выходит. Но все равно, зачастую статика влечет за собой код, который оч сложно поддерживать, он похож на спагетти, когда ты из рандомных мест дергаешь рандомные функции, когда ты не можешь нормально чет поменять, в одном месте не трогая в другом. Короче, статика, не для ютилити(и то в рамках библиотеки), констант и экстеншинов - такое себе.
Ну и самое главное. Нужно понимать, что программисту платят не из-за того что он может решить задачу здесь и сейчас, а за то что он может решить задачу так, чтобы в будующем другие программисты могли это дело расширять, дополнять функционал и поддерживать. Просто нахуячить решение и домохозяйка в состоянии, а сделать код пригодным к переиспользованию, расширению и модификации - уже нужно чуть больше чем освоить базовый синтаксис и быть способным в простейшую логику.
>Нахуя тебе вложенные классы?
А что нельзя?
>Че ты там за хуйню наделал, что коструктор может вернуть null, Ты ебанутый?
Так если нет в базе запрашиваемых данных что мне делать? не возвращать же пустой лист
>Нахуя тебе массив как свойство? Вот серьезно.
Ну а как мне массив биндить?
>За строку длиннее 100-120 символов - пиздят.
У нас так принято писать запросы в базу, нахрена разворачивать одну строчку на овер 100500 строчек если и так понятно что она делает и зачем нужна
я другой анон
1 вложенные классы можно, но какова причина делать их вложенными...сразу и не видать
2 нигде и никогда доселе не видел чтобы кому то в голову пришла идея вернуть null из конструктора.
3 кидать NRE на null - ну да, пусть потом народ гадает че за NRE. и зачем тогда вообще нужна проверка на null
4 у ВАС так принято? ясно. И похер на рекомендации о чистоте кода. Ясно. И похер что читабельность адски страдает - ведь главное что ВАМ удобно
ясно
>Так если нет в базе запрашиваемых данных что мне делать? не возвращать же пустой лист
Это от конвенции зависит. Я предпочитаю возвращать пустой лист, потому что тогда пользователю класса не понадобится делать null-check, и код типа такого будет работать:
foreach (var thing in list) thing?.DoSomething();
И такую хуйню чаще всего и пишут, не проверяя, является ли list - null. В новых версиях Шарпа можно и обозначить эксплицитно, что у тебя метод может возвращать null, что более-менее пофиксит главную проблему с возвращением null, но придется очень много всего переписывать.
мимо
> у ВАС так принято? ясно. И похер на рекомендации о чистоте кода. Ясно. И похер что читабельность адски страдает - ведь главное что ВАМ удобно
Это по твоему нормально когда одна строка, функции и работа которой очевидны, занимает пол экрана скрывая при этом реально НУЖНЫЕ вещи от глаз. Не приятнее ли видеть все что нужно сразу, а не насиловать колесо мышь как не нормальный что бы посмотреть, а что же там внизу после этой очевидной строки происходит
>>1937431
>нигде и никогда доселе не видел чтобы кому то в голову пришла идея вернуть null из конструктора.
>>1937438
>Я предпочитаю возвращать пустой лист, потому что тогда пользователю класса не понадобится делать null-check, и код типа такого будет работать:
проверка на нулл происходит быстрее чем создание нового пустого листа который нужен просто что бы избежать исключения, если есть исключение об этом надо дать знать что бы была возможность его обработать а не создавать заплатки что бы скрыть его от глаз
>вложенные классы можно, но какова причина делать их вложенными...сразу и не видать
Что бы скрыть его от глаз? Этот клас является частью другого класса, не лучше его поместить внутрь что бы соблюдалась иерархия, а не создавать кашу из всех классов?
>функции и работа которой очевидны
очевидны кому? писателю? это значит write-only код?
потому что любой читатель этого кода, который его не писал будет вынужден
а) прокрутить горизонтально
б) запомнить "чо тут нагородили" и держать это в памяти, чтобы не делать потом лишний раз пункт "а"
не говоря уже о том, что короткие строки читаются на порядок быстрее чем длинные.
>если есть исключение об этом надо дать знать что бы была возможность его обработать
ты говоришь с 2мя анонами, поэтому отвечу на свою часть
у тебя там 2 проблемы
1 проверка на нулл и сразу же NRE. зачем вообще проверять на нулл. Среда с радостью выкинет тебе тот же NRE без проверок
2 проверка на нулл + эксепшен нужна людям, чтобы заменить невразумительный NRE на что то более контекстное, которое явно поясняет че где когда - как минимум вменяемое сообщение в исключении, а то и свой тип исключения.
>Что бы скрыть его от глаз?
>не лучше его поместить внутрь что бы соблюдалась иерархия, а не создавать кашу из всех классов?
ну про "скрыть" мимо - они у тебя публичные, а про иерархию....ну тут спорить бесполезно. тут фломастеры, ведь у каждого свой взгляд на "нужно ли обязательно подчеркнуть что вот этот класс находится внутри другого и какой в этом смысл"
>а то и свой тип исключения.
Собственно этот NRE я просто нахардкодил временно, потом я подключу нашу внутреннюю библиотеку исключений и пройдусь поиском везде, где встречается эти и другие типы исключений и заменю на те что в библиотеке
>ну про "скрыть" мимо - они у тебя публичные
Скрыть из списка, у меня конечно же будет доступ к этом классу, он должен быть, но что бы он не мельтешил в списке классов я поместил его туда, а что бы обратиться к нему надо обратиться к составному и потом к нему, так гораздо удобнее
>очевидны кому? писателю?
Это же гребаный линк, очевидно что он просто возвращает параметризованные данные из базы, он в принципе не может делать ничего другого, он не может вдруг сложить числа или вызвать другую функцию, он просто возвращает данные из базы, на всякий случай параметры в нем такие же как в методе, если у тебя метод называется GetAllItemsByCategoryId для тебя уже должно быть очевидно что линк будет возвращать все данные, где сюрприз categoryId == ParamCategoryId
Я условно сказал, суть что работа строки с линком очевидна, в методе проверяется состояние колоны в таблице из дб, очевидно что линк подтянет строку с этой колонной из бд что бы прочитать состояние, не будет же он скажем удалять строку из дб в методе где он должен прочитать состояние, для этого будет вызван другой соответствующий метод по типу "RemoveItemByItemId(int itemId)" понимаешь? читать стоку линк это просто не нужно ее работа должна быть очевидной по методу, а если она не очевидна или делает что-то не очевидное то значит метод у тебя говно
>Я условно сказал, суть что работа строки с линком очевидна
долой условности. смотри на реальность - на твой же скрин.
плевать линк там у тебя или что другое
никаких "очевидно" быть не должно.
Код должен быть ясным для чтения, а не "ну наверное там вот так, значит скролить не нужно"
>а если она не очевидна или делает что-то не очевидное то значит метод у тебя говно
ну значит ты в курсе что не так с кодом на твоем же скрине
Если я вижу строчку читая которую вижу там GetAllItemsByCategoryId, я могу допустить что я знаю что она делает. НО Я НЕ ЗНАЮ ЧТО ТАМ ДЕЛАЕТСЯ ДОПОЛНИТЕЛЬНО (и не знаю делается ли вообще) - и буду вынужден прочитать всю строку прокручивая ее горизонтально чтобы увидеть что там не навешано дополнительных условий.
ну и вообще говорить про GetAllItemsByCategoryId и при этом where(d=>d.ID==...&&d.USRID==) ну это как то. Диссонанса не возникает?