Вы видите копию треда, сохраненную 31 августа 2020 года.
Скачать тред: только с превью, с превью и прикрепленными файлами.
Второй вариант может долго скачиваться. Файлы будут только в живых или недавно утонувших тредах. Подробнее
Если вам полезен архив М.Двача, пожертвуйте на оплату сервера.
ITT элита продолжает обсуждает будущее этого прекрасного и современного продукта компании Microsoft. Только в этом треде элитные разработчики ответят на самые острые вопросы индустрии. Также не забываем напоминать залетным Жаба-петухам о их месте возле параши, которая уже давно навечно забилась легаси-дерьмом и ждёт неминуемой смерти Жабы.
Литература вторым постом
1. Ресурсы:
- http://stackoverflow.com/questions/tagged/c#
- http://www.tutorialspoint.com/csharp/
- http://professorweb.ru
- http://net-informations.com
- http://habrahabr.ru/hub/csharp/
2. Онлайн-компиляторы:
- https://dotnetfiddle.net/ - возможно лучший вариант. Встроено немного убогое, но все-таки автодополнение и проверка синтаксиса.
- http://ideone.com/
- http://csharppad.com/
- http://www.tutorialspoint.com/compile_csharp_online.php
- http://rextester.com/l/csharp_online_compiler
3. WinForms или WPF?
Зависит от задачи. Для небольших проектов, скорее всего, будет достаточно винформочек. В случае, если разрабатываемое приложение достаточно серьёзное, то возможно его стоит писать с использованием WPF. WPF очень хорошо работает с паттерном MVVM ( https://ru.wikipedia.org/wiki/Model-View-ViewModel ), и позволяет пилить очень кастомизированные интерфейсы с помощью XAML, что в случае WinForms, делать намного сложнее. Оба будут поддерживаться в .NET Core, поэтому не стоит беспокоиться о будущем, если шлёпаете формочки.
4. Мне тут знакомый_нейм сказал, что C# умирает, это правда? Может не стоит его учить?
Неправда. C# довольно активно развивается, недавно вышла третья версия .NET Core фреймворка и восьмая версия языка. Весь дотнет понемногу становится опенсорсным, а ASP.NET становится независимым от платформы. В некотором смысле понемногу вымирают десктопные приложения с развитием веб-технологий, но в том же энтерпрайзе он еще очень даже востребован.
5. Какую ИДЕ выбрать?
Для Windows самым очевидным вариантом будет Visual Studio (https://www.visualstudio.com/en-us/downloads/download-visual-studio-vs.aspx). Студия распространяется в двух редакциях: бесплатная коммьюнити-версия и платный энтерпрейс эдишн. В большинстве случае будет достаточно Community-версии: она поддерживает и C#, C++, VB.NET и F#, а так же имеет возможность установки дополнений
Для мака и никсов самый юзабельный вариант - MonoDevelop ( http://www.monodevelop.com/download/ ).
Для vim можно использовать OmniSharp ( https://github.com/OmniSharp/omnisharp-vim ).
Кросплатформенный полуредактор/полуIDE VS Code ( https://www.visualstudio.com/en-us/products/code-vs.aspx )
Также существуют плагины для Atom'а и Sublime Text, но функциональность там достаточно сильно урезана.
Кроме того, в данный момент JetBrains активно пилит свою IDE для шарпа (Project Rider), вероятно в ближайшее время станут доступны первые EAP. IDE заявлена как кросплатформенная, со всем решарпер-функционалом, поддержкой отладки, моно и .net core.
SharpDevelop - еще одна IDE для C#, отличается малым размером (около 20мб) и опциональной портабельностью, при этом имея дизайнер WinForms и WPF, а также интеграцию с FxCop, StyleCop и прочими ништяками. Если хочется что-то по быстрому набросать, а выкачивать гигабйты нет желания, то возможно SharpDevelop будет лучшим вариантом.
6. С# для мобильной разработки
Если нужны инструменты для разработке под мобилы, смотри сюда - https://docs.microsoft.com/ru-ru/visualstudio/cross-platform/cross-platform-mobile-development-in-visual-studio?view=vs-2019.
Из актуальной литературы
- Xamarin Mobile Application Development
- Xamarin Essentials
7. Дополнительные инструменты для разработки на C#
LINQPad - сорт оф REPL, с возможностью быстрого подключения к БД и удобной визуализацией данных
dnSpy - декомпилятор, малоизвестный форк ILSpy, где реализована возможность модификации IL-кода прямо в EXE и DLL файлах, отладка IL-кода и много других фич для reverse engineering'а. Плюс няшные темы как в студии
scriptcs - для запуска C# кода как скриптов, возможность использовать как REPL
8. Расширения для студии
ReSharper - одно из известнейших. Рефакторинги, умный автокомплит, настраиваемый стиль кода. Платный, но можно стянуть с торрентов
Supercharger - показывает "карту" с классами, методами и всем остальным сбоку от кода с возможностью прыгать по ним
Indent Guides - показывает вертикальные линии на каждом уровне отступов.
Format document on Save - форматирует код каждый раз при сохранении документа
Code alignment - Выравнивает код по указанным символам. Удобно, например, при инициализации словарей или в перечислениях
Обзор Roslyn: https://github.com/dotnet/roslyn/wiki/Roslyn Overview
Новые возможности C# 8.0: https://docs.microsoft.com/ru-ru/dotnet/csharp/whats-new/csharp-8
Код этой шапки: https://pastebin.com/YJFQKsNm
Прошлый тред тонет здесь: https://2ch.hk/pr/res/1618705.html (М)
- The C# Player's Guide, второе издание (RB Whitaker) - отличная книга для ньюфагов в шарпе, все расписывается довольно подробно, очень много примеров кода.
- C# 7.0 in a Nutshell (Joseph Albahari и Ben Albahari) - огромнейший справочник, over 1000 страниц, покрывает почти все области, начиная с синтаксиса и базовых типов и заканчивая интеропом и рослином. Уже появилось издание для 8.0, однако в интернетах пока его нет.
- C# 7.0 Pocket Reference (Joseph Albahari и Ben Albahari) - просто выжимка из справочника, можно всегда держать рукой
- Pro C# 7: With .NET and .NET Core (Andrew Troelsen) - 1600-страничный учебник по шарпу, покрывает BCL, WPF и ASP.NET, небо и даже аллаха.
- C# 6.0 Cookbook (Jay Hilyard и Stephen Teilhet) - книга в формате "проблема-решение", можно пройтись по оглавлению, найти интересные проблемы и попыпаться самому решить, а уже потом посмотреть представленное решение. Книга скорее не для ньюфагов, а для тех, кто уже знаком с шарпом.
10. Более хардкорный материал
- 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 структрура", кастинг, боксинг, перфоманс регулярок, коллекций, исключений. Короче все что нужно, чтобы вам перезвонили.
11. Хочу еще хардкорней
- C# Deconstructed (Mohammad Rahman) - введение в CLR, модели памяти и выполнения в CLR, байтоебство, JIT. Книга достаточно коротенькая, менее 200 страниц, можно осилить за пару дней. Желателен опыт работы WinDbg и понимание устройства PE-формата.
- Expert C# 5.0 with .NET 4.5 Framework - еще одна книга этого автора, в этот раз намного длиннее. Очень много IL, анализа и разбора стандартной либы (те же коллекции), разбор ивентов, дегегатов, асинхронности etc. на уровне байткода.
- .NET IL Assembler (Serge Lidin) - ILёбство, во многих местах повторяет документацию MSDN, но при этом имеет много интересных дополнений и заметок. Кроме того все неплохо структуировано и разложено по красивым табличкам
12. Литература по WPF
Из более-менее актуального можно выделить пару книг:
- Pro WPF 4.5 in C# (Matthew MacDonald)
- Windows Presentation Foundation 4.5 Cookbook (Pavel Yosifovich)
13. Литература по ASP.NET
- Professional ASP.NET MVC 5 (Jon Galloway, Brad Wilson, K. Scott Allen, David Matson)
- Pro ASP.NET MVC 5 Platform (Adam Freeman)
- Beginning ASP.NET for Visual Studio 2015 (William Penberthy)
14. Литература по асинхронности, параллелизму и всему такому
- Concurrency in C# Cookbook (Stephen Cleary) - книга, написанная в формате "проблема - решение". Кроме базовых вещей, вроде асинков и параллелизма рассматриваются TPL Dataflows, Rx (реактивные расширения), тестирование всего этого асинхронного добра, ну и работа этого всего на более низких уровнях абстракции
- Multithreading in C# 5.0 Cookbook - в основном ничего интересного, но есть довольна неплохая глава про синхронизацию, пусть и не слишком детальная
- Pro Asynchronous Programming with .NET (Richard Blewett, Andrew Clymer) - опять же, интересного немного, но неплохие главы про асинхронность + UI и анализ дампов памяти в windbg
15. Литература не по шарпу, но так или иначе связанная с языком
C# Game Programming Cookbook for Unity 3D (Jeff W. Murray) - разработка на шарпе под Unity
Introduction to Neural Networks with C# (Jeff Heaton) - изучение нейронных сетей с примерами кода на шарпе. Под конец пишем программу для распознавания символов и нейроботов.
Machine Learning Using C# Succinctly (James D. McCaffrey) - довольная коротенькая книга на тему машинного обучения с примерами кода на C#. Ничего особого: k-средние, классификация, наивный байес, но с кодом, который всегда можно поразбирать, если что неясно.
16. Но я не знаю английский, как я буду это все читать?
На некоторые из перечисленных книг есть переводы, которые можно найти на том же рутрекере, однако, зачастую эти переводы неактальны, содержат неточности, и не самые понятные варианты перевода. Кроме того, переводы обычно пилятся только для нескольких самых популярных книг, более-менее серьёзный материал не переводят. Всегда можно сесть со словарем и понемногу читать, переводя непонятные фрагменты. Это очень полезно, так как в любом случае в разработке без знания ангельского делать нечего. Если очень хочется, то гуглить по запросам: "C# 5.0, Справочник. Полное описание языка", "C# для профессионалов. Тонкости программирования", "Программирование на платформе Microsoft .NET Framework 4.5 на языке C#"
17. Что еще нужно знать, чтобы взяли работать за еду?
- SQL - подойдет люая книг по MSSQL/MySQL, базовые запросы, SELECT, INSERT, DELETE, UPDATE. Джойны, индексы, нормализация. В контексте шарпа еще ORM: Entity Framework, Dapper
- Системы контроля версий - обычно гита достаточно: add/commit/push, merge, rebase, checkout, remote's, разрешение конфликтов, трехпанельные дифф-менеджеры, cherry-pick
- Гитхабы-гитхабчики - issues, организация пулл-реквестов, интеграция с appveyor, теги, релизы, маркдаун
- Алгоритмы - сложность алгоритмов, сортировки (пузырек, быстрая, вставками), поиск, рекурсия, алгоритмы на строках
- Структуры данных - связанные списки, деревья (бинарные, красно-черные, b-деревья), хеш-таблицы, графы
- Если идти в веб - HTML, CSS, JavaScript, веб-сокеты, REST
- Паттерны проектирования, стиль кода, внедрение зависимостей, MVVM (если хочется в WPF), SOLID
18. Я не умею читать, что посмотреть?
- Programming with C# - https://www.edx.org/course/programming-c-microsoft-dev204x-0
- Beginning Game Programming with C# - https://www.coursera.org/course/gameprogramming
- C# Fundamentals: Development for Absolute Beginners - https://goo.gl/meyyxO
- Коллекция видеоуроков, по всему дотнетовскому и смежным темам (250 часов, на русском) - https://nnm-club.me/forum/viewtopic.php?t=891636
- Набор курсов по C# от O'Reilly Media (28 часов, на английском) - http://rutracker.org/forum/viewtopic.php?t=5082978
- The C# Player's Guide, второе издание (RB Whitaker) - отличная книга для ньюфагов в шарпе, все расписывается довольно подробно, очень много примеров кода.
- C# 7.0 in a Nutshell (Joseph Albahari и Ben Albahari) - огромнейший справочник, over 1000 страниц, покрывает почти все области, начиная с синтаксиса и базовых типов и заканчивая интеропом и рослином. Уже появилось издание для 8.0, однако в интернетах пока его нет.
- C# 7.0 Pocket Reference (Joseph Albahari и Ben Albahari) - просто выжимка из справочника, можно всегда держать рукой
- Pro C# 7: With .NET and .NET Core (Andrew Troelsen) - 1600-страничный учебник по шарпу, покрывает BCL, WPF и ASP.NET, небо и даже аллаха.
- C# 6.0 Cookbook (Jay Hilyard и Stephen Teilhet) - книга в формате "проблема-решение", можно пройтись по оглавлению, найти интересные проблемы и попыпаться самому решить, а уже потом посмотреть представленное решение. Книга скорее не для ньюфагов, а для тех, кто уже знаком с шарпом.
10. Более хардкорный материал
- 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 структрура", кастинг, боксинг, перфоманс регулярок, коллекций, исключений. Короче все что нужно, чтобы вам перезвонили.
11. Хочу еще хардкорней
- C# Deconstructed (Mohammad Rahman) - введение в CLR, модели памяти и выполнения в CLR, байтоебство, JIT. Книга достаточно коротенькая, менее 200 страниц, можно осилить за пару дней. Желателен опыт работы WinDbg и понимание устройства PE-формата.
- Expert C# 5.0 with .NET 4.5 Framework - еще одна книга этого автора, в этот раз намного длиннее. Очень много IL, анализа и разбора стандартной либы (те же коллекции), разбор ивентов, дегегатов, асинхронности etc. на уровне байткода.
- .NET IL Assembler (Serge Lidin) - ILёбство, во многих местах повторяет документацию MSDN, но при этом имеет много интересных дополнений и заметок. Кроме того все неплохо структуировано и разложено по красивым табличкам
12. Литература по WPF
Из более-менее актуального можно выделить пару книг:
- Pro WPF 4.5 in C# (Matthew MacDonald)
- Windows Presentation Foundation 4.5 Cookbook (Pavel Yosifovich)
13. Литература по ASP.NET
- Professional ASP.NET MVC 5 (Jon Galloway, Brad Wilson, K. Scott Allen, David Matson)
- Pro ASP.NET MVC 5 Platform (Adam Freeman)
- Beginning ASP.NET for Visual Studio 2015 (William Penberthy)
14. Литература по асинхронности, параллелизму и всему такому
- Concurrency in C# Cookbook (Stephen Cleary) - книга, написанная в формате "проблема - решение". Кроме базовых вещей, вроде асинков и параллелизма рассматриваются TPL Dataflows, Rx (реактивные расширения), тестирование всего этого асинхронного добра, ну и работа этого всего на более низких уровнях абстракции
- Multithreading in C# 5.0 Cookbook - в основном ничего интересного, но есть довольна неплохая глава про синхронизацию, пусть и не слишком детальная
- Pro Asynchronous Programming with .NET (Richard Blewett, Andrew Clymer) - опять же, интересного немного, но неплохие главы про асинхронность + UI и анализ дампов памяти в windbg
15. Литература не по шарпу, но так или иначе связанная с языком
C# Game Programming Cookbook for Unity 3D (Jeff W. Murray) - разработка на шарпе под Unity
Introduction to Neural Networks with C# (Jeff Heaton) - изучение нейронных сетей с примерами кода на шарпе. Под конец пишем программу для распознавания символов и нейроботов.
Machine Learning Using C# Succinctly (James D. McCaffrey) - довольная коротенькая книга на тему машинного обучения с примерами кода на C#. Ничего особого: k-средние, классификация, наивный байес, но с кодом, который всегда можно поразбирать, если что неясно.
16. Но я не знаю английский, как я буду это все читать?
На некоторые из перечисленных книг есть переводы, которые можно найти на том же рутрекере, однако, зачастую эти переводы неактальны, содержат неточности, и не самые понятные варианты перевода. Кроме того, переводы обычно пилятся только для нескольких самых популярных книг, более-менее серьёзный материал не переводят. Всегда можно сесть со словарем и понемногу читать, переводя непонятные фрагменты. Это очень полезно, так как в любом случае в разработке без знания ангельского делать нечего. Если очень хочется, то гуглить по запросам: "C# 5.0, Справочник. Полное описание языка", "C# для профессионалов. Тонкости программирования", "Программирование на платформе Microsoft .NET Framework 4.5 на языке C#"
17. Что еще нужно знать, чтобы взяли работать за еду?
- SQL - подойдет люая книг по MSSQL/MySQL, базовые запросы, SELECT, INSERT, DELETE, UPDATE. Джойны, индексы, нормализация. В контексте шарпа еще ORM: Entity Framework, Dapper
- Системы контроля версий - обычно гита достаточно: add/commit/push, merge, rebase, checkout, remote's, разрешение конфликтов, трехпанельные дифф-менеджеры, cherry-pick
- Гитхабы-гитхабчики - issues, организация пулл-реквестов, интеграция с appveyor, теги, релизы, маркдаун
- Алгоритмы - сложность алгоритмов, сортировки (пузырек, быстрая, вставками), поиск, рекурсия, алгоритмы на строках
- Структуры данных - связанные списки, деревья (бинарные, красно-черные, b-деревья), хеш-таблицы, графы
- Если идти в веб - HTML, CSS, JavaScript, веб-сокеты, REST
- Паттерны проектирования, стиль кода, внедрение зависимостей, MVVM (если хочется в WPF), SOLID
18. Я не умею читать, что посмотреть?
- Programming with C# - https://www.edx.org/course/programming-c-microsoft-dev204x-0
- Beginning Game Programming with C# - https://www.coursera.org/course/gameprogramming
- C# Fundamentals: Development for Absolute Beginners - https://goo.gl/meyyxO
- Коллекция видеоуроков, по всему дотнетовскому и смежным темам (250 часов, на русском) - https://nnm-club.me/forum/viewtopic.php?t=891636
- Набор курсов по C# от O'Reilly Media (28 часов, на английском) - http://rutracker.org/forum/viewtopic.php?t=5082978
Кто думает, что это нытье - поспрашивайте в комьюнити сколько галер выкинули на мороз мин.NETчиков. Джуны с плеча в первые же дни полетели после обвала фондового рынка.
>>1665263 →
>>1665470 →
>Ряяяя пачиму питухон можит а шарп ниможит!!
>НЕ ВРИИ ПИТУХОН МОЩНЫЙ ОН ВСЁ МОЖИТ!!
Не перестаю с петухонщика-неосилятора. Я думал они хоть немного умнее жопаскриптеров, но ошибался.
>3 178 вакансий «C# developer»
>2 388 вакансий «.net developer»
>6 070 вакансий «Java developer»
>5 566 vs 60 070
Даже с учетом того, насколько много легаси дерьма в жабе, C# и .net уже наступает ей на пятки. Поэтому, хорошая попытка , жабоеб, но нет.
Ты не врёшь, ты просто умственно отсталый дегенерат-петухонщик. Работа с файлами происходит при помощи обращения к API системы на которой запущена программа. И у этого API нет условий вида "if (PLName === "Python") file.GrantAccess()".
А это, кстати, в каких единицах и за какой срок?
В долларах США за год, всё стандартно. В штатах же не практикуется указание месячной ЗП.
Мне интересно было, что тот чувак имел ввиду. Он вроде сказал что он из мордора, так что мог по привычке в месяц назвать.
извини, за неприятный пост
>наступает ей на пятки
с этого в голос проиграл. Каждый раз угораю, когда сравнивают Java с высером мелкософтов. И что у тебя за биржа, которая C# делит с .NET? Или .NET вакансии это типо Visual basic чи шо? Энивей, удачи с этими 5.5к вакансий нет
А то мало вакансий, когда фигачат джаву в объявлении, а потом оказывается что им нужен го, скала, кложа.
>Кто думает, что это нытье - поспрашивайте в комьюнити сколько галер выкинули на мороз мин.NETчиков
Без хуйни - ни одного дотнетчика с галеры не выгнали. Со скриптохуйни вроде пайтона, жс - выкинули.
С жабы и дотнета - нет
разумеется, на скриптохуйне стартапы и прочие динамично развивающиеся продукты, которые любой кризис легко сдувает, а на говне мамонта вроде кобола жабы и делфи сишарпа - масштабные легаси-конюшни крупных проектов, которые более устойчивы
Мой бугурт был в том, что питон получает доступ к файлу без ебли одной строкой, а в сисяре я до сих пор не понял, с каким еще бубном надо сплясать, чтобы все заработало. Кроме как копировать файл, читать его и удалять, но это пиздец, качественный велосипед.
>3 178 вакансий «C# developer»
>2 388 вакансий «.net developer»
Это у тебя непересекающиеся множества?
Для .NET можно писать на любом языке, который находится в списке поддерживаемых для этой платформы, разница минимальна.
Но ведь ты сам себе в ногу выстрели в своём коде на шарпе, а виноват почему-то шарп.
И в шарпе вообще такие элементарные операции за одну строку делаются:
File.WriteAllText или File.AppendAllText
Не у меня, а у хедхантера.
Также как и всегда - она не нужна если ты обладаешь необходимыми навыками.
Сразу скажу, что для работы недостаточно "занимаюсь примерно год". Для работы ты помимо языка должен уметь работать с базами данных, знать и уметь применять базовые алгоритмы, знать и уметь применять различные структуры данных, а также разбираться в принципах и паттернах проектирования.
Мне нужно прочитать файл, а не писать в него. И он не читается, потому что якобы занят процессом.
>нужно прочитать файл
File.ReadAllText
>потому что якобы занят процессом.
Да-да, этот бред я уже слышал. Для шарпа он занят, а для петухона он не занят. Магия да и только.
Если только в жс не вкатываться. Там можно жопой код писать, лишь бы контент на странице отображался.
Ок, я понял, разобрался. Спасибо, если кто-то хотел помочь, но теперь вопрос закрыт.
Пиши на петухоне. В шарпе всё настолько плохо, что ему даже доступ к файлам перекрывают...
>Пиши на петухоне
Хотелось бы, но заставляют на решетке.
Только что починил, добавив третий костыль. Просто невероятно. Господи, спасибо тому чуваку с форума, что написал решение, прежде чем закрыть топик.
using (FileStream stream = new FileStream(logFilePath, FileMode.Open, FileAccess.Read, FileShare.ReadWrite))
{
using (StreamReader reader = new StreamReader(stream))
{
while (!reader.EndOfStream)
{
string line = reader.ReadLine();
//Тут уже можно делать с линией все, что угодно
}
}
}
А ты, конечно, токсичный чувак, но спасибо все равно, что пытался.
Так это же такой же код, как и тут >>1665470 → . Но там ты писал что не работает, а тут работает. Подозрительно.
Это ты еще на сирашпе не подключал одну базу, вторую, менял их местами.
В отношении БД - C# та еще параша. Ну я не говорю про модные фреймворки на них
>который находится в списке поддерживаемых для этой платформы, разница минимальна.
>разница минимальна.
>минимальна.
>>665696
в твоем селе на заборе вакансии?
>>665708
Lucky one. У нас конвеер трейни переходящих в джунов на галере. 6 тел с плеча на мороз с досрочным разрывом контракта. (4 трейни, 2 джуна). Они там ко-ко-кали что то, что дених нет и все такое - под сраку сапогом
> (4 трейни, 2 джуна).
Бохато живёте.
Вот другие питушинные языки это да.
Пришел на них трейни, так и сидишь до миддла и довольно урчишь, получая больше и больше компенсацию
Ты бы знал путь от трейни до джуна у нас в галере, ты бы охуел. Лычки мидла выдают только пердунам, вроде меня, которые по 5+ лет сидят. Обычно съебывают в другую галеру. Я просто проигрываю с этим мамкиных программистов, которые думают, что .NET это платформа богов. Ожидание-реальность...
Как хорошо, что меня не взяли джуном на C# .net Галеру
В итоге без опыта на миддла взяли node.js ковырять. Адекватное руководстве превыше всяких лычек
Что -то ты не договариваешь. СтримРидер просто вернет налл, если достигнут конец потока. Сделай видео, где без проверки EOS выбрасывает ошибку доступа к файлу, а с проверкой читает нормально. Потому что того, о чем ты пишешь просто не может быть. Скорее всего ты еще что-то поменял, что разлочило файл.
Так блять, не задавай неудобных вопросов. Он же Дартаньян и превозмогает, а остальным проще, они пишут не на дотнете и получают деньги за нихуя.
Действительно, что там сложного там. If,else,0,1
Двачую. У нас на джуна вопросы сеньерские задают, а заставляют говно палкой ковырять, так что все ок
>>666212
>>666215
думаете типо 5 лет и сразу $5к/m? Я скажу по секрету, количество лет в разработке не значат ровным счетом нихуя, если вас оценят, как дебила. Собеседовали питонщика, которому в голову моча стукнула перекатитсья в .NET (редкий дебил). Вот у него около 7 лет было питонистом, но в решетках он не знал нихуя, кроме базовых вещей, которые аналогичны в питоне.
Короче, вкатитесь - ощутите жижу прелести ОЙТИ СНГ. Я пару тредов назад писал, что не нужно сравнивать работу дэва в СНГ и европке/америке - абсолютно разные вещи.
Не перестаю охуевать с долбоеба. File.ReadAllText у него не работало, а добавление !reader.EndOfStream магическим образом открыло доступ к файлу.
Надеюсь, что это даун пытается троллить, а не реальный человек.
>собеседовали питонщика, которому в голову моча стукнула перекатитсья в .NET (редкий дебил). Вот у него около 7 лет было питонистом, но в решетках он не знал нихуя, кроме базовых вещей, которые аналогичны в питоне.
Питонщик выше очередное подтверждение долбоебизма питонщиков и других динамикопетухов.
Так покажи код, который без !reader.EndOfStream будет выбрасывать эксепшен из-за отсутствия доступа к файлу. Тебе же пиздеть незачем.
Он наверняка сразу поток открывал, а потом пытался с открытым потоком через ReadAllText() читать.
мимо
>При чем тут это
вкатыши и прочая грязь думает, что 5 лет на жопе отсидел, значит Senior. А вот и хуй
>Зачем ты 5 лет жрешь говно, если нет такая параша?
меня устраивает. 2-3 проекта, знакомый мне стэк, хорошая зарплатка, зона комфорта. Перекатываться куда то - это терять время, деньги, энергию
>>666229
может он и хороший дев, но точно не .NET-а. Ему дали офер на джуна с ЗП в 4 раза меньше его, он его принял. Отпинал хуи 2 месяца и сказал, что это все хуйня и я уебываю
Я слабо представляю себе такого питониста.
Мир открытых систем, бесплатное IDE, OS, миллион тыщ либ под питухон. Хочешь - ML BIG DATA, хочешь - скрипты, парсеры пиши, или веб во всех направлениях.
Нет блять, поиграл 7 лет с питоном и пересел на иглу Microsoft с анальзыми зондами
ты просто не знаешь мотивов таких людей. На собесе - глаза горят, как все заебись писать под шиндовс нет, а по факту - 2 месяца проебаного времени и увольнение. Может он зашел в тред на дваче и почитал, как все охуенно снова нет, что ЗП овердохуя, что проекты интересные.
Ну не знаю, есть легендарные посты про
- Хочу переехать в ДС\ДС2 где-нибудь на 60-100к
- Ты сишарпер чтоли?
60-100к (не знаю, сколько это в долларах, 1к+ походу где то) - это медиана мидла, премидла. Вполне реальная ЗП
>- Ты сишарпер чтоли?
да, уже писал выше
Я ж кидал.
List<char> list = new List<string>();
using (FileStream stream = new FileStream(file, FileMode.Open, FileAccess.Read, FileShare.ReadWrite))
{
using (StreamReader reader = new StreamReader(stream, Encoding.UTF8))
{
string line = reader.ReadLine();
list.Add(line[0]);
}
}
return list;
А знаешь сколько получает мидл питухона? То-то и оно. даже в регионах 120к можно
Просто петухоно-опущенец привык, что перед господами нужно иметь вид лихой и придурковатый.
Не за что. Обращайся если еще вопросы будут.
Начинать с Шилдта или с Троелсена?
Залетный тестировщик
А ничего, что тут у тебя читается одна строка, а в варианте с ЕОС все строки? Это, конечно не влияет на доступ к файлу, но замена кода неравнозначная.
С чего угодно. важно то, на какой книге ты кончишь свой путь
Начинаешь с Троелсена.
Потом закрепляешь Альбаири с его C# in a Nutshell
Потом читаешь книгу по паттернам (Agile Principles, Patterns, and Practices in C#, очень годная)
После чего переходишь на изучение современного .NET Core (C# 8.0 and .NET Core 3.0 – Modern Cross-Platform Development Fourth Edition)
Далее следует почитать что-нибудь по работе с базами данных. После чего можешь закрепить знания путём более тщательного изучения алгоритмов и структур данных.
Зачем с долбоебом разговаривать, который понял, что обосрался просто виляет сракой и наверно думает, что он охуенно всех затроллил.
Спасибо, анон!
Да, ошибка в компиляторе
мне насрать сколько на пайтоне зарабатывают, я скажу больше - мне насрать сколько на # зарабатывают. Если выпилюсь из этого проекта (галеры), то скорее всего в СНГ больше работать не буду, а съебу за бугор джуном любого стэка, который мне дадут (желательно Rust/Kotlin/Golang). Просто Ойти СНГ - это такая параша блять, что от нее воняет. В прямом смысле слова, просто несет говном. И тут даже не дело в том, на каком стэке ты сидишь и чем занимаешься, все сводиться к одному - бадишопы. Для заказчика ты всегда будешь ебаным индусом из страны 3 мира. Особенно проигрываю с додиков, которые получаю лычку на комуникацию с кастомером без ПМ-а, где разговор сводится не то, что к индусу, а к умственно отсталому дебилу, который даже не может в английский Давайте пизданите мне, вкатывальщики хуевы, что ХУЯНДЕКС, МЕИЛ.СРУ, ВАРГЕЙНИК, да это ты такой ущербный, кококо- это 1%, уебки.
>>666310
иди моки учись делать и интеграционные тесты писать, обезьяна ебаная, а не решетки учи. В них и без тебя дебилов хватает
>В прямом смысле слова, просто несет говном.
>LITERALLY
>всё равно использует переносное значение
Идиот.
>В прямом смысле слова, просто несет говном.
Сына, прийдешь ты на проект, кинут тебе абсолютно рандомный таск, например запилить аутентификацию на web API под реакт, а версия .NET-а - 3.5 допустим, где скафолдингов нет и на SOF весь код уже под 4.5+, даст долбоеб ПМ эстимейт в 2 часа на таск. Когда после 8 часов дрочки с этим говном над тобой будут стоять ПМ, фронт, ментор и все остальные, ты будешь не только сраться под себя, но и ссаться.
>>666457
дурачек, который интерпрайза в глаза не видел что то пердит из под шконки. Я хоть сейчас готов рядом с индусом сидеть и закрывать таски, главное чтобы это был один проект не бадишопа
Мне влень на самом деле доказывать то, чего вы никогда не видели возможно никогда и не увидите, но разминайте свои анусы на то, что когда вас возьмут на проект если возьмут, то найдется такой ментор, которому от слова совсем похуй на вас, то тогда понюхаете, чем пахнет СНГшное Ойти. Все хотят килобаксы рубят, а рубят соленые хуйцы за щеку.
Уже писал в нытье треде, что даже если вас и возьмут на стажировку/исп. срок - велика вероятность, что вы там не отработает после оговоренного срока, а вас просто выставят на улицу. Сам работаю в такой галере, где джунов, трейни в хуй не ставят.
Это не нытье, это жизненный опыт. Поэтому я и пишу, после закрытия проекта - бугор и только.
>ты будешь не только сраться под себя, но и ссаться.
>продолжает говорить фигурально, даже не осознавая этого
LITERALLY
>Студия распространяется в двух редакциях: бесплатная коммьюнити-версия и платный энтерпрейс эдишн. В большинстве случае будет достаточно Community-версии: она поддерживает и C#, C++, VB.NET и F#, а так же имеет возможность установки дополнений
А почему она все равно требует лицензии?
Поставил студию некоторое время назад и вот у нее закончился ознакомительный период. Я не хочу плотить, ибо я просто для себя программирую, решаю задачки. Пиратку тож не хочу. Получается, бесплатность коммьюнити-версии - это пиздеж?
Войти не получается, когда пытаюсь то получаю сообщение об ошибке Не удалось обновить данные для учетной записи. Ссылка на объект не указывает на экземпляр объекта
Если сеттер является частью интерфейса, то вноси, если нет, то нет. Сори, но на твой вопрос сложно дать другой ответ.
Да я вообще запутался со всем этим. Налицо какое-то излишнее дублирование и фрагментация. Поля, свойства, геттеры/сеттеры, методы. Я ебал. Ну типа рекомендуют поля делать приватными, а во вне выпускать свойства. Окей. Есть ещё авто-свойства, когда можно не пилить поля(они там сами пилятся вроде как). Сколько логики писать в этих геттера/сеттерах, когда писать отдельные методы, куда пихать резальтат этих методов, просто присваивать свойству или в геттерах сеттерах реализовывать. Короче в голове каша ебаная. А тут ещё интерфейсы, абстрактные классы, классы и это всё друг на друге. Пиздос. И это только азы, что же будет дальше(дальше будет дроп).
Если метод общий для всех наследников, то реализуешь, если нет, то нет. Вообще, в интерфейсах реализовать нужно как можно меньше, интерфейс это шаблон, который не знает ничего кроме сигнатур. Если хочешь реализовывать, то значит тебе нужен абстрактный класс.
Так нахуй ты во всё это полез, если не изучил принципы и паттерны проектирования с применением ООП? Очевидно, что ты хуйню делаешь, которая тебе никакой пользы не принесёт.
Не, про интерфейсы я понял, реализую я как раз всё в классе.
>>666721
Чел, мне понадобилось пару программ мелких, я решил под шумок подучить шарп, какие нахуй паттерны? Скажи спасибо, что я не бездумно хуярю лишь бы работало, а пытаюсь разобраться. Лучше бы подсказал, куда копать, а не выёбывался.
Так я тебе и сказал куда копать, долбоеб. Либо читаешь литературу по паттернам проектирования и принципам SOLID, либо хуячишь свой говнокод. Третьего не дано.
Всё, что ты высрал, это претензии, почему я такой тупой и не делаю, как сеньёры.
Зачем тебе выносить изменение свойства в отдельный интерфейс? Если ты вынесешь этот сеттер в интерфейс, получается, что ты будешь позволять другим обьектам вызывать сеттер и изменять тем самым внутреннее состояние этого обьекта. Не знаю, что ты хочешь сделать, но выглядит уже криво.
Если хочешь менять стратегию изменения свойства на лету, то можно вынести это в отдельный интерфейс, и потом его инжектить.
Но это тоже странно.
Короче приведи пример, что ты хочешь сделать и зачем, я тебе подскажу.
Вполне закономерно, учитывая твоё желание "хочу делать как сеньор, но учить ничего не хочу, научите меня не видя моего кода, прочитав мои мысли".
public class Zalupa
{
public int Number {get; set;}
}
Для начала делай так и не выебывайся.
Вообще не понимаю этого дрочерства - пока у тебя не возникнет потребности в интерфейсах, абстракных классах, делегатах, дженериках, dependency inejctor'ax - не лезь туда вообще нахуй. Без опыта со слезами и с кровью - всё это выветрится быстро.
Но я на продакшене учился by hard way, переписывая и улучшая, так что не знаю, может на собеседованиях джунов мудаки этому дрочат. Вообще не надо там по углам курить, дрочить, занимайся разработкой, возьми пет проект / устройся на работу и просто пиши чтобы не разваливалось высирая сопли на ходу, потом как говно попрет - если не тупой - то начнешь расти и переписывать и никакие учебники и объяснения тебе не нужны будут.
/thread
Мань, это актуально было лет 10 назад, сейчас если ты внятно не ответишь на вопрос "Что вы знаете об акрониме SOLID?", приведя примеры и расписав каждый принцип. Тебя сразу нахуй пошлют, даже алгоритмические задачи не попросят решить.
галерный мидл в тренде, я спокоен
Ну такой же долбоеб, как и тот выше. Ошибка выжившего во все поля. Попробуй пройти собес, тебя даже на позицию джуна не возьмут.
Calculator<T> where T: byte, short, int, long {}
Короче примерно так, но я бы проверил типы внутри функции все же, через typeof.
>>667128
Два месяца назад перекатывался на 1.5х по зп, так что вы мимо. Ах да, я как правило резюме никуда не посылаю, и половина фаундеров энтерпрайзных продуктовок в моем мухосранске знает меня в лицо и увольняюсь с периодом оповещения в 5 месяцев. Таки рыночек порешал. Мани, жду вас на собесе, подготовил задачки по методичке.
Вы как бы вообще не поняли рыночек: C# это про бизнес, бизнес, формы, бизнес-энтерпрайз,. За алгоритмами идите Идрис дрочите советую.
>>667251
>и половина фаундеров энтерпрайзных продуктовок в моем мухосранске знает меня в лицо и увольняюсь с периодом оповещения в 5 месяцев
Так почему мимо то? Очевидный опездол-кабанчик, который вкатился в IT на его восходе, когда достаточно было знать базовый синтаксис одного языка. Теперь тебя берут только по знакомству, а самое смешное, что даже на должность сеньора не дают встать. Ты сам только что себя обоссал, миддл. Теперь тебе и остается только фантазировать о том, что "да это не я тупой, просто языку этого не нужно", смеша остальных.
Да ладно тебе. Он тут самый успешный сеньор-помидор. Программист #1 своего мухосранска
>на должность сеньора
Это которые 25-летние или с тремя годами опыта? Если нет хотя бы 10-15 лет - не нызывай себя сеньйором.
Можешь и в 15 быть сеньором, вся информация уже давно в открытом доступе, времена "набить шишек чтобы понять" уже давно прошли.
У тебя есть аттрибут AllowAnonymous для метода в контроллере, есть HttpContext с IP адресом. Остальное как бы от твоей фантазии зависит.
Но я бы в Middleware фильтр бы сделал кастомный и все. Просто банлист для определенного метода это странно.
Всё, я понял, в 15 лет сразу поставим сеньйора софт для боинга, энтерпрайз для больничек, ну или на крайний случай финансовый хайлод пилить, всё ж в открытом доступе давно, бро.
Можно вообще фильтр навесить еще до твоего веб сервака
https://docs.microsoft.com/en-us/iis/get-started/whats-new-in-iis-8/iis-80-dynamic-ip-address-restrictions
Для больничек и финансовый хайлоад (сбер, лол) очень часто имбецилы и пишут, особенно когда больнице на хайтек карман жмёт или туда начинает влезать гос-во. Приходилось проходить.
Для боингов планка конечно крутая, но и туда прорываются. Если разработка не для летающих сараев, то тебя будут драть по устройству cpu, ram и прочему байтойобству.
Ну так я и говорю, что после 30 лет опыта доверить простые датчики не каждому можно, а тут 15 летнего сеньйора, прошедшего книжки по алгоритмам и сделавшего пару десяток простых приложений от веб-сайтов до движка для видеоигр и своего компиляторя В ЛУЧШЕМ СЛУЧАЕ будут садить делать софт с тяжелейшим domain и requirements, а в худшем речь идет про школьника, которые веб-сайты по туториалам научился клепать/скрипты на юнити/приложения для андроида.
>>667485
Именно так, но не про армию, а про то, что уровень сеньйора - это уже не уровень просто программирования, это уже специализированные знания computer science/научной области или бизнеса в которой работает программист. Конечно, если вы дженерик-конюшна-abstract приложения клепаете, то да, "сеньйором" стать в 15 лет можно. Поэтому нехуй себя сеньйорами называть после 5 лет клепания mvc приложений для разных галер.
var controls = Controls.OfType<Button>.ToArray();
foreach (c in controls) {
c.BackgroundColor = Color.GayishBlue;
}
Может тебе ещё отсосать?
private void laba1() {
IEnumerable<Control> GetControlHierarchy(Control root) {
var queue = new Queue<Control>();
queue.Enqueue(root);
do {
var control = queue.Dequeue();
yield return control;
foreach (var child in control.Controls.OfType<Control>())
queue.Enqueue(child);
} while (queue.Count > 0);
}
GetControlHierarchy(this)
.Where(x => x is Button || x is Label || x is TextBox)
.ToList()
.ForEach(x => x.BackColor = Color.Blue);
}
>Нормальный язык в шарагах преподавать не будут
Охуенная у тебя логика, в моей преподавали java с sql несколько лет подряд например. Они тоже через три года вымрут?
У меня зарплата в рублях и повышать её явно никто не собирается. In fact, она падает даже в рублях.
>норм стек под C#
>много лет пишу на Windows Forms за $1000
Здесь что-то не сходится.
Как можно себя не уважать и много лет писать за миску джуна?
Рынок сярпа за пределами северной америки практически не существует, на 3к$ позицию в москве по 200 апплаев выпердышей из всевозможных говновузов
1000$ за настолько рудементарный шлак как винформы еще поискать надо
Как хорошо, что я выбрал веб.
Веб это то, ради чего С# создавался много лет назад, но люди еще не осознали (и осознают не скоро)
winforms-кун
Нильзя! Я так скозал! Не смей!
разрешаю
Одной книги будет мало, читай теперь Альбаири, потом открывай книгу по паттернам и принципам комментирования (Agile Principles, Patterns, and Practices in C#), далее тебе понадобится книга по .NET Core, после этого ты либо учишь ASP.NET фреймворк, либо WPF, а также закрепляешь всё книгой по базам данных. И только тогда можешь переходить к практике.
Задачки на структуры данных и алгоритмы можешь найти на:
https://leetcode.com/problemset/all/
Спасибо, анон. Еще такой вопрос, в списках рекомендуют вместо Альбахари Рихтера пройти, в чем разница?
Выглядит как неплохой способ одновременно выполнять множество HTTP-запросов.
Почему тогда руководство советует всегда делать await https://docs.microsoft.com/en-us/dotnet/visual-basic/language-reference/error-messages/bc42358 какой тогда смысл в асинхронности, если всегда ждать выполнения?
Это для клоунов которые не понимают что вообще происходит и обсираются на асинхронщине. Если ты понимаешь что такое асинхронность, как с ней работать и зачем она тебе нужна то спокойно забиваешь на await.
Сейчас я сериализую/десериализую их лютым говнокодом с использованием jobject["name"] из newtonsoft.json.
По идее надо бы их обрабатывать методом ToObject<struct>/FromObject, но я хз как это прикрутить.
В общем накидайте советов мудрых, с меня как всегда.
Рихтера нужно проходить в самом конце, уже после практики. Рихтер это взгляд в глубину. Альбахири это тоже своего рода взгляд в глубину, но не такой детальный как у Рихтера.
>какой тогда смысл в асинхронности, если всегда ждать выполнения?
Смысл в том, что передаётся управление в контекст вызвавший асинхронную функцию, т. е. у тебя программа не застывает, а продолжает функционировать.
Если тебе множество запросов нужно сделать, то для этого используется массив, и никаких await не нужно. В этом и заключается бест практис - ты составляешь свой код так, чтобы у тебя не было необходимости пропускать await, потому что это понижает читаемость кода. Сейчас ты помнишь, что это асинхронный метод, а через неделю ты забыл. Не говоря уже о посторонних разработчиках.
+ вот это полезная статья:
https://weblog.west-wind.com/posts/2012/aug/30/using-jsonnet-for-dynamic-json-parsing
Больше понадобятся знания алгоритмов и структур данных, знаний именно шарпа в юнити не много.
Очевидно, что если шарп не знаешь, то начинать с него нужно, но не углубляясь в детали. Базового синтаксиса будет достаточно. После чего сразу можешь переходить к алгоритмам и структурам данных, может тебе это вообще не зайдёт. Далее углубляешься в тему асинхронности, параллелизма и многопоточности. Закрепляешь всё принципами и паттернами проектирования. И вот тогда уже можешь начинать вкатываться в юнити. И не с ёбанных курсов, курсы это дно. А с книг.
>асинхронности, параллелизма и многопоточности
У юнити особый путь насчет этого дела, либо имитация многопоточности в корутинах, либо ecs, которое ближе к функциональному программированию наверное.
С самим жс никаких проблем, кажется, нет, прочитал онлайн-учебник из их треда, он наоборот хороший единственный новый концепт там это прототипное наследование, вся функциональщина на месте, что такое рекурсия и промисы мне изучать заново не надо.
Думаю, надо имиджборду написать по доброй традиции, только я с фронтом ещё совсем не разобрался. Все советуют какой-то Vue и React, в отличие от самого JS с ними нихуя не понятно.
winforms-кун
Проектирования))))
Сложно понять по откмментировавшим тебя кунам, понимают они чего пишут или нет, но на всякий случай еще один ответ добавлю.
Без await твой код, который выполняет какую-то IO операцию и помечен как async будет выполняться синхронно. Т.е. поток, который выполняет твою функцию будет тупо сидеть и ждать, когда внешняя операция завершится (БД, веб АПИ, любой другой сервис, который не CPU bound, т.е. выполняется на другом процессоре, а не том же самом где крутится твой прога).
У ОС ограниченное кол-во потоков. Если твой код принимает 1к+ запросов в минуту и каждый из них будет просто висеть и ждать 1сек+, пока сторонний сервис не вернёт ответ, то у тебя образуется огромная очередь из запросов, которые в итоге начнут вываливаться с timeout и nonexistent network ошибками. А те запросы, что в итоге обработаются, будут выдаваться с 10-100-200 сек задержкой.
При async/await у тебя внутри создаётся state machine, которая помечает точку, откуда управление передаётся в другой поток и возвращает выполняемый поток в общий Thread Pool. Когда внешний сервис вернул ответ, то state machine выделяет новый поток и продолжает выполнение твоего кода. Так ты увеличиваешь throughput своего приложение тысячекратно.
Task.Run(() => action) - этот чувак создаёт background thread и запускает твой action там, а сам продолжает выполнение основного метода. Называется fire-and-forget mode.
Этот путь не спасёт тебя от описанной выше проблемы, т.к. код будет палалелльным, но нифига не асинхронным, твой поток так же будет сидеть и ждать завершения внешней операции.
Косяк в начале. Без await, как и сказали до этого, твой метод будет продолжать выполняться. Это норм, если тебе не надо ждать выполнения твоего async метода.
Забей на жс фреймворки в начале. Попытайся сваять что-то вручную без всяких сторонних библиотек (ну может только jQuery, но и он нынче не нужен, потому что стандартный браузеровский АПИ много из этого уже умеет).
Там главная проблема - это мысленно суметь провести грань между backend и front-end (хз почему один пишут с дефисом, а другой нет).
Твой бэк на дотнете принимает запрос (request) от браузера, ты его обрабатываешь и отдаёшь ответ (response). Всё.
Тебе надо суметь вызвать метод на бэке (копай routes) через, например, Controller -> Action и вернуть какую-то модель обратно. В твоём html ты эту модель принимаешь и рендеришь чего надо. Хоть через Razor, хоть через asp теги, хоть вручную делая из жс ajax запрос.
А потом научишься уже эти модельки и через Vue и React и Angular обрабатывать.
Тебе следует перечитать темы асинхронность, многопоточность и параллелизм и перестать нести хуйню.
>Там главная проблема - это мысленно суметь провести грань между backend и front-end
Ну отдавать html я научился, это совсем не проблема. Клиент-серверные вафельницы успел пописать и на формах. Синтаксис Razor тоже для даунов-аутистов. Пока самая большая загадка именно фронтенд. Там какие-то селекторы, псевдоэлементы, малофья, и всё не похоже на то, что я видел давным-давно в универе когда не было html5.
Спасибо, что читаешь мои высеры, мне тут немного одиноко.
winforms-кун
Такой первый ответ и ожидал.
Если есть реальный опыт в хайлоаде, когда у тебя и CPU и RAM на 100% используются на всех серверах разом, то рад буду что-то новое/полезное услышать.
Уже давно возникла идея решения задач через программу. Но есть микро загвоздка - я в душе не ебу как её реализовать и можно ли это реализовать вообще:
На пикчербокс ты сам перетаскиваешь нужное тебе изображение и оно автоматически привязывается к валу(ременная передача на 1-м валу. на втором валу та же ременная + подшипники + зубчатая передача), который при этом сам рисуется на том же пикчербоксе(как на картинке). Это реализуемо или я попросту зря трачу своё время?? В интернете хуй найдешь подобное, уже пробовал. Благодарю каждого за ответ
Ебашу в vs на windows forms
И да, и нет. Сложно понять, тут либо очень сложно, либо очень просто. Ну ты понял. Сами изображения форм не выглядят сложно, возможно если есть статистическая основа то можно закодить туда "крепления" для других геометрических форм. У нас на работе так квадраты можно перетаскивать и приклеплять к другим через линии, ну и типо flow constructor в итоге, но я туда ни разу не смотрел, на формах всё.
Кароче снизь сложность задачи до самой легкой, которую даже собака решит, забудь вообще про окружности и про там эти приборы какие-то там, работай с квадратами, и максимум два твоих этих валов линии кароче, и попробуй сделать на формах самое примитивное. Если получится и адекватный объем работы, то оттуда иди дальше.
>>669587
Спасибо, добрый человек. Сегодня-завтра попробую и отпишу
>При async/await у тебя внутри создаётся state machine, которая помечает точку, откуда управление передаётся в другой поток и возвращает выполняемый поток в общий Thread Pool.
Верно только то, что создаётся state machine. Далее идёт ошибочное заключение о том, что управление передаётся в другой поток и про выделение нового потока.
await как раз и создавался для того чтобы не создавать новых потоков для асинхронных I/O операций, которые эти потоки никак ускорить не могут, потому что эти операции от них не зависят, это не вычислительные операции, это операции которые используют сторонние ресурсы - сначала системное API, потом системные дескрипторы, после чего всё передаётся во внутреннюю систему устройства (жесткий диск/сетевой адаптер). И всё это время поток ничего не делает, он просто ждёт. Поэтому и нет смысла создавать отдельный, когда у тебя уже есть один.
Thread Pool в таких ситуациях задействуется только во время получения ответа от стороннего ресурса и для уведомления потока, который вызвал асинхронную операцию, о том, что он получил ответ и пора вернуться и продолжить код идущи после оператора await.
И создание отдельного потока в таких ситуациях действительно может произойти, но только в том случае, если инициализировавший асинхронную операцию поток оказывается занят (именно поэтому не рекомендуется в асинхронном коде использовать Thread.Sleep()) и создание нового потока является нежелательным, так как это тратит много ресурсов и заставляет заниматься синхронизацией контекстов вызвавшего и нового потока.
Лучше на wpf такое делать, у неё больший функционал для работы с графикой.
Спасибо за детальный ответ.
https://docs.microsoft.com/en-us/dotnet/standard/async-in-depth
Под
>управление передаётся в другой поток
имелось ввиду что дальше выполнение будет где-то на другом ЦПУ, пусть и виртуальном (если речь о настоящем IO), ведь выполнение чего-либо без потока в принципе не возможно. И этот ЦПУ может быть на другой машине, на другой ОС и т.д. А настоящий поток, в котором исполняется операция, далее не используется, и либо
- возвращается системе для переиспользования;
- прогоняется синхронно, ожидая выполнения. Тут зависит от длительности операции и стратегии оптимизации, которую конкретный runtime выбрал.
Я и не говорил, что новый поток создаётся. Используется уже готовый и ожидающий в системе. Можно было конечно яснее излагаться.
>await как раз и создавался для того чтобы не создавать новых потоков для асинхронных I/O операций
Я по-моему то же самое написал. Тут или мой скил писанины страдает, или ваш - чтения.
https://docs.microsoft.com/en-us/dotnet/standard/threading/the-managed-thread-pool
>Use of the thread pool is significantly easier in Framework 4 and later, since you can create Task and Task<TResult> objects that perform asynchronous tasks on thread pool threads.
Пул потоков имеет какое-то ограниченное кол-во готовых к использованию потоков. Для IO операции поток сначала возвращается в пул и после возврата ответа от стороннего процесса выдаётся другой поток (редко тот же самый) для продолжения операции. Это легко проверить через тесты или в дебагере. ID у изначального потока и у того, который будет продолжать оперцию, будут разные. Из-за этого можно потерять изначально имеющиеся данные, если о них за ранее не позаботиться (всякие Sync Context, ConfugreAwait, и прочие плюшки).
Такое ощущения что я заного первое сообщение переписываю.
Я даже попровал, всё работает.
Никаких. Не стоит.
>await как раз и создавался для того чтобы не создавать новых потоков для асинхронных I/O операций, которые эти потоки никак ускорить не могут, потому что эти операции от них не зависят, это не вычислительные операции, это операции которые используют сторонние ресурсы - сначала системное API, потом системные дескрипторы, после чего всё передаётся во внутреннюю систему устройства (жесткий диск/сетевой адаптер). И всё это время поток ничего не делает, он просто ждёт. Поэтому и нет смысла создавать отдельный, когда у тебя уже есть один.
Я вот одного не могу понять толком: что делает await?
Я правильно понимаю, что он блокирует выполнение кода до окончания выполнения вызванного асинхронного метода. То есть останавливаемся и ждем, пока метод выполнится.
Или нет?
И что будет, если асинхронный метод (объявленный с ключевым словом async) вызвать без всякого await, то есть написать method (arg1, arg2...)? Он где-то выполнится асинхронно (возможно, в другом потоке), а выполнение метода, вызвавшего его просто продолжится? Или для такого поведения делать Task.run()?
Это и так понятно. Просто смущает данная фраза
>The await operator suspends evaluation of the enclosing async method until the asynchronous operation represented by its operand completes. When the asynchronous operation completes, the await operator returns the result of the operation, if any. When the await operator is applied to the operand that represents an already completed operation, it returns the result of the operation immediately without suspension of the enclosing method. The await operator doesn't block the thread that evaluates the async method. When the await operator suspends the enclosing async method, the control returns to the caller of the method.
Вроде в первом предложении написано, что вызывающий метод приостанавливается и "ждет" возврата из вызванного с await метода, но тут же написано, что поток не блокируется. Это как?
Он оборачивает вызываемый метод в Task/Task<T> и добавляет к нему вызов ContinueWith после которого у тебя выполняется остальная часть кода, которая идёт после await.
например:
int sum = await Sum(2,2);
Оборачивается в
Task<int>.Run(()=>//здесь будет выполняться развернутый код асинхронного метода Sum).ContinueWith(r=>sum = r // и тут остальной код после await);
Поток который его вызвал освобождается и может выполнять другую работу приложения, например участвовать в обновлении интерфейса.
> что будет, если асинхронный метод (объявленный с ключевым словом async) вызвать без всякого await
Будет обычный Task.Run, после которого выполнение кода продолжиться, например:
int sum = Sum(2,2);
int sum2 = Sum(3,3);
Превратится в
Task<int> sum = Task<int>Run(()=>код Sum);
Task<int> sum2 = Task<int>Run(()=>код Sum);
И код продолжит выполняться.
Это так, что поток освобождается и не ждёт выполнения операции. Т. е. он попадает в пулл потоков и тот уже распределяет его на другие задачи, которые нужно выполнять. Т. е. это избавляет от оверхеда при создании нового потока.
>Тебе надо суметь вызвать метод на бэке (копай routes) через, например, Controller -> Action и вернуть какую-то модель обратно. В твоём html ты эту модель принимаешь и рендеришь чего надо. Хоть через Razor, хоть через asp теги, хоть вручную делая из жс ajax запрос.
Немного неочевидно написал, с твоего ответа может показаться, что мы на фронте можем что-то рендерить с помощью Razor и asp тегов, но всё это происходит на бэке, на фронт уже чистый html приходит.
будешь CEO кофе носить и приказы исполнять. Такие кадры нужны, вкатывайся
Фронт-енд не нужон, я так считаю. Джейсон жив.
>например:
>
>int sum = await Sum(2,2);
>
>Оборачивается в
>
>Task<int>.Run(()=>//здесь будет выполняться развернутый код асинхронного метода Sum).ContinueWith(r=>sum = r // и тут остальной код после await);
>
Это жирный троллинг или ты просто долбаеб?
Понятно, что там всё делается через стейт машину, внутри которой сощдается таск, но принцип одинаковый, как и результат.
await это обычный сахарок, который позволяет не засирать код созданием тасков и связанных с ними конструкций, именно таких которые я описал.
Ну сделай пул со счётчиком и запускай в новом потоке, увеличивая счётчик, при выполнении таска уменьшай. Крути всё это в цикле и всё. Но ты учти, если и тебя таски короткие, то будет только хуже с многопоточностью.
T P L
P
L
Parallet.For/Foreach могут принимать ParallelOptions, где можно установить MaxDegreeOfParallelism.
Спасибо, бро, мне тут стыдно что самому в голову не пришло
>но принцип одинаковый
Task run выполняет делегат в ОТДЕЛЬНОМ потоке из пула.
async await вообще не про это, так что нет, не одинаковый, никакого Task run там нет
>Task run выполняет делегат в ОТДЕЛЬНОМ потоке из пула.
Он ничего не выполняет, он отправляет задачу в очередь тред пула. Также, как и await. Вот только разница в том, что продолжать выполнение кода после await будет тот же поток, который принял на себя выполнение задачи перед await
Вот тебе две ситуации на скриншотах.
1. Выполнение всегда начинает поток под номером 1, далее он отдает задачу в пулл потоков при помощи Task.Run и та выполняется свободным потоком, в это время поток #1 продолжает работу и доходит до оператора await, после чего он освобождается, передав задачу пулу потоков, и далее мы видим, что код после await всегда выполняется потоком, который взял на себя задачу после оператора await
2. Получаем тоже самое с использованием Task.Run().ContinueWith(t=>{}, TaskContinuationOptions.ExecuteSynchronously), только за счёт большего количества кода. Т. е. происходит именно то, о чём я писал.
И вот теперь мы можем представить, какой говнокод нам нужно было породить, если бы нам нужен был не один await, а несколько, между которыми были бы блоки кода.
>не про это, так что нет, не одинаковый
Не про это, потому что ты не понимаешь что происходит и тебе так кажется?
>после await будет тот же поток, который принял на себя выполнение задачи перед await
Вот не надо тут. Зависит от контекста синхронизации
Это уже детали. Если .ConfigureAwait(false) добавить после await то поведение будет таким же как в консольном приложении.
>Судя по тому, что посты движутся - это аутопсия студентов
Первый раз в этом разделе и тыкнул на первый попавшийся (этот) тред? Или это очередной "наитончайший" троллинг от завидующего жаба-петуха?
>Да не то чтоб дтали. Довольно важная для понимания вещь, а у тебя относительно нее в самом начале поста неверное утверждение.
И в чём неверность? await всегда стремиться работать в том потоке, в котором он запущен.
Например, "какдела_" -> "какд ела_"
От того что я доки почитаю у тебя знаний прибавится или как это работает?
>await всегда стремиться работать в том потоке, в котором он запущен.
Вот в этом и ошибка. Не старается он ничего делавть, как я и писал, все зависит он контекста.
Почему все дурачки такие самоуверенные и даже не пытаются что-то почитать по теме, перед тем как начать срать себе в штаны?
>Он ничего не выполняет, он отправляет задачу в очередь тред пула. Также, как и await.
Хорошо, не выполяет а отправляет задачу в очередь для выполнения на потоке из пула.
НО, это не отменяет того факта что:
async await НЕ разворачивается в кострукции вида
>>670245
>int sum = await Sum(2,2);
>
>Оборачивается в
>
>Task<int>.Run(()=>//здесь будет выполняться развернутый код асинхронного метода Sum).ContinueWith(r=>sum = r // и тут остальной код после await);
>
Никакого Task.Run там нет.
>>671341
>Также, как и await
Нет и еще раз нет.
Берем условный asp net.
Код вида
async doSmthAsync() {
var x = await DoSmthElseAsync()
}
По-твоей логике выше, есть один поток, встречается await с делегатом, который кладется в Task.Run, вызывающий поток освобождается.
Какой по-твоему в этом блять смысл? Освободить один поток чтобы занять другой из пула?
Код с async\await выполняется СИНХРОННО на том же потоке, до создания таска (не обязательно через Task Run, зависит от деталей реализации, возможно через taskcompletionsource, еще одного потока может не быть),
Если таска не завершена, то встречается await и поток освобождается.
Таска завершается (сигналит IOCP в случае с IO операцией), код после await продолжается возможно на другом потоке, тут уже зависит от контекста синхронизации
>>671341
>Не про это, потому что ты не понимаешь что происходит и тебе так кажется
Учитывая весь контекст высеров выше, я могу сделать заключение что это жирный троллинг.
Или же
>>671014
>ты просто долбаеб
>Он ничего не выполняет, он отправляет задачу в очередь тред пула. Также, как и await.
Хорошо, не выполяет а отправляет задачу в очередь для выполнения на потоке из пула.
НО, это не отменяет того факта что:
async await НЕ разворачивается в кострукции вида
>>670245
>int sum = await Sum(2,2);
>
>Оборачивается в
>
>Task<int>.Run(()=>//здесь будет выполняться развернутый код асинхронного метода Sum).ContinueWith(r=>sum = r // и тут остальной код после await);
>
Никакого Task.Run там нет.
>>671341
>Также, как и await
Нет и еще раз нет.
Берем условный asp net.
Код вида
async doSmthAsync() {
var x = await DoSmthElseAsync()
}
По-твоей логике выше, есть один поток, встречается await с делегатом, который кладется в Task.Run, вызывающий поток освобождается.
Какой по-твоему в этом блять смысл? Освободить один поток чтобы занять другой из пула?
Код с async\await выполняется СИНХРОННО на том же потоке, до создания таска (не обязательно через Task Run, зависит от деталей реализации, возможно через taskcompletionsource, еще одного потока может не быть),
Если таска не завершена, то встречается await и поток освобождается.
Таска завершается (сигналит IOCP в случае с IO операцией), код после await продолжается возможно на другом потоке, тут уже зависит от контекста синхронизации
>>671341
>Не про это, потому что ты не понимаешь что происходит и тебе так кажется
Учитывая весь контекст высеров выше, я могу сделать заключение что это жирный троллинг.
Или же
>>671014
>ты просто долбаеб
cyberforum, so, social.msdn и т.д даже на гитхабе есть интересные обсуждения. Это если вопросики порешать и обсудить фишки и фичи. А если похуесосить, то, конечно двач хорош, только не надо удивлятся, что вместо интересных тем тут обсуждения говно vs мочa.
Напишу в третий и последний раз - этим занимается SyncronizationContext. Ты писал
>разница в том, что продолжать выполнение кода после await будет тот же поток
это неверно.
Всё что от тебя слышно это "НЕВЕРНО ЭТА НИТАК!!!", давай пример, который опровергает эти слова.
Показывай код, который после await выполняется не в том же потоке, в котором выполнялась асинхронная функция перед этим оператором.
спасибо
Ты сам называл такие случаи: ConfigureAwait(false) - и таска не будет использовать захваченный контекст или если захваченный контекст многопоточный.
Да в общем-то это поведение по-умолчанию, если не используется однопоточный контекст.
>async await НЕ разворачивается в кострукции вида
Ты действительно настолько тупой или прикидываешься?
Перечитай хотя бы цепочку постов, человеку рассказали про стейт машину, он не понял, поэтому я и провел ему аналогию которую понять легче, использовав в ней Task.Run.
Тебе когда сложение в школе объясняли, приводя в пример какие-нибудь яблоки, ты тоже начинал кричать, что цифры это не яблоки?
>Какой по-твоему в этом блять смысл? Освободить один поток чтобы занять другой из пула?
Уебище тупорылое, в этом и смысл асинхронности - она не блокирует потоки, она сразу освобождает их.
Дальше идёт какой-то шизобред дауненка, который сломал себе голову в попытках понять асинхронность и многопоточность. Но виноват конечно не ты, а твоя непробиваемая тупость и самоуверенность, которая мешает тебе открыть соответствующую тему и изучить её.
>Я освободил один поток и занял другой.
Нет, ты лучше займешь UI поток CPU-bounded операциейи зафризишь весь интерфейс. Нет, ты будешь ожидать IO-bouded операцию похерев ресурсы. Ведь для тебя освободить текущий, а потом занять другой(или снова этот) поток это так тупо.
>ConfigureAwait(false) - и таска не будет использовать захваченный контекст
И? Что это меняет, долбоеб? Ты хоть понимаешь, что поведение будет зависеть от реализации этого самого синхронизационного контекста? Ты наверно сейчас удивишься, но любой может создать класс реализующий синхронизационный контекст, который будет работать в зависимости от реализации. В зависимости от этой реализации я могу делегировать выполнение задачи в нужный поток, как это и делается в приложениях с UI, а могу просто отправить в очередь на выполнение в тред-пул, как это и делается в базовом SynchronizationContext.
Понял, дебилоид? Слово "базовый" тебе о чём то говорит? Почему тогда ты какие-то отдельные реализации приписываешь этому базовому, скажи нам, дебилоид.
>Я освободил один поток и занял другой.
Или не другой, а этот же освобожденный, либо ты его не освободил, а дал ему возможность продолжать свою работу, как это происходит с потоками отвечающими за интерфейс. В чём проблема, сычуш? Слишком сложно для твоих куринных мозгов?
>Нет, ты будешь ожидать IO-bouded операцию похерев ресурсы
Я не предлагал ее ждать, но никакого потока там нет.
Я выше уже писал.
Делаешь запрос к базе, сделав вызов из UI потока, GetSmthAsync(), весь код, выполняется синхронно, в этом же, UI потоке. Делается запрос к базе, возвращается Task, НЕ ЗАВЕРШЕННЫЙ, встречается await, UI поток НЕ БЛОКИРУЕТСЯ, ОСВОБОЖДАЕТСЯ.
ВСЁ. Завершается IO операция, на каком-то потоке продолжается код после await. На каком именно зависит от контекста синхронизации.
Никаких Task run в момент вызова GetSmthAsync НЕТ
>>671595
>Или не другой, а этот же освобожденный, либо ты его не освободил
Да какая разница, дебил, с твоей логикой асинхронность в условном вебе нахуй не нужна.
Ты предлагаешь ОСВОБОЖДАТЬ ОДИН ПОТОК, чтобы вернуть в пул, но при этом из пула забираешь другой. Вопрос, НАХУЯ?
>>671595
>В чём проблема, сычуш
Ни в чем, ты пытаешься жирно троллить, но у тебя не выходит, съеби с борды
>GetSmthAsync()
>весь код, выполняется синхронно
>Async
>выполняется синхронно
Не перестаю проигрывать с животного.
>Ты предлагаешь ОСВОБОЖДАТЬ ОДИН ПОТОК, чтобы вернуть в пул, но при этом из пула забираешь другой. Вопрос, НАХУЯ?
Как было:
Потоку нужно сделать веб-запрос, он использует API системы в которой запущен процесс, т. е. использует неуправляемый код и начинает ждать ответ от этого неуправляемого кода, потому что система должна была ответить именно этому потоку, он создал I/O пакет и именно он получит ответ от системы.
Как стало:
Потоку нужно сделать веб-запрос он использует API системы в которой запущен процесс, т. е. использует неуправляемый код и ...
Вот тут напряги остатки своего мозга
он делегирует задачу ожидания ответа от неуправляемого кода тред-пулу, а сам освобождается, либо продолжает выполнять другую работу. Получив ответ от неуправляемого кода, тред-пул либо продолжает код после await без синхронизации контекста, т. е. в новом потоке, как мы это видели выше на скриншотах, потому что это стандартное поведение, либо он синхронизирует контекст с вызвавшим потоком и продолжит работу на нём, как это обычно происходит в приложениях с UI.
Что в этом сложного, урод? Почему ты до сих пор не можешь этого понять?
>>Async
>>выполняется синхронно
До await код выполняется синхронно
>>671646
>он делегирует задачу ожидания ответа от неуправляемого кода тред-пулу
Ты в очередной раз обосрался
Обтекай
>>671646
>Что в этом сложного, урод? Почему ты до сих пор не можешь этого понять?
Что именно понять, долбаеб залетный, съеби уже со своим жирным троллингом
async await у него в Task run блять разворачивается, освободил один поток и занял другой, клоун блять
>Ты в очередной раз обосрался
Ясно.
Просто запощу эти скриншоты для других. Понятно, что ты начнёшь отрицать, что всё не так изображено и что Рихтер в очередной раз обосрался, но здравомыслящим будет полезно посмотреть.
Он и так на васм, шизик.
>Ты хоть понимаешь, что поведение будет зависеть от реализации этого самого синхронизационного контекста?
Смотри что я тебе писал
>Зависит от контекста синхронизации
>все зависит он контекста.
>Напишу в третий и последний раз - этим занимается SyncronizationContext
И ты теперь переобулся и пишешь, что я не понимаю, что оно зависит от контекста? Тебе там опухоль на мозг давит?
>>671587
> этому базовому
А с чего ты взял, что формовский/впфшный более базовый, чем консольный/аспшный? попробуй в налл установить и увидишь, хотя ты это уже знаешь, что ты обосрался и авэйт не сохраняет поток.
>>671619
>но никакого потока там нет
Wow. Теперь в дотнете можно исполнять код вне потока! А мужики-то не знают.
>>671619
>Никаких Task run в момент вызова GetSmthAsync НЕТ
Я хз, что ты высрал. Я про таск раны ничего не писал.>>671619
>Да какая разница, дебил, с твоей логикой асинхронность в условном вебе нахуй не нужна.
>Ты предлагаешь ОСВОБОЖДАТЬ ОДИН ПОТОК, чтобы вернуть в пул, но при этом из пула забираешь другой. Вопрос, НАХУЯ?
В вэбе-то она как раз очень нужна, ибо дофига времени тратится на транспортном уровне, работой с базами и т.д. И поток освобождается и кладется в пул, что б другие задачи могли им пользоваться пока идут IO операции. Это же основы асинхронщины.
Еще раз для тебя дегенерата напишу: код после авэйта не всегда выполняется в том же потоке, что и до. Я хз зачем ты пытаешься с этим спорить.
Как этот высер противоречит тому что я писал выше, что никакого ЕЩЕ ОДНОГО ПОТОКА, видимо тебе долбаебу нужно капсом, нет?>>671691
>Wow. Теперь в дотнете можно исполнять код вне потока! А мужики-то не знают.
Маня фантазии о том, о чем я не писал. Да, долбаеб, физическому устройству потоки нахуй не нужы, вот это откровение.
>>671691
>Это же основы асинхронщины
да, я понял ТВОИ маня основы асинхронщины: пришел запрос, его подхватил поток. в коде IO операция, вместо использование текущего потока, СОЗДАЕТСЯ еще один поток, который что-то там делает, а прошлый освобождается.
ОХУЕТЬ, вот это асинхронщина.
>>671691
>код после авэйта не всегда выполняется в том же потоке, что и до.
>>671619
>Завершается IO операция, на каком-то потоке продолжается код после await. На каком именно зависит от контекста синхронизации
Ты тупой, да?
>А с чего ты взял, что формовский/впфшный более базовый, чем консольный/аспшный?
Долбоеб, в формовском и впфном он как раз не базовый, так как это фреймворки. Базовый как раз в консольном приложении и выполнение будет одинаково независимо от ConfigureAwait.
>авэйт не сохраняет поток.
Уебище дегенеративное, где я хоть что-то про сохранение потока писал? Потоки синхронизируются, а не сохраняются.
Ты сам-то чьих будешь?
>где я хоть что-то про сохранение потока писал?
>>671341
>продолжать выполнение кода после await будет тот же поток, который принял на себя выполнение задачи перед await
>>671700
>его подхватил поток. в коде IO операция, вместо использование текущего потока, СОЗДАЕТСЯ еще один поток, который что-то там делает, а прошлый освобождается.
Нет, дебич. Пришел запрос, его подхватил поток из пула, сделал запрос в БД, пока БД проперживается поток ушел обратно в пул и обрабатывает другие запросы. Когда БД раздуплилась как твое очко, поток из пула (любой) продолжил выполнение кода первого запроса.
>Как этот высер противоречит тому что я писал выше, что никакого ЕЩЕ ОДНОГО ПОТОКА, видимо тебе долбаебу нужно капсом, нет?
Где вот в этом высере:
>он делегирует задачу ожидания ответа от неуправляемого кода тред-пулу
>Ты в очередной раз обосрался
Есть хоть что-то про еще один поток, долбоеб?
>берется из пула, имел ввиду, в случае с твоим высером с task run.
Так судя по всему для тебя разницы нет.
На скриншоте даже написано для таких умственно отсталых как ты, что именно тред-пул получает ответ от I/O устройства. Теперь вспоминай за что отвечает тред-пул и чем он управляет? Как он по твоему должен продолжить выполнение кода после await, обработав этот ответ? При помощи чего? При помощи магии дружбы? Или всё таки при помощи потоков которыми он управляет?
Ты пойми, долбоебик, когда ответ получен, он уже находится в одном из потоков и именно в нём происходит решение, производить синхронизацию исходя из захваченного синхронизационного контекста, передавая полученную информацию вызвавшему потоку, либо продолжить код после await самостоятельно, без синхронизации.
Именно для этого и нужен ConfigureAwait(false), чтобы не было траты ресурсов на синхронизацию, если тебе не нужно чтобы код после await продолжился именно в том потоке, в котором исполнялся код перед этим await.
Ну и? Сохранение то где, уебище тупорылое? Он его не сохраняет, он синхронизируется с ним и продолжает выполнение кода после await в нём. В приложениях с UI есть поток который постоянно занимается интерфейсом и всё что с ним связано, поэтому если ты используешь после await объекты которые принадлежат этому потоку, тебе нужно синхронизироваться с ним, передавая ему полученные данные из await, либо просто сигнализируя о том, что таск после await выполнен и он может продолжать свою работу. Если этого не сделать, поставив ConfigureAwait(false), то программа вывалится в эксепшн, потому что поток из тред пула попытается получить доступ к объектам интерфейса.
Ты слишком часто меняешь позицию и игнорируешь ответы, а лишь выдаешь рандомные высеры. Как тролль ты неумеха, а как собеседник слишком туп.
А ты знал, что в Core вообще нет такого понятия, как контекст синхронизации? Серьезно, я не троллю. Следовательно и ConfigureAwait() бессмысленно вызывать. Так что нужно освежить знания немного. И это очень важно, так как меняет очень многое.
Конечно, ведь это у меня то кто-то обосрался, то кто-то троллит, ведь это я не предоставил никакого кода в доказательство своих слов, не приводил выдержки из статей и из книг.
Есть длл 1 которая зависит от длл 2
Длл 1 не знает о конкретной реализации некоторых классов длл 2, то есть обращается к ним через интерфейсы получая объекты типа интерфейса.
Как мне рассклеить длл 2 так чтобы там были только интефейсы, а в какой-то новой длл 3 вся реализация?
Тут получается что 1 зависит от 2, 3 тоже зависит от 2.
Однако 2 нужно знать как создавать объекты из длл 3 чтобы вернуть их 1 длл.
Может я хуйню написал и никто так не делает, поправьте если что.
В каком Core, блять, дебил? ASP.NET Core это фреймворк, если от тебя его в нём скрыли, это не значит, что его нет, это значит, что тебе не дают управлять данным поведением и всех подстраивают под своё решение.
Берёшь и расклеиваешь, очевидно. Делается это при помощи паттернов проектирования, какой из них нужен именно тебе зависит от кода, решить это по "вот длл от этой а вот та от этой в этой интерфейс а та объекты из того создает" невозможно.
Вот это - Agile Principles, Patterns, and Practices in C#, от роба мартина, почитай. Там как раз такие ситуации описываются и разбираются.
Сап,
Один из референсев не установился или не находится и выходит ошибка Assembly not found for framework .Net Framework 4
Подскажите что не так и как можно пофиксить?
Может то что ты пытаешься установить не совместимо с 4 фреймворком на котором ты создавал текущий проект в который пытаешься добавить зависимость.
Вполне возможно. 4 как я понимаю самая новая версия и из неё могли выпилить старый референс. Тогда как узнать в какой версии он был чтобы откатиться к ней?
>4 как я понимаю самая новая версия
Сильное заявление. Все уже давно на NET Core 3.1 перешли, а у тебя 4 фреймворк - самая новая версия. Нет, она не самая новая, самая новая из .NET Framework это восьмая. Самая стабильная и обратно совместимая со всеми другими - .NET Framework 4.5
Это два чувака отношения выясняют, причём используют периодически аргументы оппонента как их собственные. Но вообще - да.
>>671790
https://devblogs.microsoft.com/dotnet/configureawait-faq/
>I’ve heard ConfigureAwait(false) is no longer necessary in .NET Core. True?
>False. It’s needed when running on .NET Core for exactly the same reasons it’s needed when running on .NET Framework. Nothing’s changed in that regard.
https://github.com/davidfowl/AspNetCoreDiagnosticScenarios/blob/master/AsyncGuidance.md#configureawait
А тут вообще TBD (to be determined).
Хорошо, значит 4 стабильная. Перепроверил настройки VS, там 3.1 версии стоят.
Как исправить проблему с Assembly not found?
Бля, анон, 3.1 это core, 4.х это framework
Это разные вещи, параллельные, так сказать
Ты скажи, что ты подключаешь и откуда
Там как раз и написано, то о чём я сказал - создатели фреймворка сдеоали везде поведение как при configureawait(false), но это никак не влияет на используемые сторонние библиотеки, если у них внутри есть нестандартный синхронизационный контекст, то он будет использоваться.
Не два, а три. И они делятся на - не понимает асинхронизацию, понимае наполовину, понимает.
Двачую этого токсика, у дяди Боба все написано.
дополню: Разве десктоп жив? Зачем студентом проекты на WPF/WinForms? Тупо время молодняка убить?
По хорошему WinForms должен быть - всё.
Но МС продолжают выпускать обновления и поддерживать его до неопределенного периода времени. Вполне вероятно у них огромный багаж легаси на этом фреймворке и они хотят чтобы программисты, поддерживающие этот легаси, не отставали от современных разработок и когда придёт время, смогли перепрыгнуть без прям очень сильного головняка.
В целом рынок десктопных приложух жив и пока будет жить, поэтому UWP/WPF вполне можно учить. Оосбенно учитывая то, что XAML используется Xamarin'ом для мобилок и WPF опыт легко на него переносится.
> По хорошему WinForms должен быть - всё.
Вот хуйня какая-то. У WinForms есть вполне определённое применение - простые оконные приложения, утилитки и т.п. Данные какие-нибудь вводить-обрабатывать, с БД работать, всю эту хуйню на WPF писать, нахуя?
Почему их юзают, почему бы просто не создать публичное поле?
Основная причина багов - возможность изменения состояния переменных. Чем больше кода будет в read-only mode, и чем меньше кода будет публично доступно всем остальным для использования - тем меньше у твоего проекта будет проблем.
По умолчанию всё должно быть private readonly. А дальше думать что конкретно открыть для публики, чтобы выполнить текущую задачу.
Проблема: не могу реализовать синхронное отображение в лейбле результатов выбора из списка (listBox).
Как выглядит решение проблемы: жмакаю мышкой на элемент из listBox --> в lable'e мгновенно отображается описание выбранного элемента.
Единственное, что нагуглил - это отображение в messageBox значения (не описания) элемента из comboBox.
https://metanit.com/sharp/windowsforms/4.6.php
Исходников нет т.к. вся форма захардкожена.
Читал, почти не разобрался (примеры уровня "вот смотрите карой как этот метод использует свойство "свойствонейм" из библиотеки "хуй-пизда" сложны для восприятия)": оказалось примерно сутки пользовался текст боксом вместо лейбла.
После всех потугой получилось сделать такую штуку:
занесли элементы в listbox с помощью конструктора --> приправили магией событие
private void listBox1_SelectedIndexChanged(object sender, EventArgs e)
{
label1.Text = listBox1.SelectedItem.ToString();
}
--> результат: при смене элемента из listbox'a значения копируются в label.
Осталось только понять как организовать такой вывод через массив
(по формулировке : "ключ" : "значение" , где "ключ" отображается только в listbox'e, a "значение" отображается только в label'e)
Я такую фигню для лабы еще в 2006 делал. Нынче это вообще на раз два делается. Пройдёт пару лет и ты от своего собственного поста будешь фейспалмить. У меня щас такое от моих собственных постов в нулевые.
В доках всё есть. Судя по всему у тебя еще знаний не хватает чтобы в доки вникать нормально. Поэтому тут тебе только пример с кодом поможет. Надейся на анона.
первое что нагуглил - https://stackoverflow.com/questions/10239392/c-sharp-combobox-options-dependent-on-another-combobox
Нельзя, потому что виндовый использует инфраструктуру винды, её api, которых нет на других ОС. Для кроссплатформы есть отдельные фреймворки, официальный- Xamarin.
//List<string> bin = Convert.ToString(n, 2).Split('\0').ToList();
Аноны, как получить ссылку на структуру? Есть классы с массивом таких же классов, сами классы мелкие и их много, поэтому хотел сэкономить на указателях на класс и слепить всё на структурах, но GC не даёт ничего сделать и трёт их нахуй. Мне теперь надо все взаимодействия с массивами внутри структуры только из самой структуры производить? Как вложенные структуры изменять, если я не могу в функцию передать эту структуру? С классами всё просто - взял его и таскаешь указатель куда хочешь. А теперь, как я понимаю, всегда создаётся копия структуры и я создаю/меняю копию массива, которая потом удаляется. Массив же это указатель на первый элемент. Так какого хуя ничего не работает и как будто я меняю копии, а оригинал даже не создавался?
У тебя нет \0 в полученной строке. Чтобы разделить строку на символы достаточно вызвать .ToList(), Split не нужен. На выходе получишь List<char>. Если нужен List<string>, то .Select(q => q.ToString()).ToList().
>нет \0
Как нет, если раньше я обычные слова разделял и он там был оО. Разве \0 является 'пустым' разделителем? Или это все таки костыль?
Спасибо за подробный ответ, все получилось.
Почему при каждой новой операции приходится создавать новые переменные. это же нехорошо с точки зрения и чтения и памяти?
Для каждого select, join, toarray и тп приходится создавать переменную почему он не может в процессе просто менять тип переменной? И еще не очень понятно почему некоторые цепочки работают, а некоторые-нет, приходится сначала делать Join в новой переменной, и уже потом return ConvertTo(новая переменная).
Столкнулся с проблемой. Нужно произвести поиск одинаковых элементов в списке и вывод количества одинаковых элементов(прим.: оконная рама - 1 шт, дверная рама - 3 шт, дверь - шт). Не знаю с чего начать, может кто шарит за эту тему?
Уже прошло больше месяца, а ты все пытаешься писать на шарпе, как будто это жс. Неужели тыкать наугад пока не получиться проще, чем прочитать основы и делать нормально, понимая что к чему...
шо то хуйня, шо это хуйня. Имо лучше бы мелкософты сделали для десктопа что нибудь с html синтаксисом, чтобы не нужно было ебаться с конструктором или XAML. Хотя каждому свое, сейчас 99% это веб, на десктоп многие просто забивают хуй
С XAML и не нужно ебаться, всё просто и интуитивно понятно. Нсли у тебя воли только на хтмл хватает, то это далеко не повод лепить его всюду.
Переписывай свои старые проекты на C# или найди работу
> С XAML и не нужно ебаться
> всё просто
> интуитивно понятно
АХАХАХАХАХХААХХА
Я работаю в бекенде, но есть у меня латентный интерес к интерфейсам. Так вот, месяца четыре я делал всякие поделки на wpf/xamarin forms. Получалось какое-то утилитарное говно. Пришлось вникать в dependency property, разбираться с унылым бойлерплейтом, наблюдать протекающую абстракцию в виде куска mvvm. Красивым код назвать было нельзя. XAML – говно, ИМХО. Как вспомню, так тошнить начинает. Inb4 РРЯЯЯ НЕАСИЛИЛ инструмент не должен пихать палки в колеса. Иначе могу предложить тебе спуститься на winapi
Потом попробовал Vue. Анон, это прекрасно. У меня почти не возникало вопросов, как сделать что-то. Удобное разделение компонентов, читаемый синтаксис, куча компонентов. Абстракции не текут, бек и фронт общаются через WEBAPI
Но самый идеал, мне кажется, это Blazor. Пока ещё не ковырял, но мануалы глянул
var input = new[] {"Дилдо", "Массажёр простаты", "Дилдо", "Резиновая кукла", "Дилдо"};
var output = string.Join(", ", input.GroupBy(x => x).Select(x => $"{x.Key} {x.Count()} шт"));
Console.WriteLine(output); // Дилдо 3 шт, Массажёр простаты 1 шт, Резиновая кукла 1 шт
Оче советую почитать книжку Скиены "Алгоритмы. Построение и анализ." Красная такая. Хотя может быть даже тяжеловато будет
>раньше я обычные слова разделял и он там был
Показывай что ты там разделял и где (версию фреймворк/коре).
>Разве \0 является 'пустым' разделителем?
Это обычный символ, как 'a', 'b' или 'c' - строки у нас length-prefixed. А ещё и нуль-терминированные, но только лишь в целях безопасности и совместимости - к этому нуль-терминатору нельзя получить доступ. Потому то строка может включать любое количество \0 и в любом месте. Другое дело что \0 обрабатывается в недрах кода по разному и в зависимости от культуры. Он может как игнорироваться при сравнении, так и учитываться.
Пустым разделителем будет передача null как аргумента Split(null), тогда в качестве разделителя будут использованы пробельные символы. Скорее всего ты именно так и делил.
>и он там был
Значит такая строка у тебя была, с \0 вместо пробелов ("aaaaa\0bbbbbb\0ccccc")
Алсо так и не понял, зачем нужны интерфейсы?
>а то пока я дочитаю до конца то забуду что читал раньше.
Запоминать нужно только базовую информацию, а именно то, что ты можешь сделать и в каком примерно гуглить информацию в документации.
> Но вот в консоли же хер что напишешь
Консольное приложение писать легче, чем десктопное. Неудобство только в управлении им во время рантайма, но это не важно в твоём случае, так как ты пишешь для себя и для практики, поэтому всё нужное можно захардкодить.
>Алсо так и не понял, зачем нужны интерфейсы?
Для реализации полиморфизма. Проще говоря, для того чтобы код было легче читать и поддерживать, меньше лезть в уже написанный код, а только расширять его создавая новые классы, которые наследуют существующий интерфейс. Интерфейсы и абстрактные классы служат инструментами обобщения, т. е. ты видишь одинаковый код в различных классах, значит тебе весь этот код нужно вынести в абстрактный класс, если ты видешь одинаковую сигнатуру методов, значит эти классы нужно объединить интерфейсом, который в свою очередь будет содержатиься в другом классе, работающим с классами, реализующими интерфейс.
Имеет смысл. Спасибо.
У меня нет возможности читать, да и читать нечего. В 100 раз читать введение в язык когда тебе пишут тут луп, тут суп не продвигает тебя ни на йоту.
Да и жс и вообще принципы программирования я выучил только на практике, практика это все, тонны мукулатуры без должного менторства и гайдов правильных не дадут тебе ничего. Тыкая сам и задавая вопросы почему это работает так, а не этак заставялет тебя реально думать о концептах и самому экспериментировать, а не списывать под копирку. Вот когда база освоена, можно углубиться в книжонки. Базарю, такой подход работает даже на пнях, проверено.
В каждой книги, в предисловии, написано на каких читателей она направлена. Сначала выбираешь те, что направлены на новичков, потом переходишь на средний, после чего на продвинутый. Соответственно, проекты выбираешь соответствующей сложности, либо работаешь с одним, постоянно расширяя и улучшая его.
А ты сейчас просто лбом бьешься в закрытые ворота, да, они немного приоткроются, но стоит ли это потраченных сил и времени, когда ты мог просто использовать вышеописанный подход?
Ладно, потрачу еще денек на свои задачки, не сделаю норму, пойду читать.
у него подписаны заголовки. можно ли отсортировать столбцы dataGridView по этим заголовкам?
Но тут возникла пиздец, в моей функции есть логарифм и в него иногда попадает отрицательные значения. Как быть?
Сама функция : 2 math.Log2(x+7)-5math.sin(x)
Да, можно сделать вот так, по свойствам лог: math.Log2(math.pow(x+7,2))
Но это не помогает
Если начинать брать больше -7. то начинаются большие расхождения
Сверялся с https://www.wolframalpha.com/input/?i=2++ln%28-8%2B7%29+-+5++sin%28-8%29
Аноны прошу, помоги, очень надо
Сильно привык к работе за ПК с мышкой и сейчас на ноуте из-за тачпада это сильно тормозит меня так как я привык кучу вещей делать через мышь и вот думаю переучится на клаву.
может мышь без или проводную легче купить?
Всегда private.
Ладно, меня чуть отпустило. Оказывается Last тоже не работает и не работал в EF6. Кривовысранное поделие этот EF.
Agile Principles, Patterns, and Practices in C#
Очевидно, что это сделано для того чтобы такие дурачки не выстреливали себе в ногу работая с запросами к базе данных.
У библиотеки исходный код открыт.
Можно по-подробнее? Ну вот не дали мне foo.TakeLast(5) сделать, я написал foo.Skip(foo.Count() - 5). Почему второй вариант лучше чем готовая поддержка из коробки, тем более, что методы есть?
Тогда придеться писать свою нейросеть. Но раз ты задаешь такие вопросы на дваче, то 99% что ты не напишешь её.
с, b - элементы из массива
z - кол-во элементов в массивах (4 штк)
x(z - 1) = - с(z) b(z)
x(z - 2) = - с(z - 1) b(z - 1) - с(z)b(z)
x(z - 3) = - с(z - 2) b(z - 2) - с(z - 1)b(z-1) - с(z)b(z)
x(z - 4) = - с(z - 3) b(z - 3) - с(z - 2)b(z-2) - с(z - 1)b(z-1) - с(z)b(z)
Как сделать эту хуету в цикле? Битый час над этим думал, пизедц. Аноны пожалуйста помогите
Если бы. Он на связь собака не выходит
час это ничто, я за час успеваю только лишнюю запятую найти
не сможешь решить за 5-10 часов тогда и приходи, а то ты вообще расслабился я смотрю
так я попутно другое делал, просто я понимаю что делается эта штука легко. Но не могу представить, не хочу прост на этом долго застревать и перейти уже к другому пункту
Ну ничего, в следующий раз ты сделаешь правильный выбор между маняме и обучением, не отложив второе на потом.
Через метапрограммирование? Ну, формировать этот в цикле в string builder'e, потом скомпилировать и подключить как сборку. Но, мне кажется, за такое решение тебя взъебут
Да при чем тут аниме. Просто еще есть парочка более интересных задач, чем циклы в циклах и еще раз в циклах
В книге заметил следующий код:
Matrix weightMatrix = new Matrix(3,2);
double[] thresholds = new double[2];
Написал его (консольное приложение), а мне рычит, что мол нет такого класса. Может директиву какую нужно подключить? Или это не в консоли нужно делать?
Нужно добавить ссылку на сборку, которая содержит в себе класс Matrix
Нажми alt+enter где рычит. Или на значок лампочки
Если пропустил using, будет соответствующая подсказка
Почаны, как вы называете слой, где хранится логика? Вот есть контроллеры, есть вьюхи. Можно логику в контроллеры засунуть, но это потом боком вылезает переписываю такой проект с mvc на webapi
Services? Так у меня уже есть сервис, который как служба. Он, допустим, каждые пять минут базу проверяет на предмет новых записей. У меня уже нет идей
Вот есть у меня допустим дискорд бот на С#. Когда приходит определенная команда, бот, если юзер не авторизирован (если нет в базе client_id и access токена), просит авторизироваться и кидает в лс ссылку на oauth авторизацию. После авторизации идет на редирект на some_uri.com/?code=auth_code. auth_code нужен чтобы получить accessToken.
И вот что мне делать дальше? Писать отдельное приложение, которое будет хэндлить запрос по этому руту, вытаскивать с него auth_code, делать запрос, получать accessToken и добавлять в базу? А если я хочу чтобы бот написал юзеру что авторизация прошла успешно? Что делать дальше, анон, помоги.
так мне за нее пизды дадут. Мы пока до этого не доходили и скажут что из инета взял пример, только циклы, только хардкор
Зависит от паттерна проектирования.
Земля тебе пухом
Я себе на рабочий стол вешал скрин с основными шорткатами от самой студии https://docs.microsoft.com/en-us/visualstudio/ide/default-keyboard-shortcuts-in-visual-studio?view=vs-2019
и от решарпера.
Натаскался за пол года и теперь мышь использую редко. Намного быстрее работать получается и кисти больше не болят.
Раньше делали стандартный набор:
Repository/Persistence
Services
Domain
Web
Щас, после промывки мозгов дядей бобом (Uncle Bob) делаем так:
Core
Application
Domain
Infrastructure
Persistence
ExternalWebApi
Messaging
Любой внешний сервис
Presentation
Web
Api
iOS/Anroid/Desktop/Чего душа пожелает (ну или бизнес)
Tests
Макаба пробелы съела, давай еще раз, только с дефисами.
Repository/Persistence
Services
Domain
Web
Core
--Application
--Domain
Infrastructure
--Persistence
--ExternalWebApi
--Messaging
--Любой внешний сервис
Presentation
--Web
--Api
--iOS/Anroid/Desktop/Чего душа пожелает (ну или бизнес)
Tests
Хорошо, значит 4 стабильная. Перепроверил настройки VS, там 3.1 версии стоят.
Как исправить проблему с Assembly not found? >>672048
>Ты скажи, что ты подключаешь и откуда
Короче я решил допилить одно приложение. Установил VS, mono, клонировал сам проект с гита. Напротив одного из референсов стоит красный крестик и ошибка Assembly not found.
Добавить его через Add references не получается, его там нет. На этом месте я хз что делать.
Спасибо, анон. В принципе, это то, что нужно
Смотря что именно тебе нужно. Допустим, у тебя есть метод, взаимодействующий с тысячами объектов в базе. Соответственно, если у тебя будет ошибка соединения с базой, у тебя прервется полностью выполнение метода. Чтобы такого не произошло, можно ставить локальный обработчик. https://dotnetfiddle.net/uIRRAC
По "выше": допустим, у тебя есть апи (Опустим пока возможность использования атрибутов для обработки исключений)
Имеет смысл делать каждый метод обращения в следующей форме: https://dotnetfiddle.net/GIYPmc
Чем кидать необработанное исключение, если оно где-то нашлось, лучше его обработать и сохранить куда надо
большое спасибо за примеры!
Не получается делать unload когда использую хотя бы раз serialize или deserialize с типом из сборки которую затем надо выгрузить.
Нашел такую же проблему в issue https://github.com/dotnet/runtime/issues/13283
Но решения оттуда не помогают, если убирают работу с json все работает как надо, но с ним ничего выгружаться не хочет.
Испробовал Newtonsoft, utf8json, Jil и стандартный json, что делать уже ума не приложу.
Вызывай serialize или deserialize уже после того как выгрузишь сборку. JSON это же строка, сохранить её перед выгрузкой сборки труда не составит.
>>665540 (OP)
Обновите инфу на актуальную.
Некоторые ссылки идут на 404.
Джозеф Албахари, Бен Албахари "C# 7.0. так понимаю, что 5.0, которое есть в шапке это старая версия? или пролог,первая часть? Справочник. Полное описание языка"
или таки
Эндрю Троелсен "Язык программирования C# 5.0 и платформа
Ангельский не знаю, но по причине того, что очень глубоко лезть не буду, думаю этого будет достаточно.
Вопросы будут нубские, эта ебанутость для ознакомления
Алсо: Визуал Студио скачал, нагрузки поставил. Есть какие нагрузки для нубов?
до этого чисто по ошибке, лол ставил Визуал Студио Коде. И охуел с того, как VS за тебя дописывает и исправляет строчку.
ЗЫ: в примере по самоучителю предлагают такой код
System Console.WriteLine. Я правильно понимаю, что на текущий момент System не пишется?
>Обновите инфу на актуальную.
Скажи спасибо, что перекатили.
>Джозеф или Эндрю
Троелсен, конечно, Джозеф это вообще не учебник, а своего рода справочник, который детально разбирает каждую часть языка не вдаваясь в информацию для новичков. От Рихтера её отличает только отсутствие разбора IL-кода.
Сначала читаешь Троелсена, потом уже можешь прочитать Джозефа. После чего переходишь к Рихтеру. Закрепляешь всё паттернами и принципами проектирования:
Agile Principles, Patterns, and Practices in C#
И всё, считай уже можешь пилить свои тудушки. Останется только отдельно почитать литературу по базам данных, EF Core, ASP NET Core и ты будешь готов к вкату.
Я не знаю, что такое "тудушки" и "вкату". Я просто знакомлюсь с языком, чтобы понять юнити, чтобы понять ink.
Спасибо за выбор автора
Для юнити тебе нужен хороший математический бэкграунд.
Если у тебя в файле указано "using System;", то System можно не писать. Если есть учебник по Троелсену 6.0 на русском - раздел "Доступ к пространству имен программным образом"
Если заблокировали аккаунт на майкрософт и требуют принять смс для разблокировки (хотя я ничего не нарушал но телефон палить не хочу винда лицензионная) - можно ли создать другой аккаунт на фейкопочту и спокойно работать дальше?
После открытия проекта через 5-10 секунд появляется экран входа и убрать его нельзя.
Так очевидно я использую тип из сборки которую загружаю в качестве параметра для json. Из-за внутреннего устройства библиотеки она кэширует его где-то там в результате из-за этого ничего выгрузить нельзя. Если бы я хотя бы смог узнать где оно кэшируется то через рефлексию бы чистил, но там черт ногу сломит.
Пришлось написать свой парсер с возможностью очистки кэша по типу и в результате все выгружается.
Пока создатели библиотек не добавят такой функционал думаю придется своим велосипедом пользоваться для выгружаемых библиотек.
А ждать походу придется долго, так как проблема у многих еще в прошлом году появилась.
Отпишись в их issue, что все варианты перепробовал и оно всё равно валится. Приведи пример кода. И себе и коммьюнити поможешь.
Снова тот анон. Пытаюсь разобраться с архитектурой. Открыл пару примеров на github с небольшими проектами. Кажется, что это какой-то шлак
Например:
https://github.com/ivanpaulovich/clean-architecture-manga
Больше всего я не понимаю, зачем вводить UnitOfSet со своим репозиторием, когда у нас есть охуенный EF? Он уже абстракция, и имеет кучу адаптеров к разным базам
В итоге мы получаем кучу лишних строк кода и, самое плохое, деградировавший функционал. Более того, это дерьмо не гарантирует транзакционности. Анон, может, ты скажешь, зачем так пишут?
Чому если из мелкософтовского системного экзешника выдрать X509Certificate, на его основе создать X509Certificate2 и попробовать его верифицировать, то верифай возвращает false (например, тот же lsass.exe или svсhost.exe)? Пользовательские (например стим/хром/дискорд) верифаятя нормально. Объясните мне тупому плс кто в этом шарит.
А не слишком ли целая книга по орм'ке? Тем более оно там все меняется. Бери доки да читай.
У троелсена читай, потом документацию.
Так ты сам себе ответил. Да, если ты собрался делать проекты для малого бизнеса (васянов), то никто не обрадуется твоим поделиям на .NET, которые требуют больше времени, при этом предлагают лучшую производительность и расширяемость (которая малому бизнесу нахуй не нужна). Если ты собрался работать на более-менее уважающие себя компании, то такие компании не обрадуются, когда узнают, что ты им бэк собрался пилить на пыхе.
720x720, 0:04
Блять сука, вот почему линейные участки программы легче поддаются оптимизации, чем все другие части внутреннего представления программы и объектного кода?!?!?!?!? сука не понимаю объясните
https://stackoverflow.com/questions/1182612/what-is-the-difference-between-x509certificate2-and-x509certificate-in-net
Первый был черти когда сделан, с тех пор много чего в алгоритмах поменялось. Исходники копать лень (если они для первого вообще имеются в открытом доступе).
https://pastebin.com/P3pykf5U
Код просто поочерёдно берёт строку из файла и смотрит, из каких символов она состоит. Если только из нужных, то возвращает true. И всё работает замечательно, НО, когда я пытаюсь записать правильную строку в другой файл, то начинается какая-то магия. Конкретно вот тут
if (right == true)
{ sw.WriteLine(line); }
else { sw.WriteLine("NET"); }
Мне не нужен этот else. Если запустить с else, то он запишет и нужные строки и ненужные, на месте ненужных будет NET. А теперь внимание, если убрать этот else, то он ВООБЩЕ НИЧЕГО не запишет, хотя должен записать только нужные, что логично. Причём прога в if заходит, отрабатывает код, но не записывает ,сука ебаная, файл пустой.
Сейчас для интереса сделал вот так
>else { sw.WriteLine(""); }
и получил то, чего и хотел, но мне просто интересно уже.
А, не, нихуя, я думал, что если с writeline прокатило, то можно и просто write, чтобы кучи пустых строк не было, но нет, лол, если write, то он опять-таки нихуя не записывает.
Прикольно, не похоже на языки программирования.
Это японская кодировка, я с ней уже поработал немного, никаких проблем не было. Autoflush не было, врубил и ничего не поменялось.
Код https://pastebin.com/m0HgVenx
https://dropmefiles.com/GD2zO
var input = Environment.GetEnvironmentVariable("HOME")+ "/Downloads/source.txt";
var output = Environment.GetEnvironmentVariable("HOME") + "/Downloads/output.txt";
var allowed = "ともかく".ToCharArray();
var lines = File.ReadAllLines(input).Where(x => x.All(y => allowed.Contains(y))).ToArray();
File.WriteAllLines(output, lines);
Выводит
かも
とか
く
とも
もと
かく
とく
ともかく
>Это японская кодировка
Алсо, файл был в UTF-8, не знаю, где ты там откопал японскую кодировку
>Аноны, как получить ссылку на структуру?
ref используй. Но ты явно делаешь что-то неправильно.
Бля, не заметил пост ниже с дефисами, вопрос отпадает.
Либо ты поддерживаешь gRPC с каждым пчелом, который зашёл на сайт твой сервер сосет, либо предлагаешь загрузить ему несколько мегабайт wasm'a твой клиент сосет
На мой взгляд, у блазора на текущий момент две ниши – сосать бибу числодробилки и внутрикорпоративные порталы
>Хотя всё же интересно, почему так странно у меня работала запись
У меня на маке всё работает в твоей программе, надо только кодировки выкинуть. Попробуй вручную флашить.
> Хотя всё же интересно, почему так странно у меня работала запись.
Можешь скинуть минимальный нерабочий проект и файл?
Я попытался сам исправить ситуацию без собственного парсера так как мой вариант все же был в 1.5-2 раза хуже по производительности, не говоря уже о примитивном функционале.
Мне удалось исправить Serialize чтобы все работало путем исследования памяти и добавления возможности очистки кэшей.
Но вот Deserialize стал непробиваемой проблемой.
При том проблемой магического плана.
Магия заключается в том что не в windbg не в dotmemory не показывается что в памяти хоть где-то есть ссылка на мой загружаемый через сборку тип.
Путем сравнения чистого приложения и после тонны загрузок/выгрузок мне удалось найти место где похоже что-то сохраняется, но вот как очистить это дерьмо я не представляю. Как туда добраться через рефлексию хер знает, класс не статичный, а что именно создает это дерьмо я боюсь даже представить. А значит и передать объект в качестве аргумента для получения этого поля я так же не могу.
На этом мои познания в устройстве .net походу иссякли и я не вижу выхода из этой ситуации кроме как продолжить использовать свой парсер или отказаться от идеи выгрузки сборок вообще. Тупо оставлять их в памяти пусть захламляют оперативку.
Если хочу начать изучать шарпы, то следует лучше обратно на винду перекатиться? Или на маке в MonoDevelop тоже норм работается?
Как на винде
Я имел ввиду написать это в их github -> issue.
Здесь тебе врят ли кто-то поможет, потому что данных не хватает. Тут надо целиком код смотреть.
Я на маке в VS for Mac работаю. Полёт нормальный. Некоторых крутых фишек конечно не хватает и решарпер не поставишь. Но тебе от этих фишек ни холодно ни жарко. Тебе в ней комфортно еще несколько лет будет, а потом начнёшь замечать, что можно было бы и то и это заиметь. А там может на Rider пересядешь или МС студию под Мак допилит.
А загружать парсер в appdomain в который ты загружаешь нужную сборку с нужным типом, пробовал?
Ну хорошо, через пол года пофиксять. А если проблему не двигать, то пофиксят условно никогда. Пол года быстрее чем никогда.
Чтобы заполнить нужные мне типы в сборке данными которые должны лежать отдельно и не быть хардкодными.
При том основное приложение об этих данных ничего не знает и знать не должно, максимум что оно знает это то что они реализуют некоторые интерфейсы и то не факт.
Тут проблема будет не только в JSON, многие вещи оказывается кэшируются в различных небольших кэшах и не дают выгрузить сборку. В частности Expression тоже кэширует свои типа при некоторых вызовах. В результате получаем полурабочую выгрузку, работает только для примитивного кода, что-то более сложное уже не выгрузишь.
>>679926
В самом начале делал это.
Уже кучу парсеров так перепробовал.
>>679926
У кора только один домен, теперь все грузится в контекст. Но это не помогает, так как большинство кэшей это статик, а он в основной контекст грузится независимо от того загружаю я сборку или нет. Наверное статик попадает в тот контекст в котором впервые использовалась сборка, а это в большинстве случаев основной контекст.
>>679983
Вообщем мне удалось победить это дело через очень и очень грязные трюки с рефлексией.
Так по сути делать нельзя, но другого пути тупо нет.
Все дело вот в этом говне:
https://github.com/dotnet/runtime/blob/master/src/libraries/System.Linq.Expressions/src/System/Dynamic/Utils/TypeExtensions.cs#L13
Вот тут хранятся какие-то данные о типах, при том в ключах вы не найдете не одного упоминания о своем типе, но я тупо не разбирая что там забил все с помощью null и все стало выгружаться. Мне уже тупо не хочется разбираться что именно не дает выгрузить и почему, а затем обнулять именно этот ключ.
Зато узнал что оказывается с core 3.0 нельзя через рефлексию менять readonly поля, получишь эксепшен.
>При том основное приложение об этих данных ничего не знает и знать не должно, максимум что оно знает это то что они реализуют некоторые интерфейсы и то не факт.
У тебя архитектура проекта - говно, раз тебя таким анонизмом нужно заниматься. Сочувствую вообщем
То есть если у меня фактически изолированные сборки которые юзают главный модуль и которые могут выполнять свои функции и затем выгружаться это говно архитектура?
И ещё интересуют какие-то понятные объяснения, как реализовать машину тьюринга или примеры готового кода. Буду очень сильно благодарен.
1920x1080, 0:24
Есть поток основной программы(интерфейса), в нем создается новый "рабочий" поток, который работает в бесконечном цикле. Как изменять его переменные/передавать команды? На ум приходит сделать глобальный флаг, который активируется, когда нужно что-то передать, а рабочий поток будет все время проверять его в цикле, и если флаг активирован - будет проверять и обрабатывать уже другие глобальные переменные/флаги. Это должно работать, но выглядит извращением. Есть какая-то правильная, элегантная реализация? Или все так и делают, через глобальные переменные?
Вау. Я вообще удивлен, что эта шапка до сих почти не обновлялась. Я пилил ее года 4 назад наверное, когда еще студентотой был и когда активно тут сидел и всем помогал. Сейчас ее видеть в такой виде довольно странно, хоть и приятно.
BTW для сомневающихся (как я в свое время): C# и .NET платформа сейчас очень даже нужна и хороших специалистов реально очень мало.
Раньше были домены которые позволяли выгружать проще, но там ебля была с общением между загружаемой сборкой и основной. Приходилось делать маршалинг, плюс потери перформанса, при том серьезные.
Сейчас же они сделали выгрузку по возможности если ничего сборку не держит, но при этом не учли всех момент которые есть не только во внешних библиотеках, но так же в самом языке.
Вот методы (еще на скрин не все влезло, плюс неизвестно кто еще те методы вызывает) которые создадут скорее всего проблему при использовании их в загружаемой сборке, потому что они кэшируются в статичную переменную которую невозможно без рефлексии очистить.
>>680308
Делаешь ConcurrentQueue, затем юзаешь AutoResetEvent или ManualResetEventSlim(если нужна прям производительность, у авто лаг 1-2 мс), пока в ConcurrentQueue есть команды берешь и выполняешь их, как только команд нет, event.WaitOne(); в рабочем потоке.
Когда поток нужно запустить event.Set(); в основном потоке.
В результате пока задачи есть поток трудится, иначе спит в ожидании пинка.
Никаких глобальных переменных! Никакого изменения состояния объектов более чем одним потоком! Это путь студентов и индусов.
Очередь тебе в руки (типа RabbitMQ, но вообще любую, почитай доки на эту тему).
Флаг можно менять через БД.
Управляемый объект можно создать в основном потоке и отдать его в бэкграунд поток, где он будет readonly и изменять состояние в основном потоке, если нужно.
>сделать глобальный флаг
Земля тебе пухом
>>680320
я вообще удивлен, что кто то еще смотрит в этот тред
>>680341
да на скрине 80% это линк, не могли под него интерфейс взаимодействия запилить? Походу какой то CRUD через multiqueue дрочит твой "модуль", а ты теперь с рефлексией трахаешься. Эх, кайф
>>680368
дрочильня в другом разделе
Калькулятор.
"Глобальные переменные" это мютексы, но нет, так делать не надо. Внешние системы MQ тоже использовать не надо, они для другого. Надо использовать всякие очереди и каналы. Один поток случает очередь, другие формируют задание и передают его главному потоку через очередь.
Не знаю C# совсем, судя по всему тебе надо смотреть на ConcurrentQueue<T>
Не могу вальнуть вопрос с удалением песни из каталога
Помогите чутка вот кусок кода.
Как удалить из списка и потом вернуть обновленный словарь.
У препода спросишь
эх, сейчас бы не знать, как работает библиотека из GAC. Нахуй ты учишь это говно, если даже не хочешь в нем разбиратсья?
> рабочий поток будет все время проверять
Т.е. рабочий поток будет крутить бессмысленный цикл? осмотри на BlockingCollection - поток будет спать, пока не появятся данные для обработки.
С конца фором перебираешь песни и Removeat на индексе который соответствует твоему ифу.
Когда делаю запрос из кода, оно думает почему то, что я делаю GET запрос на страницу авторизации. Но когда делаю аналогичный запрос из постмена, то все работает как надо.
Что не так то блядь? Где я туплю? При этом пост запросы делаются так же в других местах бота (например авторизация, там даже рут тот же, только тело немного другое. Вот доки кста: https://shikimori.org/oauth) и все работает.
для начала добавь проверку rulesTotal.Lenght = 0, а то у тебя вечный цикл, инициализацию rulesTotal упрости хотя бы $"{твоя хуйня}", также for можно на foreach заменить, самое просто добавить таймаут и заводить алгоритм юзера в таске - не успел иди нахуй
Ты на ссылки посмотри. Он тебя редиректит на sign-in страницу, поэтому и GET. А почему он тебя туда редиректит - это другой вопрос.
Проверь статус у твоего response и вытащи ответ через ReadAsStringAsync(). Там или 401 или 403 или 302.
Проблема кстати решилась созданием в методе Post своего инстанса HttpClient. Не ебу почему так.
я пытаюсь сделать так что бы при добавлении продукта на диалоговом окне окно закрывалось и главное окно где раположен список всех продуктов автоматические обновлялся, для этого я использую первый скрин в нем присутствует часть "mainWindow.Refresh();" собственно она должна отвечать за обновление контента,
на другом скрине представлены 3 метода, два метода это евентХандлеры от кнопок которые обновляют страницу вручную при нажатии, а третий Refresh() вызывается собственно с дочернего окна и должен по аналогии с первыми двумя методами обновить каталог но этого не происходит, метода проходит дальше, дочернее окно закрывается обновление не происходит, собственно вопрос, почему и как фиксить?
>почему
Зависит от того как оно у тебя сделано. Но вкратце после this.close() хрен что выполнится
>как фиксить?
Делать до закрытия тут же или в событии
Можно на английском.
Agile Principles, Patterns, and Practices in C#
Всё объясняется довольно подробно, есть много реальных примеров. На протяжении всей книги будет создаваться программа для расчета зарплаты сотрудникам.
Единственный минус - книга 2008 года. Поэтому код немного устарел и в нём нет свистоперделок вида интерполяции строк через $ или нулл-исключающего оператора. Но это не так важно, потому что самим паттернам и принципам уже овердохуя лет. И после прочтения ты легко освоишь современные паттерны.
Спасибо, посмотрю. На тухлый синтаксис действительно всё равно. Да и вообще даже на язык. Суть ведь в содержании, а не форме.
И сразу после прочтения Боба накатить это
http://sergeyteplyakov.blogspot.com/2013/12/about-agile-principles-patterns-and.html
я пробовал до закрытия, все хуйня
Джуны не нужны. Их сейчас выращивают сами компании потому что это дешевле и практичнее. Рынок переполнен вкатывальщиками дебилами из-за которых дешевле вырастить джуна самому, чем пытаться нанять. Больше времени и денег уйдет на поиски.
Конторы которые еще хоть кого-то набирают в 90% случаев построены на наебалове, где в лучшем случае тебе хотя бы 20-30к за месяц заплатит с дикими переработками. А у особо хитрых ты еще и должен останешься. Плюс работа в таких компаниях это считай волчий билет в индустрию. Так как оттуда выходят угольки (выгоревшие люди), а такой человек это беда для компании.
Если у тебя не будет проекта на гитхабе через которой тебя могут позвать на работу или в резюме не будет ссылки на ПР который пошел в ядро или топ библиотеку, при том реальный ПР, а не правка орфографии, то лучше иди на стройку, поверь там условия в десятки раз лучше будут.
Тогда в главном окне подписывайся на событие закрытия дочернего (или делай свое событие, если данные должны обновляться не только при закрытии) и в обработчике обновляй данные главного окна.
так погоди, это хандлер который выполняется на том же окне что закрывается перед закрытием, чем оно тогда отличается от просто вызова метода в другом окне?
ты рофлишь? я же вроде ясно написал что мне нужно обновить контент на родительском окне после закрытия дочернего, при обработке хандлера на дочернем окне на родительском ничего обновляться не будет...
Не создавай новый httpClient каждый раз, как делаешь вызов. У тебя в существующем скорее всего что-то в конфигурации не то - headers, baseAddress.
Чувак, у тебя знания джуна, в документацию ты не можешь, но всё туда же: "рофлишь", "я же ясно пояснил". Вместо наездов иди учись.
В любой конторе где 30к платят, там нужен код который дает результат и не важно как он написан.
Если ты можешь давать результат, то тебя возьмут.
Зачем тебе делать это через httpwebrequest, если есть более высокоуровневые классы вида HttpClient?
В смысле .Net framework 3.5
Нет, но в нём есть WebClient. Но если хочешь ебаться с httpwebrequest, то придётся делать что-то уровня пикрил.
Короче, разобрался, проблема была не в нём, а в неправильном URL
подводные камни?
Хуйня идея. Лучше уж электрон или другие кросс гуи, там и возможности и производительность.
На крайняк veldrid + imgui куда лучше юнити будут.
>электрон
>производительность
В голос нахуй. Там одна основа в виде браузера в пустом приложении уже жрёт всю твою оперативку и 300 мб на жестком диске.
Хочу из фрондэнд-макаки перекатиться в шарп (ебаный коллега просто без ума от вашего языка и меня заразил)
Проблема в том, что у меня есть оффер в европу (знакомый работает в Прагве манагером и может меня подтянуть к свою практику), но я блять не хочу макакой
Так вот...правда ли, что в этой самой европе шарп активно наступает на пятки жабе? Судя по кличеству вакансий на линкедине в бэке сначала жаба, потом питон, а потом шарп, а в тырыпрайзе и подавно
Не хочу устраивать срач и холивар, поэтому пардон, если флуд
>знакомый работает в Прагве манагером
>правда ли, что в этой самой европе шарп активно наступает на пятки жабе
Почему бы не спросить у манагера? По крайней мере по Праге у него инфа поактуальнее, чем у сосачера.
Зависит от настроек уровня изоляции транзакций. Если ничего не менял, то потокобезопасно. Но и высокой производительности не будет.
>использовать ЮНИТИ чисто для кроссплатформенного гуя
ЗАПУСКАЕШЬ КАЛЬКУЛЯТОР
@
ДЛЯ РАБОТЫ ПРИЛОЖЕНИЯ НУЖНА ВИДЕОКАРТА НЕ НИЖЕ 2080RTX
@
ЛЕТИШЬ ТРАССИРУЯ ЛУЧИ ЖОПОЙ
свои тонкости и нюансы просто, спрашивать про другое направление - такое себе
но, хорошо, спасибо
Сортируешь этот лист руководствуясь тем в котором список нужных полей, после чего удаляешь 20 не нужных.
Никак. Можешь только null ему присвоить или 0, в зависимости от типа данных. Для динамического удаления тебе нужно использовать класс Dictionary.
Никак. Только перебирать лист каждый раз сначала после удаления элемента.
престарелый байтоёб-вкатывальщик не может осилить одну хуиту:
WPF на форме есть элементы два радиобатона и комбобоксы, также есть кнопка "подключить". Хочу, чтобы при выборе одного радиобатона часть комбобоксов становилась isEnable=false
это я сделал через IsEnabled="{Binding IsChecked, ElementName=rbSerial}"
а также, чтобы все комбобоксы и радиобатоны становились isEnable=false при нажатии на кнопку (т.е. там какая-то переменная становиться isConnected = true)
Но для этого надо класс сделать и в него вставить логическое условие. Однако в это логическое условие я не могу пихнуть
!isConnected && (MainWindow.rbSerial.IsChecked == false);
Или могу, но что-то не могу разобраться с ключевыми словами static public и прочее. Куда смотреть? Чего почитать?
Почитай про впф, ты пытаешься с впф работать как с винформс.
разработчики всякие нужны. Но 1с и Java, как мы видим, нужны чаще.
У меня дико бомбит, когда вкатывался жаба была очень примитивной по сравнению с шарпом, без лямбд, с тоннами бойлерплейта. Сейчас переучиваться на жабу уже поздно, а с работой на шарпе всё не так радужно.
Если ты под полем понимаешь объект, а не поле, то
mylist = mylist.Where(a => a.IsOK()).ToList();
>список этих полей хранится в ещё одном листе в виде строк
Есть еще intersect, которым можно получить пересечение множеств, но врядли это для тебе подойдет.
>>684970
IsConnected это вьюшная часть? Если да, то логигу можно запилить через поведения (Behavior) и триггеры. Если нет, то переделывай c исрользованием MVVM.
Играюсь с анусом с сокетами. Происходит какая то хуйня. В коде слева Send почему то запихивает буфер до талого на весь его размер, но в коде справа запихивает ровно по длине строки. В итоге код слева принимает ровно "Test request", а код справа принимает в ответ "Test response\0\0\0...\0"
Я в растерянности, код один, а работает по разному. Чому так?
Оператива и место это фигня если это конечно не калькулятор, проц и видяха куда важнее.
Электрон не так плох если правильно писать, та же vs studio отлично работает, но вот если пишут на нем рукожопы, то это да. Пиздец во все поля.
И тема производительности это не только об электроне, абсолютно все приложения сейчас этим грешат, типа время программиста дороже и прочая хня.
В результате куча приложений тормозят у пользователей независимо от того насколько у них крутые компы.
Но идея делать юнити в качестве интерфейса это еще хуже чем электрон.
Больше я жалею только о времени, потраченном на кресты. Там тысячи человекочасов лежат, литры крови, пота и слёз, а денег за это получено хуй да нихуя. Причём по меркам матёрых крестовиков я всё равно в них плохо разбираюсь, т.к. не умею патчить таблицы виртуальных функций в рантайме.
while(socket.Available > 0)
Пояснить сможешь? Нет? тогда засунь себе это в очко и перепиши нормально.
Не ты один набрёл. Видел вакансию полгода назад, искали спеца по юнити для доработки приложения. То ли они маршруты прокладывали, то ли для бизнеса какую-то визуализацию, но дело было связано с картами
Себе в очко запихни, пидарас чахоточный. Тот же самый код работает для сервера с одинаковыми размерами буфера и тот же самый код приводят в пример в любом источнике. Специально для тебя, дебила, поясняю: пока количество доступных байт > 0 - получать дальше. Вся хуйня работает на буферах размером нескольких байт, но тратит очень много времени на буферах большого размера, но только когда сервер отправляет клиенту строку тем же методом, которым клиент отправлял серверу. Почему?
>mylist = mylist.Where(a => a.IsOK()).ToList();
Так ему динамически надо. Т. е. на этот лист уже кто-то ссылается до его изменения. Ты же создаешь новый лист, который никак не влияет на тот лист на который уже кто-то ссылается.
На правах наркомании
var tmp = mylist.Where(a => a.IsOK()).ToList();
mylist.Clear();
mylist.AddRange(tmp);
>>685150
>пока количество доступных байт > 0
пока есть непрочитанные байты в буффере сокета У тебя, говножуя, может в сокет прийти 40 байт из 100 ты их прочтешь и получишь, что доступно 0, а потом долетят еще 60 байт, но ты их не прочтешь. Или может еще может прийти следущее собщение и оно приклеится и ты прочтешь 500 байт из ста. А еще ты можешь соснуть, склеивая строку из кусков полученных байт, в коре, например, Default кодировка это utf8.
>пока есть непрочитанные байты
Но проблема то вообще не в этом. Я же бля сижу дебажу и смотрю, что на малых буферах, когда сервер отвечает клиенту, у клиента в дебаге пишется socket.Available == 12 после чтения первых 4 байт. А у сервера на его receive и вовсе проблем нет ни при буффере в 4 байта ни при буффере в 4 мегабайта. Я бы понял, что я делаю что то неправильно, если бы поведение было бы одинаковым с обеих сторон, но тут же блядь сервер нормально считывает, а клиент заполняет весь буфер.
На одной машине запуцскаешь? Еще ты неправильно в Send длину передаешь, ты передаешь длинну строки, а надо размер массива байт. Опять же на однобайтовой кодировку это может сработать, а может и нет, а utf8 не сработает.
>На одной машине запуцскаешь?
На одном вижаке
>Еще ты неправильно в Send длину передаешь,
Да блядь, ну не в этом дело, ну. На клиенте и только на клиенте строка оказывается длинной в весь буфер с нулями на конце, если буфер больше данных - вот это проблема. С остальным я буду разбираться, когда преодолею текущую проблему
>Да блядь, ну не в этом дело, ну.
Так зачем ты срёшь здесь, если знаешь в чём дело, долбоебина обосранная?
Ты пиздец ты мразь. Ты сюда верно из андроид тредов пришёл, пидорас? Я тебе про одно, ты мне про другое. Я тебе, долбоёбу, говорю, что не в этом проблема, а ты опять хуйню пишешь, мудила. Тебе видно в глаза попало, хуесосина? Ты глотай в следующий раз, как твоя мамаша-шлюха.
>mylist.Clear();
>mylist.AddRange(tmp);
Но это не динамика. Динамика это когда ты видишь визуальное отображение этого листа и то как меняются в нём данные по мере изменения этого листа. У тебя же он сначала путсым будет, а потом обновится.
Да все уже поняли, что проблема тут на генном уровне. Но неужели так сложно почитать документацию, особенно когда работает с низкоуровневой хуетой типа сокетов? Тебе указали на то, что у тебя значительные пробелы в знаниях. Но вместо того чтобы пиздовать на msdn, ты продолжаешь срать скриншотами с обрубками своего говнокода.
Не пердоль энкодинг, записывай сообщение через бинари райтер/ридер, в них же запихивай/считывай в массив байт и длину, и прочие данные о твоём стринге.
>буфер с нулями на конце, если буфер больше данных - вот это проблема
Эм.. А ты что ожидал, что буффер с хуями будет, а не снулями? Тебе receive возвращает количество прочитанных байт, именно на столько и будет заполнен буффер.
Первый раз такое определение динамики слышу. Тогда почему бы по одному не удалять, если сразу удалить 10, это же уже тоже не "динамика".
Ну в этом и проблема. Если ты по одному удалять будешь в цикле, то цикл будет работать неправильно, так как ты перебираешь изменяемый массив. Если удалять по 10, то это не динамика. Особенно если речь идёт не только об отображении информации, но и об её обработке. Поэтому для таких целей используют Словарь, ключи которого можно удалять в цикле без негативных последствий.
>цикл будет работать неправильно, так как ты перебираешь изменяемый массив
Можно перебирать с конца, а если перебирать одновременно в потоках, то и со словарем можно словить много чего.
>Поэтому для таких целей используют Словарь
Мне, конечно, все еще не ясна цель, но словарь используют, когда нужен доступ по ключу за O(1). Удалять можно и из связанного списка.
P.S. - Скрипты для SQL я писать умею, но вставлять такую залупу из 50 таблиц, в каждой из которой по 10 полей, как то не ок
Так ДБ фирст и подразумевает что у тебя есть созданная баз. Ты не хочешь создавать её, не хочешь генерить её из кода, как ты хочешь чтоб она создалась?
> заполнить ее теми же таблицами и полями, как по DbContext?
>P.S. - Скрипты для SQL я писать умею
Т.е. ты не вкатился в джаву из-за ее кривости и теперь жалеешь, работая на шарпе?
ты тупой или ты читать не умеешь?
Есть пустая БД (без возможности DropCreateDatabaseFirst), без ЕДИНОЙ ТАБЛИЦЫ. Мне нужно перенести мой DbContext со всеми DbSet объектами и их полями в базу данных. Я могу это сделать скриптом - тригерить при первом обращении к БД, но нахуй оно мне нужно, если есть EF?
Йип. Чему меня научил опыт в программировании: чем ужаснее язык, тем более сладкая работа. За язык, который никто не знает, никто не может на нём ничего написать, и в легаси которого можешь разобраться только ты, платят очень хорошо, дают очень вольные эстимейты, считают тебя крутым специалистом.
Самая благодарная работа, которую я выполнял -- отладка скриптов на ANSYS APDL, жутком выпердыше фортрана и бейсика. Тем не менее я мог заниматься спокойно, получал хорошие деньги и никто меня не подгонял неделями.
В этом плане жаба гораздо круче шарпа.
public static int Sign2(int val) {
return val > 0 ? 1 : -1;
}
сделать как-то хитро-хитро через сдвигание байтиков чтобы вот быстро-быстро работало? чет не могу придумать как сделать это изящьно.
Для небольших приложений я так понимаю на фронте просто ловится код ошибки и текст какой-то пишется для пользователя, а если приложение больше и много разных видов ошибок, каждый из которых нужно как-то передать на клиент, там обработать и выдать нужный текст пользователю? Какие-то error codы вводятся? А как они выбрасываются? Пилятся свои классы исключений поверх стандартных? Как определяется код ответа нужный, тело ответа? Мидлвеер какой-то, который эти эксепшены ловит и делает нужный ответ? Расскажите плз или тыкните ссылкой
Ну и это только что я придумал сходу, а вообще что еще используется, какие архитектурные решения? Расскажите плз или тыкните ссылкой
https://docs.microsoft.com/en-us/aspnet/core/fundamentals/error-handling?view=aspnetcore-3.1
https://docs.microsoft.com/en-us/aspnet/core/web-api/handle-errors?view=aspnetcore-3.1
Exception Handling Middleware
https://stackoverflow.com/questions/38630076/asp-net-core-web-api-exception-handling
Для обработки user input и для возврата 400 (Bad Request) для плохих данных
https://fluentvalidation.net
Пук-сереньк
if (num == 0)
return -1;
var shiftCount = sizeof(int) -1 ;
var n = (num >> shiftCount & 1);
return n == 1 ? -1 : 1;
Ты его пробовал? Раз мы говорим про кроссплатформу, то речь идёт о Xamarin Forms. Большей параши я в жизни не видел. Запуск хелловордла 5 секунд! Пять ебаных секунд! Кто будет ждать открытия приложения столько времени?
После wpf прямо таки отвращение выработалось к XAML. За десять лет нихуя не изменилось. Как мелкомягкие вылизали asp.net добавив разор, и какой хуй они положили на wpf/xamarin, это просто цинизм какой-то
Короче, xamarin – параша, имхо. Надо ждать blazor для мобилок. Или не ебать себе мозг и писать нативные приложения. Потому что у Майков уже столько инициатив было, что в блазор уже как-то не верится
>>686140
ну он не пустой, и по задумке должен работать по аналогии с методом выше, который вызывается по клику, по клику он работает как надо, мне это же надо и от рефреша,а вот про обновление контрола по подробнее
а что конкретно не понятно что называется?
второй скрин это методы на главном окне, родительском а скрин с методом submitbutton это хандлер на другом окне, который добавляет что-то закрывает окно и должен продолжить работу на родительском окне (метод рефреш)
>а вот про обновление контрола по подробнее
Ну типо контрол должен же как-то узнать, что Content изменился, но если работает по клику, то хз.
>не понятно что называется?
не называется, а вызывается, в дочернем ты добавляешь в менежер, потом это как-то должно аоеазаться в new Products(). Логика окутана тайной.
Бери отладчик и в путь. Во первых, посмотри заходит ли код в рефрешь, во-вторых, сравни классы Products() в рефреше и в клике.
я знаю что он гарантированно заходит в рефреш.
так же когда он заходит в рефреш после выполнения
Main.Content = new Products();
Main.Content = продолжает оставаться нулом, и я не совсем понимаю почему и как такое возможно что он не выкинул нул или что-то такое
на клике та же самая команда выполняется уже нормально Main.Content уже не нул, и я тоже не понимаю почему
Раньше я думал, что формы это устарелое говно. Покушав сладкого WPF, я пришел к выводу, что формы лучше. Они быстрее. Они не лагают. Они моментально открываются
у меня 9700к, так что проблема не в старом железе
в дополнении к предыдущему посту добавлю что при клике Main.Conten не нул даже до захода в метод, но при рефреше который вызывается с другого окна он уже нул и до и после захода
> гарантированно заходит в рефреш
Точка останова срабатывает? Конструктор не может вернуть налл. Если Main.Content null, то тут только 2 варианта: или в рефреш не заходит или потом где-то обнуляется.
>WPF или WinForms?
Для маленьких приложений-утилит, пожалуй формы лучши, их быстрее создавать, они больше прощают говнокод. А вот крупное приложение на впф писать лучше, имхо. К формам все равно придется прикручивать MV*, настраивать биндинги и прочее, а это может стать болью, в впф это все их коробки + есть всякие призмы и мввмлайты.
> Они быстрее. Они не лагают. Они моментально открываются
Открываются может и быстрее, хотя особой рзницы быть не должно, а вот если у тебя динамический интерфейс, много контролов и прочее, то формы соснут.
>>686167
Еще раз ф10 нажми, чтоб он строчку выполнил.
я может быть далеко не сеньйор в программировании. но не настолько же тупой, очевидно что когда я говорил что он выходит с нулом это значит что он выходит с нулом...
контент это эм... вложенный контент в маин, маин это собственно фрейм на окне.
а вот добавление этой строчки var p = new Products(); в каком-то смысле помогло так как теперь p не нулл и main.content собственно тоже, но проблема остается, окно не обновляется
в том, что на борде не знают про миграцию
Еще вопрос к антонам - в WebApi как происходит общение между фронт-бэк в передаче служебных сообщений? К примеру - валидация прошла, 200 - Ок, переходим к методу "Validate". Эта логика в routing фронта должна быть заложена?
И еще - на фронте или на бэке должна быть проверка аутентификации? Или и там и там? Если сделать только на фронте, то через Postman можно выебать, как street hooker весь бэк, если на бэке делать, то это геморойная передача отклика с сервера клиенту. На какой стул садиться?
Так миграции это тоже сode-first, а ему вроде это не подходило, ему надо db-first, но что б не писать SQL. Короче мутный тип.
Сам толко начал ковырять асп, поэтому особо не подскажу, но вот что точно, это то что валидации на стороне клиента доверять нельзя. Она скорее для того что б сообщить пользователю. Так что на беке ваидация нужа, а то
>можно выебать, как street hooker весь бэк
>>686198
Так у тебя впф.. Юзай мввм и пили свою навигацию, та что из коробки там говно.
Так ты слишком туп для впф. Либо переходи на винформс, либо читай литературу по впф и возвращайся к впф после прочтения.
Спасибо, но я имею в виду пример кода. Уже не одну неделю вожусь с этой рекурсией, уже сам в зациклился
А в чем проблема, вроде только Min Max давятся пустым перечислением. Проверяй размер перед запросом, благо для массива это почти бесплатно.
Parameter name: source
Я ж и говорю хависит. Ты сначала сформируй исходные данные и то что нужно получить. А то это "а если то, а если это" может долго продолжаться.
В таком случае могу только посоветовать книги по фрезерному и токарному делу. Если ты алгоритм в код переписать не можешь, что дальше тебе в программировании делать нечего.
Так там еще и попытка обращения к элементу этого массива через FirstOrDefaul, т.е. и тут налл может быть, а потом еще и чтение поля, котое может быть налл. Та еще наркомания.
Или так.
А ты на JS до этого не писал?
А не напиздел, в foo запутался
Спасибо, что разрешил.
спасибо!
Ты давно приложения на питоне открывал? Там и 5 и 10 секунд под декстоп.
Приложухи на Замарине под мобилками открываются в момент.
Также не сравнивай Релиз с Дебагом.
Как и все остальное - через ItemsSource. Отображение настроить через ItemTemplate.
Помогите пожалуйста
Нужно выполнить задания 17 и 18 по примеру 15/16 (через string/substring)
Через сабстринг это условие препода? Если да, то передай ему привет в челюсть. А тебя потом в приличном обществе за такой код обольют ссаниной.
Скажи преподу чтобы он для себя открыл класс StringBuilder
ПЕРЕКАТ: https://2ch.hk/pr/res/1687982.html (М)
ПЕРЕКАТ: https://2ch.hk/pr/res/1687982.html (М)
ПЕРЕКАТ: https://2ch.hk/pr/res/1687982.html (М)
ПЕРЕКАТ: https://2ch.hk/pr/res/1687982.html (М)
ПЕРЕКАТ: https://2ch.hk/pr/res/1687982.html (М)
ПЕРЕКАТ: https://2ch.hk/pr/res/1687982.html (М)
ПЕРЕКАТ: https://2ch.hk/pr/res/1687982.html (М)
ПЕРЕКАТ: https://2ch.hk/pr/res/1687982.html (М)
ПЕРЕКАТ: https://2ch.hk/pr/res/1687982.html (М)
ПЕРЕКАТ: https://2ch.hk/pr/res/1687982.html (М)
ПЕРЕКАТ: https://2ch.hk/pr/res/1687982.html (М)
ПЕРЕКАТ: https://2ch.hk/pr/res/1687982.html (М)
ПЕРЕКАТ: https://2ch.hk/pr/res/1687982.html (М)
Если биндить сам словарь через Values, ничего не отображается. Если же преобразовать в ObservableCollection, кидает исключение при изменении словаря.
Ахах, зацените. Пишешь под виртуалку, которая запускается в другой виртуалке.
У тебя бесконечная последовательность генерируется энумератором?
>>688113
>Если биндить сам словарь через Values, ничего не отображается
А не пиздишь?
>кидает исключение при изменении словаря.
Значит ты не правильно делаешь.
Ты бы учебник какой прочитал, а то так будешь долго ебаться и не факт, что получится.
Хотел бы задать не очень обычный вопрос в тредике.
Есть ли тут аноны, которые работают в Европке или знают о ситуации о востребованности c#? С тянкой по ее учебе будем перекатываться в Германию или Англию, и ПОЧЕМУ-ТО язык в Англии более востребован, чем джава-я очень охуел (в германии все же джава). Так ли это?
Сам я фронт-макака и хочу давно дропать.
Ну и в целом любая полезная информация для вкатывальщика. Спасибо
А зачем нужен флюент когда есть стандартные валидации
соответствия модели (DataAnnotations)?
Не был бы нужен - то никто бы такого монстра не разрабатывал и он бы не пользовался такой популярностью.
Больше гибкости, хорошо укладывается в Mediator и CQRS patterns. Логику проще изолировать и проще управлять.
Судя по штатам у нас тут у каждой второй конторы есть аутсорс или бранч компании в Ирландии и Англии. Если мы тут на дотнете, то и они там будут на дотнете.
В Германии, наверное, много банков и они там тонут в джава легаси. Хз короче.
Хм, почему просто так не сделать? У тебя просто почему-то подразумевается, что считаются буквы внутри слов, но ведь в задании ничего про это нет, там только про строку. Или это я тупой?
ДВАЧ ПАМАГИ
Уже 2 дня пытаюсь подключить бд sql с сервака к программе, но не выходит. В списке подключений сервера нет, при загрузке файла напрямую вот такая вот ошибка.
Все программы обновил до последней версии, и сервер, и sql, и manager.
>It seems you have multiple instances of various versions of SQL Server on your machine.
https://stackoverflow.com/questions/46431043/cannot-be-opened-because-it-is-version-852-this-server-supports-version-782-and
MSSqlServer это сириус бизнез, хотя локалбд заводится в один клин, я хз что ты там наделал, что все сломал.
Я все обновил по максимуму, видать, зря.
Вот старый сервер и остался.
И что делать?
Не понял как эту проблему решили, эту тему уже видел.
Здесь вы можете наблюдать причину почему программистов не хотят брать на работу после ВУЗов и боятся их как огня.
Больше всего полыхает срака, что учился на другой инженерной вышке, тянул как основное образование которое нахуй не уперлось, так и программирование, потом доказывал на собеседованиях, что я не верблюд, а какие-то дегенераты занимают места в вузе и приходят с плевыми задачками, чтобы ты решил за них. Блять
Я делал за деньги экономику младшим курсам. Не мой профиль, но задачи плевые. Подготовил формулы в Экселе, и поставил решение на поток. Я могу понять моих клиентов – это пезды тупые, и то говно в принципе не интересное. Что делает этот анон, я понять не могу
Вспомнил своего недавнего клиента. Он учится программированию, но петпроекты заказывал у меня. Причем я ощущал, что по ту сторону экрана сидит малолетний пахом, потому тз были крайне ебанутые. Например, написать просмотрщик фото, который позволяет делать удобные вырезы стикеров. Он серьезно показывал это учителю!
какой же ты тупой, пиздец. Ты же понимаешь, что оно ищет по словам в вакансии, и очевидно, что множества С# и .net в твоем высере пересекаются и потому их складывать нельзя. Хотя кому я объясняю.
Ну вот, удалил я старую версию sql сервера, получил другую ошибку.
>что там слышно про NET 5
Уже третье превью вышло
> когда там вся линейка в попенсорс уходит?
кор в опенсорсе уже много лет
>try to use (localdb)\mssqllocaldb as server name to connect to the LocalDB automatic instance, for example:
><connectionStrings>
><add name="ProductsContext" connectionString="Data Source=localdb)\mssqllocaldb;
> ...
Бля, кароче не так вопрос написал. Вот у меня есть класс ListResult<T>. В нём поля List<T> List и int Total. Как сделать чтобы я мог писать ListResult<IViewPost> = listResult где listResult - ListResult<Post>? Чтобы неявное преобразование проводилось итеративно по каждому элементу поля List как бы.
Лучше фильтрануть OfType или использовать ConvertAll чтобы эксепшенов избежать
Обещали что весь .NET 5 будет попенсорсе же? Ну типа останется только кор. Или уже переобулись?
Кора и Фреймворка не будет, останется только .NET 5
Спасибо, анончик, за помощь. Твой способ не сработал, но после третьей переустановки с устаановкой всех ненужных плагинов, удалением старых бд и ещё одного дня пердолинга, я наконец сделал это.
Просто ебаться с постгресом нет желания, хотелось бы уточнить
есть express версия, сильно лимитирована, но полностью халявная
Суть в том что объект который я десериализую имеет кучу свойств которые создают автоматически и у которых некоторые поля используются как базовые, но помечены как игнорируемые, но System.Text.Json превращает такие поля для чисел к примеру в 0, когда newtonsoft json оставит там созданный объектом 100.
Сам искал, но примеры по ссылкам в гугле либо с какими-то наворотами, либо для стерео, либо еще не пойми что, а самого простого - нет видимо потому что я один не могу додуматься самостоятельно
Я не пишу на шарпе и вовсе не кодер, но необходимо автоматизировать одну хуиту и нашел разве что готовую библиотеку на шарпе с подключением к проекту через нугет. Но надо кое что поправить, а как не пойму и можно ли вообще.
Вижу его в ссылках, могу посмотреть в обозревателе какие методы там есть, но сам код увидеть не могу. Он закрыт?
Поясните на пальцах тонкости реализации с async/await ?
Что есть Таск и сколько тредов создает среда исполнения в простых случаях?
Код написанный в стиле async/await не страдает от многопоточного исполнения ?
Упростило ли серьезно введение async/await гуипрограммирование?
На ютубе об этом часовых и меньше видео десятки где поясняют что и как внутри работает.
Добавь метод, который будет создавать нужное состояние и пометь его атрибутом [OnDeserialized]
Но вообще не понятно зачем ты пометил их игнорируемыми, если тебе нужно сохранить их состояние.
>Не разбираюсь в дотнете вообще.
А зачем тебе тогда ответы на эти вопросы?
>Что есть Таск
Задача, которая завершится в будущем. Или не завершится.
>сколько тредов создает среда исполнения в простых случаях?
Сколько посчитает нужным в зависимости от свободных ресурсов, активности приложения, настроек пула и т.д.
>Код написанный в стиле async/await не страдает от многопоточного исполнения ?
Что значит традать от многопоочного исполнения? Таска может выполнится в другом потоке. Зависит от контекста синхронизации. Но в общем случае надо обеспечивать потокобезопасность самому.
>Упростило ли серьезно введение async/await гуипрограммирование?
Упростило написание асинхронного кода.
>Но вообще не понятно зачем ты пометил их игнорируемыми, если тебе нужно сохранить их состояние.
Это сериализация/десериализация настроек и настройкам не нужно хранить границы возможных настроек потому что они могут меняться в коде. Плюс если их не игнорить, то json вырастет минимум в 3 раза.
Просто мне не понятна логика десериализаторов зачем если у объекта есть установленное свойство, они создают новый экземпляр и заменяют тот что уже существует, почему не заменить только те свойства/поля которые есть в json, не создавай экземпляры на каждый чих.
Они ничего не заменяют, когда происходит десериализация, то объект десериализуемого типа инициализируется в памяти без вызова конструктора, но при этом все байты объекта инициализируются в состояние null или 0.
Вызов GC.Collect(GC.MaxGeneration, GCCollectionMode.Forced,true, false) ничего не меняет.
>>692757
Попробовал оба аттрибута
[OnDeserializing]
[OnDeserialized]
и походу они не для System.Text.Json.JsonSerializer
А про создание объекта, я не знал что он так работает так как разбирал другие json библиотеки и в них всегда создавался объект при чем такой же косяк был с заменой свойств даже если они существуют.
Что в принципе для моей логики не подходит и вообще хотелось бы десериализатор в который можно прокинуть объект которых хочешь десериализовать и чтобы в нем заменились лишь то что есть в json.
Но походу для такого придется писать свой велосипед, что не радует, так как велосипед в 99% случаев равен куче косякам в будущем.
>собирает мусор из разных потоков?
В смысле из разных потоков? То что в стеке потока, гц не трогает ибо стек, а куча с потоками никак не связана.
>Что почитать?
Ну Рихтера почитай.
Вроде нет, это же сборка
Есть пара идей тупая и не производительная.
1) Закомментить все свои вызовы или пометить их чтобы отличать от чужих
2) Console.SetOut с собственным TextWriter где ты перед выводом берешь стэк вызовов и смотришь откуда пришел вызов тем самым определяя эту длл.
Задача вывести в хтмл элемент количество записей с определённым возрастом через контроллер, пикрил мой вариант пользуясь документацией и стаковерфлоу.
Когда добавляю какой-либо параметр после FromSqlRaw("...") страница выдаёт SqlException: An expression of non-boolean type specified in a context where a condition is expected, near ')' .
Заранее спасибо!
Потому что надо начинать с основ. Запрос надо не толко создать, но и выполнить.
Всё что скрывает данные от внешнего кода используют для инкапсуляции.
1. Сгенерировать, зашифровать, выдать JWT токен я понял как, что дальше? Где его хранить? Сохранять в кукисах браузера пользователя? Сопрут же нахуй.
2. Нужна ли Global autentification? Типо давай логинься, тварына, потом суй свой нос. (Знаю, что субъективно, я про best practice)3
3. Самое ебонутое для меня - refresh token. Как и когда? Типо в Access token зашифрован Exp, по истечении которого он должен обновиться Refresh токеном? Чи шо? Перечитал уже тонны материала, все вроде понятно, но как реализовать - хуй его знает.
4. Access токен для каждого юзера должен быть свой? По сути да, ведь там Claims, то чурбаны-индусы создают его в StartUp (хуй знает зачем) и выдают один и тот же при Auth.
Спасибо
Подается лист из объектов bar, есть доступ к bool(bar, bar).
Мне нужно как-то отсортировать поданный лист, разделив его на разные листы, где обретаются только объекты с true между собой и false со всеми остальными, как это лучше сделать?
720x1280, 0:03
/pr/, который вы заслужили. Разделить один лист на два. Я не хочу тебя обидеть, но ты тупой или да? Может тебе еще задачку с разделение на upper case разделить?
Чтобы это работало если будет даже <a href="/ru/feedback/hui/s/masloь"> ? Что можно использовать?
1. В примерах в основном используется биндинг параметров запроса к классу модели, где через DataAnnotation настроены ограничения. У меня модель настроена для EF через Fluent Api, очевидно при валидации эти ограничения не учитываются. Какой путь правильный? Не хочется размазывать логику по кофигурации сужностей и на флюент и на аннотации. Писать отдельные классы для EF и для запросов? Какие бэст приктис есть?
2.Как валидировать параметры, которые передаются не через привязку к модели, а как аргументы метода:
OnPostAaa(int n)
if(n < 0)
...//что тут писать, что б страница отобразила ошибку? Какой акшнрезалт возвращать?
3. В примерах используется такая конструкция
if(!model.IsValid) return Page();
Это хорошо работает, если на странице ничего нет. А если методом Get тянутся данные из бд и прочее, то при вызове пост оно не загружено и если вернуть Page(), то будет ошибка. Что возвращать? RedirectToPage? Вызвать Get (if(!model.IsValid) return Get())? Но тогда параметры гета будут просраны.
Поясните плз.
Во-первых, исользовать Git, чтоб не было такого "ой, я что-то поменял, а оно все сломалось". Во-вторых, откуда нам знать как ты там конструктор похерил? Ошибки есть? Предупреждения? В какие файлы лазил? Что значит конструктор чист? И т.д. и т.п.
Регулярки, очевидно.
Хуй знает что ты высрать пытался из своей тупой бошки. Могу лишь рефлексию посоветовать.
>>695190
эх, сейчас бы решеточки поучить. До карантина вакансий не было, сейчас вообще пиздец - у нас 4 проекта закрыли, с начала карантина всех джунов нахуй повыгоняли, на сейчас - кто может во что ни будь кроме решеток - на бенч, остальных - нахуй. Я на реакте сейчас помогаю педалить под RoR и пыху, а вы все решеточки учите, лол. А стоп, учебный год же не закончился, забыл
Ты обязан делать отдельную валидацию для юзерских данных и для твоих БД моделей.
DB entities и User data (Request/Response) должны друг от друга наглухо изолированы быть. В твоей бизнес логике должен быть какой-то маппер, который возмёт данные от юзера и добавит их к БД модели.
Теперь понятно почему жаба петухи нам завидуют. Им ведь не то что указатели, им даже goto не завезли)))))))
> Маппер
Какой? В ef core с этим ебля, не помню механизм, но null не разрешает. Как нормально это сделать? Это основная моя проблема на пути понимания DDD Вторая – Boundaries Context и проброс сообщений между контекстами
Для валидации советую FluentValidator
Ужасный пример.
Я не буду утверждать со 100% уверенностью так как ил код не смотрел, но скорее всего в первом примере внутри цикла тупо был удален весь код и идет только цикл и он пустой, а во втором как раз таки не удален так как помимо получения данных из массива там вроде при вызове по индексу есть проверка выхода за пределы массива. Если добавить зависимость на внутренний цикл типа суммирование массива, то результат скорее всего будет примерно одинаковым.
Плюс весь этот unsafe код можно заменить на Span и результат будет тем же самым что с unsafe., но только более читаемый.
Но результат во всех 3 случаях думаю будет примерно одинаковым (+-5% разница) при условии обмана оптимизации цикла чтобы он не исчезал.
Аноны, а разве массивы в структурах не ссылочные? Они что ли прям в структуре на стеке находятся?
Как тогда прилепить ссылочную коллекцию? Использовать List? Он сильно больше памяти жрёт?
в форм1 есть объект Client client и в нём есть всякая залупа(свойства взял из текстобоксов итд), так вот, как мне всю эту залупу перетащить в форм2?
Так посмотри, ничего не исчезает. Можно также и память забивать создавая обекты в куче не присваивая их никуда. У Рихтера часто такое используется для демонстрации работы gc.
Так и есть, хоть два кода и выглядят похоже, но сравнивать их бессмысленно.
>>695963
Массив - ссылочный тип.
>Они что ли прям в структуре на стеке находятся?
В структере хранится ссылка на массив (сама ссылка - значимая). Где хранится структура - зависит от контекста.
>Как тогда прилепить ссылочную коллекцию?
Бери да прилепляй
>List? Он сильно больше памяти жрёт
Есть минимальный оверхед на хранение внутренних переменный листа. Но по дефолту, если место во внутреннем массиве кончилось, то лист увеличивает массив в два раза. Т.е. если у тебя есть миллион объектов и ты вставляешь еще один, для которого нет места, то внутренний массив становится размеров в 2 миллина, 999999 из которых пустые записи. Что займет лиших ~8Мб для ссылочных типов х64.
>>695967
Разделяй модель и представление. Если форма2 создается новая, можешь пропихнуть нужные зависимости через констрруктор. Если форма2 живет паралельно, и должна следить за изменениями данных, то события. Слишком абстрактый вопрос.
Уже сделал через конструктор, а так спасибо всё равно за ответ
Значит рантайм пропускает то что внутри цикла будет, просто у тебя фундаментальная ошибка измерения перформанса.
Замени сохранение переменной, на суммирование ее в переменную до Start:, в результате ты увидишь что разницы практически не будет. А все потому что теперь нельзя выкинуть код внутри цикла.
Рихтер писал давно и скорее всего по умолчанию имел ввиду версию кода без оптимизаций, а сейчас у же в net core 3 столько оптимизаций наделали, а в net 5 еще больше собираются, что многие перформанс библиотеки становятся бессмысленными.
Раньше вот считалось что Activator.CreateInstance медленный и надо его оптимизировать, а точнее заменять на Expression версию, будет лучше, сейчас же разница на уровне погрешности.
А в C# 9.0 вообще новая веха наступает когда можно писать код не только быстрый, но и с 0 аллокацией памяти.
> В структере хранится ссылка на массив
Тогда почему при копировании структуры копируется весь массив и при изменении копии оригинал не меняется?
double VectorSum(double[] A)
{
double sum = 0;
double n = A.Length;
for (int i = 0; i <= n - 1; i++)
sum += A;
return sum;
}
Собсна вот доказательство того, что те, кто учат питоняшку первым языком не смогут в другие языки. Даже в элементарное понятие синтаксиса.
А по делу не подскажешь? Рэнджи в питоне по другому задаются и я не знаю как интерпретировать for (int i = 0; i <= n - 1; i++). Онлайн компилятор вообще ошибку выдает.
Спасибо. Из-за n - 1 думал, что последний элемент не берут. Если что писал не я это https://www.quantalgos.ru/?p=544.
>Рихтер писал давно и скорее всего по умолчанию имел ввиду версию кода без оптимизаций
Всё также работает, как и при Рихтере. Это .NET Core 3.1.
1 - Span<int>
2 - указатели
3,4 - обычный массив
Код: https://pastebin.com/H7KCDYXt
И происходит какая-то херня в случае с обычным массивом. Если обозначить метод Sum как статичный, то скорость падает до уровня Span. Если сделать его методом экземпляра, то скорость чуть хуже чем у указателей.
При этом IL код одинаковый, разница лишь в том, что в случае статики вызывается 0 аргумент, а в случае экземпляра 1 аргумент (потому что 0 аргумент это this).
Также скорость падает если убрать модификатор in/ref у аргумента функции. Эти модификаторы никак не влияют на время выполнения в случае Span, он также показывает 6100-6300.
Пробовал тоже самое компилировать в VS 2019, релиз версия, включенная оптимизация кода. Результаты одинаковые. В случае с массивом тоже самое - если создать экземпляр Program и вызывать у него метод Sum, то скорость выполнения будет выше, чем если объявить метод Sum как метод типа и вызывать его напрямую.
Почему так?
stackalloc span - где эта залупа в реальных проектах применяется? И зачем это говно в 7.2 притащили в решеточки?
бампэлло, тварыны
Там где нужна производительность и работа с пайплайнами. Аллокация памяти происходит не в куче, а на стеке, т. е. у тебя не создается оверхеда от создания указателей на тип и блок синхронизации. Также предотвращает боксинг и анбоксинг, потому что Span это ref struct.
Но по мне так самая незаменимая их функция это способность искать определенную последовательность/последовательности при помощи indexOf и indexOfAny.
3 пик не тот, вот нужный.
>Аллокация
>оверхеда
пиши или на русском или не коверкай ангельский
>Аллокация памяти происходит не в куче, а на стеке
>Также предотвращает боксинг и анбоксинг, потому что Span это ref struct.
Америку открыл, гранд этому
>указателей
какие нахуй указатели? Это не тред крестов, алло
>Но по мне так самая незаменимая их функция это способность искать определенную последовательность/последовательности при помощи indexOf и indexOfAny.
вообще хз зачем ты это написал
Но я так и не услышал реального ответа - в каком именно проекте ты дрочишь эту шнягу в unsafe блоках? Стэк, технология, сфера, решение какие задач?
>Там где нужна производительность
и коню понятно, где байтодрочеры, там и гонка за производительностью
https://docs.microsoft.com/en-us/dotnet/csharp/programming-guide/unsafe-code-pointers/how-to-use-pointers-to-copy-an-array-of-bytes
я в этом ебучем болоте под названием "unsafe code" не сижу. С 7 версии в решетки пихают все, что душе угодно. Скоро ФП будут запихивать. Будут и тут reduce,maps, функции высшего порядка и казино с шлюхами. Фу блять, фу нахуй
Я полдня решал ошибки, а они сыпятся каждый ребилд одна за другой.
Скажите, так в любом языке при вкатывании в рабочий проект? Почему все так хуево? Я хочу кодить, а не ебаться с настройками окружения.
чтобы писать качественный код на решетках не нужны все эти ебучение замашки ФП и байтоебство (если конечно даун архитектор не решил написать какой то хайлоад кусок на #, земля ему пухом).
Update by update они поднасирают какими то новыми "фичами" от которых не знаю толи родоваться, толи плакать.
>>696495
>Но я так и не услышал реального ответа - в каком именно проекте ты дрочишь эту шнягу в unsafe блоках? Стэк, технология, сфера, решение какие задач?
Жду ответа
>решил его пощупать, а там в ебало отсутствующие пакеты, рефы, dll-ки и прочий пиздец
>ебаться с настройками окружения.
>настройками окружения.
>настройки
>окружения
зачем так толсто, маQAQA? Ты моки умеешь писать? Интеграционные и блочное тестирование хорошо освоил, что ты клюв суешь?
А во что тогда вкатываться? В куа 300 рыл на место буквально, фронтов тоже до жопы, на жабе и пыхе сейчас вакансий на джуна не сильно больше чем шарпе, да даже 1с просел - ну оно и ясно.
только начинаю учить решетки
ну да, тестировщик, который тесты не знает как писать, а в проект лезет. Классика жанра
>Я на шарпе писал ещё когда ты не родился
>Наоборот, писать на шарпе без ФП (добавил за тебя) это ебучее макакство
ФП начали добавлять с 7 версии шарпа, а это 17 год. Предположим, что ты начал писать 3.5 фреймворка (не такой тухлый, как предыдущие патчи), который был в 7 году. Т.е. ты 10 лет был макакой? Нахуй ты себя так овнишь?
Мне конечно интересно подискусировать с ФП решеточными богами нет, но меня из всего срача интересует только один вопрос - где вы их нахуй применяете. С конкретико й - стэк, проект, сфера применения, задачи. Всо
Знает.
>Америку открыл, гранд этому
Так ты спросил зачем нужно, тебе ответили.
>вообще хз зачем ты это написал
А как ты в массиве найдешь определенную последовательность вызовом одной функции? Это не тот же indexOf что и в других коллекциях, он ищет не единственный элемент, а последовательность элементов.
>эту шнягу в unsafe блоках?
Для Span не нужен unsafe блок.
>Стэк, технология, сфера, решение какие задач?
Тебе же сказали - в пайплайнах. А именно, в сериализации/десиреализации, в обработке сетевых запросов. В общем, везде где тебе нужно получить какой-то массив данных и предеать/обработать/изменить его с максимальной производительностью и скоростью.
Вот https://pastebin.com/Hqmga8R2
Дает вот такой результат для 3.1 под релизом с выключенным arithmetic overflow.
Предполагаю у тебя такая разница как раз из-за него, потому что с указателями ты обходишь эту проверку отсюда и такой выигрыш.
react/vue/RoR/Golang (последние два на любителя, денег на них много не заработаешь)
>>696592
>>696571
LINQ это ФП? Not sure about it (см. различие метода и функции, в LINQ может и написанны алгоритмы приближенные к идеалу, но это скорее методы, чем функции). Могу ошибаться, не буду спорить
>>696590
>Тебе же сказали - в пайплайнах. А именно, в сериализации/десиреализации, в обработке сетевых запросов
Задача, стэк, приложение? Я не совсем понимаю, что ты сериализируешь и какого рода сетевые запросы. Я скажу больше, я даже не пойму о каком уровне OSI мы говорим
Ну вот тебе простая задача:
Ты получаешь ответ на сетевой запрос, для этого тебе нужно создать буфер, при каждом новом пакете ответа ты должен записать последовательность полученных байт в этот буфер, при этом ты должен отслеживать получение конца ответа, допустим это последовательность байт вида 13 10 13 10 (\r\n\r\n).
С помощью Span Это делается легко и красиво:
byte buffer = new byte[1024];
int bytesRead= 0;
byte[] endSequence = new byte[] { (byte)'\r', (byte)'\n', (byte)'\r', (byte)'\n' };
//Нет необходимости отслеживать смещение и вычитать его из уже полученных данных, всё делается с минимум переменных, в одну строку
bytesRead = networkStream.Read(buffer.AsSpan(bytesRead));
//Заменяет целый цикл по перебору массива и легко позволяет найти нужную последовательность в полученных данных
if (buffer.AsSpan(0, bytesRead).IndexOf(endSequence == -1)
{
if (bytesRead == buffer.Length) Array.Resize(ref buffer, buffer.Length*2);
continue;
}
Я всё не пойму чего ты пытаешься добиться. Что кто-то признает, что если ты это не используешь и не можешь придумать где это использовать, то значит нинужна и хуйню сделали?
>ответ на сетевой запрос
Какой протокол, уровень OSI? Конткретней можно?
>Я всё не пойму чего ты пытаешься добиться. Что кто-то признает, что если ты это не используешь и не можешь придумать где это использовать, то значит нинужна и хуйню сделали?
Мне все равно, как применяют инструмент, меня конфузит, когда используя этот инструмент N лет я вижу конструкции типо int* и начинаю гуглить, что это за хуйня возле типа прилипла, поэтому и интерисуюсь, какие сферы затрагивает решение задач ФП на # (это я про unsafe блоки). Единственное, что я хочу из всего этого диалога понять - это сфера применения. Ни задача, ни проблема, ни пример, а именно сфера применения.
И да, все, что можно сделать на ++ лучше сделать на ++. В # могут что угодно запихнуть, от этого язык лучше не станет. Кто думает "Азаза чем больше возможностей, тем лучше" - поспрашивайте от чего Java в говне тонет
Каким ебаном надо быть чтобы для таких простых тестов разворачивать целую бенчмарк библиотеку?
>Какой протокол
А что, в каком-то протоколе не нужно искать определенные последовательности?
>уровень OSI
Любой кроме физического и канального. Сетевой это один из уровней OSI, тебе привели пример, но ты спрашиваешь УРОВНИ? ПРАТАКОЛ!? Ты правда дурачок или просто немного с ума сошел от осознания того, что язык на месте не стоит вместе с тобой?
>когда используя этот инструмент N лет я вижу конструкции типо int
Ну потому что ты используешь этот инструмент на более высоком уровне и не заботишься об оптимизациях. При этом даже из интереса не заглядываешь в исходники этого инструмента, которые кишат int и unsafe, благодаря которым твой высокоуровневый код работает более-менее быстро.
>от чего Java в говне тонет
От того что погряз в легаси и не развивается, как раз из-за таких дурачков как ты, которые боятся поломать старые устои и перед тем как использовать что-то новое крестится тысячу раз (а потом всё равно не использует). У них и половины от шарпа нет, а главное и не предвидится.
>в каком-то протоколе не нужно искать определенные последовательности?
да, не нужно, т.к. все оптимизированное и формализованно до нас
>тебе привели пример, но ты спрашиваешь УРОВНИ? ПРАТАКОЛ!?
если ты даже не можешь конкретную задачу привести и уже 3 или 4 пост кидаешься абстрациями. Тебе стыдно сказать проект, в котором ты пишешь код? Или у тебя свистелка-перделка на высчитываение доли секунд запросов и обработки?
>Ну потому что ты используешь этот инструмент на более высоком уровне и не заботишься об оптимизациях
на то это и высокоуровневый язык, чтобы пользоваться высокоуровневыми интерфейсами взаимодействия
>При этом даже из интереса не заглядываешь в исходники этого инструмента
facepalm. Дрочило, попутавшее стэк на месте. Не хочу толстить за бинарники и команды процессора, устал уже от этой хуйни. Я даже благодарен таких дурачкам, как вы, которые вкатышам за килобаксы советуете начинать с Таненбаума, Кнута и освоение ассемблера
>От того что погряз в легаси и не развивается
ты за апдейтами Java следишь, что пишешь такую хуйню?
Я устал от попыток диалога с тобой, могу лишь сделать вывод, что ты скорее всего студентота, когда то дрочившая C/++, пытаясь в очередной раз изобрести колесо
Мда
>Тебе стыдно сказать проект
>ты скорее всего студентота
Да, ведь для того чтобы интересоваться и изучать возможности языка на котором ты пишешь, нужно обязательно использовать эти возможности в проекте, либо нужно быть студентом, который дрочил С. Не перестаю проигрывать с животного. Ну сиди ты /b/ и перди там вместе с таким же быдлом как ты, этот раздел и тред как раз и создан для того чтобы обсуждать язык и его возможности, нахуй ты сюда лезешь?
чтобы что то изучать, нужно понимать для чего ты это изучаешь. Только студентота и дрочилы бьються головой об стену изобретая изобретенные вещи еще и не тем инструментом
>Не перестаю проигрывать с животного. Ну сиди ты /b/ и перди там вместе с таким же быдлом как ты
не знаю, чем так поджег твою жопу, но видимо аргументация была моя верна, раз такой триггер пошел. И да, это уже 5ый пост с пуков в воздух твоего Unmanagement code. Жаль тебя вобщем.
мальчик, мне интересен был проект или идея, где используется этот код, а не троллинг. Ты видимо и сам не так давно из /b/ пришел, раз такую дичь пишешь
Крашится LINQ запрос на GroupJoin. Стаковерфлоу говорит там какую-то непонятную хуйню про вычисление на стороне клиента итд. Чем мне заменить мой GroupJoin-то можно? Подскажите плз
>мне интересен был проект или идея
Так в чём проблема? Открываешь Github, вбиваешь в поиск Span с любым интересующим аргументом типа, смотришь на массу проектов и идей. Что, в чём проблема? Ах, да, так ведь будет сложно манямирок свой подкреплять в котором всё новое не нужно, нигде не используется, нигде не применимо.
Я понимаю, что тебе сложно осознавать свою ущербность из-за которой ты вместо того чтобы изучать, ищешь оправдания, но разве это причина для того чтобы начинать нести какую-то чушь и повторять из сообщения в сообщение одно и тоже? Ты хотя бы хоть немного оригинальности добавил, а то совсем скучно.
>манямирок
>всё новое не нужно, нигде не используется, нигде не применимо.
>сложно осознавать свою ущербность
мальчик, ты какой то тупенький. Мало того, что ты не можешь в 2 словать описать что ты делаешь, так ты еще не понимаешь смысла зачем ты это делаешь. Может ты оптимизаторы для Linq делаешь? Или какой то низкоуровневый API? Not sure about it. По поводу всего остального, что ты брыжешь желчью, когда тебя тыкают носом в говно - я тебя на путь истинный пытаюсь вывести да нет, на самом деле мне похуй на тебя И да, серьезно жаль тебя
Ты уже определись, тебе конкретно я интересен или "проект или идея". Даже страшно представить, почему я стал интересен умственно отсталому и он так сильно пристал именно ко мне.
>GroupJoin
Твоя база это не поддерживает. С 3.0 на клиенте больше не выполняется.
>Чем мне заменить
Ручками делать после выполнения запроса. А вапще это от тебя зависит что ты там понаписал и хочешь - иди читай, переписывай.
https://github.com/dotnet/efcore/issues/17068
https://stackoverflow.com/questions/60588364
https://stackoverflow.com/questions/58622571
Ааа, вот оно что епт. Охуеть просто. Теперь понял всё. Спасибо.
бамп, по всему разобрался кроме refresh token
Это понятно, но тут же вроде ситуация не как с явой и спрингом и не как с питоном и джангой. Вроде как наоборот - сишарп входит в состав .NET. Если это так то что еще входит в его состав?
>Сишарп разработчик == .Net разработчик?
>Вроде как наоборот - сишарп входит в состав .NET
Не входит, а может использовать функционал .NET, так же как и куча других языков программирования, даже на С++ можно писать для .NET
Можешь свой компилятор написать и обходиться без .NET, как это сделали создатели Mono или Unity.
>Сишарп разработчик == .Net разработчик?
Не обязательно, если ты под Unity пишешь, то с .NET у тебя не так много общего.
.NET это основа. Чистый .NET Это стандартный набор библиотек. Потом уже идут всякие ответвления типа ASP .NET, WPF, Win Forms, Xamarin и т. д.
Второй стул – Flutter. Совершенно противоречивые отзывы в сети. Говорят даже, что гугл наебывает со списком компаний, которые его используют, агрессивно пиарит и делает это лишь затем, чтобы иметь запасную технологию, если oracle начнет брыкаться. Зашел в новость на сайте Microsoft по поводу MAUI, в который превратится Xamarin, Flutter прямо таки не любят. Но вдруг он будет лучше?
Смущает то, что контролы там не нативные, но как бы и в forms так же ебаться с xml для Xamarin native желания нет
Вообще, все языки разметки для меня вызывают какую-то боль. Не получается их просто так изучить на достойном уровне, просто листая документацию. Взять тот же XAML – я им пользовался, пока писал на wpf. Многословный, неинтуитивный. Очень сложно сделать что-то красивое. Но этот же XAML и в Xamarin. Попробовал Vue.js – охуел от удобства
В общем, отпуск у меня две недели, и хотелось бы потратить их с пользой, заперевшись в своем чулане. Если кто-нибудь имел опыт с двумя этими технологиями, был бы рад услышать отзыв
>насколько сильно я проебался начав вкатываться в дотнет?
Довольно сильно.
>Что должен уметь падаван
Всё. Я бы дал 80%, что будешь фулстеком и в итоге перейдешь на реакт
>почему так мало вакансий в России?
Странный вопрос. Сколько надо кодеров, столько и вакансий.
Я с дотнетом проебался в плане того, что надо перекатываться в Японию, а там мир победившей джавы
Насчет фулстека ты прав, попробовав пописать на wpf, через месяц перескочил на Vue и кайфую уже полгода. Теперь думаю, то ли б-гмерзкий js изучать и всю его экосистему на нормальном уровне, чтобы во фронт уйти, или продолжать дрочить дотнет с неизвестной перспективной при перекате
ЖС-то все равно придется учить, потому что опять же, подавляющее большинство c# разработчиков это ASPшники. Но раз тебе про Японию, то я ничего не знаю. У них там всегда все не как у людей.
Да хотелось бы просто бекендом деньги зарабатывать, です
Но да, учить js придется. На работе можно клепать простые сайты для внутрикорпоративных нужд, не понимая особо промисов, но далеко так не уедешь. Да и по шарпу я не то чтобы спец, весь мой код синхронный, не считая мест, где без параллельности никак. Но и там простые Task.Factory.StartNew(() = {}). Просто не успеваю все это изучать. И фронт, и бек, и алгоритмы, и японский. Сейчас очень сильно себя виню за то, что был распиздяем в универе и слил пять лет фактически свободного времени впустую
Хороший код для первого раза, читается по диагонали, です
Я бы на твоем месте навернул абстракций, потому что сегодня ты хранишь инты в качестве сущности мира, а завтра захочешь дома и дороги – вместо массива с интами массив с объектами. И презентер к нему
Добавил бы интерфейсы, DI, заменил общее исключение на ArgumentException
Но это так, не забивай голову. Ты очень понятно написал, мой первый более менее осмысленный код был дерьмом по сравнению с твоим
Сколько изучаешь и как?
У тебя set и get одно и тоже делают. Проверка не нужна, так как тот же самый результат ты получишь при обычной попытке доступа к значениям находящимися за границами массива.
И Console.Write + Console.WriteLine() нужно заменить на StringBuilder, а в конце добавить Console.WriteLine(sb.ToString())
Ты же за критикой пришел, верно?
-Вынеси в отдельный метод вывод мира из Main
-Не захардкоживай числа
-Check - плохое имя метода, когда в коде появится world.Check(..) первая мысль - проверяется сам мир на какие-то параметры, как вариант CheckCell, а лучше упомянуть что именно проверяется, например IsCoodrdinatesBelongToWorld.
-В методах гет и сет (опять плохие имена, не понятно что именно устанавливается и получается), ты проводишь проверку и кидаешь эксепшн. Что плохого? Во-первых, при неверных координатах сам массив и так бросит АутОфРэнж, а во-вторых, ты бросаешь максимально обобщенное исключение - Exception, что сильно усложнит обработку исключений на верхних уровнях. Всегда генерируй максимально специфичные исключения.
-Твои гет/сет логичнее заменить индексатором, прочитай про него.
-Еще ты вроде с индексами проебался, попробуй сделать не квадратный мир
https://ideone.com/oyNcSe
Делаю как в ссылке, но в sql manager'е не могу нигде ее найти
https://www.entityframeworktutorial.net/code-first/simple-code-first-example.aspx
Отметь как ответ
Делаю все в точности как в ссылке
https://www.entityframeworktutorial.net/code-first/database-initialization-strategy-in-code-first.aspx
мне прилетает пикрил в конструкторе контекста Database.SetInitializer.
>Зачем нужна асинхронищина в ef core?
Как и везде, чтоб не блокировать поток. Пока бд проперживается поток твоего приложения спеет сделать что нибудь полезное.
Теперь понел
Бля, разобрался, мне нужно было написать
Database.SetInitializer(new laba1DbInitializer());
вместо
Database.SetInitializer(new CreateDatabaseIfNotExists<laba1Context>());
Работаю с цмсками и решил обратно вкатиться в программирование на шарпах в асп.нет. В связи с этим возник вопрос контроля версий. Чтобы делать все по-человечески, отслеживать изменения. Но не могу понять как к этому подойти. Что сделать сначала? Как начать работать с гитом? Как потом из Гита на продакшн разворачивать?
Не мог бы кто-нибудь мне подсказать?
Просто ставишь гит и открываешь мануал по нему, там две с половиной интуитивные команды.
Это то есть ты если что то сломаешь и забудешь как было тогда не сможешь пофиксить? Проиграл
Смотри, если ты только начинаешь работать с системами контроля версий, то я советую выбрать GitHub (Да, я хорошо осведомлён о том, что он сейчас принадлежит Microsoft, в нём есть анальная слежка и вообще всё плохо.). Соответственно хостинг уже выбран, а значит выбрана система контроля версий Git.
Далее установи себе GitHub Desktop с официального сайта. А в установщике Visual Studio в разделе дополнительных компонентов убедись, что стоит галочка "Git для Windows".
Теперь действуй так:
1. Создавай решение и проект Visual Studio, где тебе удобно на локальном диске. Во время создания проекта поставь галочку "Включить в систему контроля версий Git";
На этом этапе Visual Studio создать тебе проект и инициализирует локальный репозиторий вместе с файлом игнорирования .gitignore.
2. Далее ты можешь управлять своим локальным репозиторием непосредственно из обозревателя решений Visual Studio, но так и через GitHub Desktop (и последнее я считаю удобнее).
3. Поэтому запускай GitHub Desktop и там найди пункт меню "Add local repository" ("Добавить локальный репозиторий"). И укажи путь в корень той папки, где у тебя лежит файл решения твоего проекта (это который имеет расширение .Sln).
4. Теперь вверху окна открой список веток (Branch) и создай новую с именем "development". В программных кодах своего проекта делай именения с коммитами в эту ветку.
Расписывать тут можно ещё дальше поэтому, если тебе действительно это нужно, то можешь обратиться с вопросами мне в телегу. (Зловещий Дед)
Привет тебе)
В Xamarin с мобильной всё как-то не очень. Есть и положительные моменты, но больше отрицательных на мой взгляд.
Я так понимаю, что ты хочешь иметь один проект для обоих платформ iOS и Android, если выбирал Xamarin. И далее вижу, что тебе понравился Vue.js. В таком случае я советую ознакомиться с Vue-Native тут https://vue-native.io
https://git-scm.com/book/ru/v2
Хотя бы глазами пробежаться стоит, понять, что такое ветки. А в остальном тебе анон прекрасно расписал
>>699667
На работе локальный гитлаб поднят. В одной программе используются dll от какой-то левой библиотеки, которые сами не установятся при dotnet restore. Решили проблему в лоб – просто поправили gitignore, и теперь проект заливается на гитлаб с dll. Но коммит почему-то горит красным. Кажется, "commit failed" пишет. Но при клонировании все выгружается как положено. Что это может быть? И какой был оптимальный способ?
>На работе локальный гитлаб поднят. В одной программе используются dll от какой-то левой библиотеки, которые сами не установятся при dotnet restore. Решили проблему в лоб – просто поправили gitignore, и теперь проект заливается на гитлаб с dll. Но коммит почему-то горит красным. Кажется, "commit failed" пишет. Но при клонировании все выгружается как положено. Что это может быть? И какой был оптимальный способ?
Тут можно несколькими путями пойти же.
Если уже существует репозиторий с такой зависимостью, то можно использовать git submodule.
Ещё можно написать свой скрипт развёртывания для конечных машин, где перед dotnet restore какой-нибудь условный Wget или Curl будет качать зависимости.
Мне нужно динамически по нажатию на кнопку добавлять "строку элементов" (насколько я понял лучше всего в stackpanel) по типу "текстбокс/кнопка/текстбокс". Как это реализовать лучше всего? Во что "завернуть" мне строку?
Вот дебил
Вот мое выражение ебаное и оно не хочет работать совсем кидаясь System.ArgumentException: Expression of type 'System.Linq.IOrderedQueryable`1[Comment]' cannot be used for return type 'System.Linq.IOrderedEnumerable`1[Comment]'
await blogs
.Include(b => b.Comments
.OrderBy(c => c.Date)
)
.OrderBy(b =>b.Comments.Last().Date)
.Skip(BLOGS_ON_PAGE * page)
.Take(BLOGS_ON_PAGE )
.ToListAsync()
Какая разница? У блога есть Id, у комментариев есть BlogId, 1 к многим. Две таблицы - комментарии и блоги.
Аноны, как пофиксить :
the type or namespace name 'windows' does not exist in the namespace 'system'
Интернеты советуют добавить reference System.Windows.Forms, но такого нет. Есть System.Windows.Forms.DataVisualization и System.Windows.Forms.DataVisualization.Design, просто System.Windows.Forms нет.
Да я помоему все описал. С текстбоксов нужно будет считывать значения, а кнопка в строке должна удалять эту строку (кнопка "х"). Пока что нагуглил что-то подобное https://overcoder.net/q/1006835/динамическое-добавление-элементов-в-пользовательский-интерфейс-в-c , но мне походу нужно будет это как-то перепердолить под mvvm.
Можно как-то без задней мысли создавать класс с полями элементов, потом коллекцию этого класса в вью модели прибиндить в листвью (или чему лучше?)? Алсо нужно еще заранее выровнять эти элементы, т.е. размер такой строки элементов и самих элементов - статический.
В этих ваших тырнетах пишут что пытаться достучаться к элементу view через viewmodel напрямую, а не через биндинг - это хуевая практика и вообще типа нихуя уже не mvvm.
Хорошо, теперь объясните - как мне тогда динамически добавлять/удалять эти самые элементы, ведь по идее это должно быть в viewmodel?
Вот есть код типа пикрил, как его можно реализовать в viewmodel без задней мысли? Можно конечно при ините viewmodel отправлять в конструктор текущую view (this), но тогда назревает вопрос - нахуя нужны биндинги?
<ItemsControl
<ItemsControl.ItemTemplate>
<DataTemplate>
<Grid>
При попытке завернуть над гридом - на каждый грид появляется свой скролл. При попытке завернуть itemsControl либо же в Scrollviwer+Grid/Dockpanel - он какбэ есть, но он нихуя не работает.
Так я не хочу в память грузить всю эту дрисню( хочу элегантный простой запрос чтобы он шел в базе
Не скажу где у тебя затык, но вот вижу 1 явную логическую проблему.
.OrderBy(c => c.Date)
)
.OrderBy(b =>b.Comments.Last().Date)
Второй должен быть ThenBy() иначе у тебя первая сортировка не работает.
Может быть имеет смысл использовать DataTemplate и ItemTemplate? Там можно будет сделать привязку данных к коллекции, а по нажатию на кнопку в этой коллекции создавать объект. А данные сами добавятся в твой ListBox.
Вот тут почитай: https://metanit.com/sharp/wpf/14.3.php
Я тут в треде выше бомбил из-за Last() и TakeLast() которые не работают для IQueryable. Плюс вызывает сомненеие сортировка для инклюда, но тут я не уверен. Я б сделал тип такого:
await blogs
.OrderBy(b=>b.Comments.Max(c=>Date))
.Skip(BLOGS_ON_PAGE * page)
.Take(BLOGS_ON_PAGE )
.Include(b=>b.Comments) //если надо явно загрузить комметнты
.ToListAsync()
Анон, извини только увидел твоё сообщение.
Да, System.Windows там есть!
Но почему то Microsoft Visual Studio не видит эти файлы.
>Интернеты советуют добавить reference System.Windows.Forms, но такого нет
>Да, System.Windows там есть!
Ну вто его и добавь в референсы. И ты так и не ответил что за тип проекта ты создал.
Десктопный чат (desktop chat c# поисковый запрос).
Судя по гитхабу это тоже вкатывальщик его делал, возможно, даже из этого треда.
да
Не совсем понял что надо сделать.. Если запустить проект через консоль - то вот это. Никаких дополнительных логов не пишет, просто браузер выдаёт ошибку 405. Не на весь код. Многое в проекте работает. Но на некоторые вещи вылетает ошибка. Вроде как они все на одной странице находятся, что интересно.
>Зачем ты в половине мест закрасил, то что ты Шевченко? Если шифруешься, то надо было все закрашивать.
Торопился, хотел везде. Ну так то мне похуй на анонимность, но тут так принято. Начнётся ололо, мы тебя спалили. Точнее началось.
>По-моему самое время начать пользоваться гитом.
Было б неплохо, но инет на работе гавно. Половина сервисов работают через жопу
p.s. https://docs.microsoft.com/en-us/aspnet/web-api/overview/testing-and-debugging/troubleshooting-http-405-errors-after-publishing-web-api-applications
p.p.s. Может с маршрутами где-то наебался?
Блять нашёл ошибку. Не закрыл тэг <div> на странице. Сука, вот кто мог знать, что с этого такая ошибка может быть?
Это еще хуйня. У меня когда-то бот в телеграме лежал полтора дня - сервер работает, а в телегу ничего не приходит. Оказалось что я проебался с вставкой ссылки и у меня вместо http было https.
Тоесть наоборот.
От души братишка
Попробуй копировать по пикселю.
Попробуй Jetbrains Resharper, у него неплохой статический анализатор. Или же установи Jetbrains Rider и пиши в нём.
Класс Bitmap покакатит. Бери матрицу пикселей и дели её, как тебе надо.
Как в WPF текстбоксе сделать инпут только интовых чисел? Мне нужно чтобы можно было вводить и отрицательные числа, все упирается в "-" в начале строки. Я думал это платиновый реквест - а в тырнете нихуя нету нормального решения, я в ахуе.
Можно свой валидатор написать или конвертер, в котором ты будешь пытаться привести строковое значение к числовому и в зависимости от этого давать предупреждение.
В общем, гугли в сторону валидации ввода.
Задача крайне примитивная и я не верю что ты не нашел ее в гугле.
<TextBox PreviewTextInput="Preview"></TextBox>
https://pastebin.com/sRhKht8a
>не верю что ты не нашел ее в гугле
Нашел разные вариации по типу только плюсовые или минусовые значение, нашел с не целыми числами, нашел что-то с регулярками.
Спасибо, только единственное что твое решение не инпутит "-" если в текстбоксе что-то есть.
Не быть тебе походу программистом.
Я лишь показал тебе пример как можно, как правильно я не знаю потому что дел с wpf не имел практически вообще.
Но посмотрев быстренько свойства что мне доступны я моментально нашел решение.
https://pastebin.com/xpBwVn84
Сама эта dll-ка подключена и всё хорошо работает, так же добавлена в сборку
Желательно, что-нибудь самое простое, лучше вообще с конструкторами типа вордпресса, которые еще подпиливать можно под свои нужды, только под шарп.
Нужно запилить логику работы с дб/ентити в отдельную либу. Есть один метод который возвращает записи с бд (IQueryable<T>). При попытке получить (в мейн коде) уже с полученного (с метода либы) IQueryable<T> записи или count прилетает в ебало само собой эксепшн - datacontext has been (ясен хуй) disposed.
Можно конвертнуть его как-то во что-то явное/человеческое, без енумераторов там или я долбаеб?
> нужно скомпилировать в один exe.
Еще один свидетель церкви одна программа - один файл? Кор вроде может в один файл все запихать.
>делать при помощи csc но меня шлют нахуй
И правильно. csc ничего не знает про проекты студии. Ему надо ручками все референсы скармливать.
>>704817
>был ASP.NET
Ну раз делаешь новый проекь, то ASP Net Core.
>Желательно, что-нибудь самое простое
Ну можешь с Razor Pages начать.
> лучше вообще с конструкторами типа вордпресса
Тогда ты не по адресу.
Ты хоть одну книгу прочитал? У тебя вопросы ппц тупые. Тебе надо выполнить запрос, т.е. воспользоваться ToArray/ToList/ToEnumerable и т.д.
А, точно, спасибо, я забыл совсем.
Мне не нужны все эти контролы, вью, модели, роуты, нужно буквально скрафтить 1 страницу с лейблой, подгружаемой с бд табличкой, текстбоксом и кнопкой, даже без верстки.
>asp.net mvc
>не нужны все эти контролы, вью, модели
Кек.
>1 страницу с лейблой, подгружаемой с бд табличкой, текстбоксом и кнопкой
Бери Razor Pages и в учебнике мсдн/на метаните как раз на таком примере объясняется что к чему.
Какой подобный аналог есть у wpf, чтобы можно было загрузить лист класса с n полей?
> На winform'ax был такй контрол назывался - data что-то там. Ему можно было скормить таблицы, списки и т.д. и он их автоматически подгружал.
Datagrid
> Какой подобный аналог есть у wpf, чтобы можно было загрузить лист класса с n полей?
Datagrid
Да, оно, спасибо. Просто я не кодил 10 тысяч лет.
Сап двач, изучаю наследование, сделал всё по видео https://www.youtube.com/watch?v=IF7YRBokJAw
но у меня пишет ошибки, я не понимаю что не так
https://dotnetfiddle.net/eydbBO
Я просто хочу разобраться чем у меня отличается код от того, что на видео
дак жиза же. Все, кто помимо меня отписал - правы. Сначала # за час, потом резюме на почте HR с фразой - "Работаю за еду или бесплатно". И да, # это не JS, где зная основные механизмы языков программирования (что и дает Гоша, просто переписывает под синтаксис языка) можно интуитивно разобраться. В # нужен углубленный подход к изучению.
Геймдев - это еще пиздецовей, чем # интерпрайза. Тебе помимо общей логики, нескончаемой дрочки ООП нужны будут применения тригонометрии, физики и прочего (если ты не Unity-constructor clown).
Хочешь # - начни хотя бы с мутанита, этот ресурс даже дауны осилят.
А тебе спасибо. Единственный адекват в треде
У него пригорело от собственной ущербности.
static void Main(string[] args)
во всех уроках это тупо пропускают, мол, вот блять вы потом поймете что это это блять пока знать не надо
Это метод который является точкой начала выполнения твоего консольного приложения.
> string[] args
Аргументы командной строки которые ты можешь передать при запуске своего приложения.
спасибо, что вообще ответили, все равно тяжело вникаю, ну не могу продолжать когда не понимаю что и для чего, может ли это объявляться как-то иначе, я именно про string[]args
по отдельности я вижу тут string - строка, [] массив и args щито? а вместе вообще не понятно
Вся суть уроков по ютубу - долбоеб не может отличить тип аргумента от его названия.
Бери книгу Троелсена и читай её, зачем ты своё время тратишь на хуйню?
что по твоему без метода Main работает? Интересно почитать
Ты путаешь "делает за тебя" и "можно без него".
точка входа - это в первую очередь команда CLI и похуй как ты ее назовешь, если будешь свое говно клепать. Дефолт - это Main, открытие контекста выполнения приложения с последующей передачей CLI команды на ассемблирование сборки. Так что нечего тут выебываться
вообще бредовый вопрос от того человека, который начал спрашивать про этот main
а что насчет unity там как это все? там вообще есть точка входа или..ладно, пойду я нахуй тупой я дебил спать ((
Приведи пример "не всегда main"
Дай угадаю. Потому что ты макака привыкшая к вин формочкам, у которой от одного вида XAML начинаются нервные судороги?
Да ты заебал со своим вордпрессом
720x900, 0:10
Дано: нужно менять интерфейс из другого потока. Если использовать простой Invoke, то он блокирует поток до окончания своего выполнения,что может быть не очень хорошо, ведь интерфейс может подлагивать, насколько я понимаю. Окей, можно использовать BeginInvoke, который работает асинхронно и его не нужно ждать, но возникает вопрос: если я вызову сразу 2-3-4-...10 BeginInvoke подряд, они будут выполняться подряд, или существует вероятность, что более поздний вызванный BeginInvoke выполнится раньше, чем более ранний? Если да, то вариант пилить отдельный поток, который по команде будет выполнять простые Invoke - хорошее решение?
Зависит от того, насколько знаешь шарп. Если уже писал что-то кроме хэллоувордов, то через неделю можно высрать первый сайт на разорпагесах (наверно и за пару дней можно, я изучаю программирование паралельно моей не ИТ работе). Если только знаком с синтаксисом, то хз, наверно на петухоне проще. Но в любом случае еще надо знание хтмл/жс/ксс.
>>706589
Зачем тебе в 2020 BeginInvoke? Юзай async/await.
>пилить отдельный поток, который по команде будет выполнять простые Invoke - хорошее решение
Нет.
При Invoke у тебя блокируется вызывающий функцию поток, а не основной поток который будет выполнять то что ты ему через Invoke передаешь (если ты конечно не долбоеб, который Invoke вызывает из основного потока, что вообще приведёт к его дедлоку).
Если вызывать BeginInvoke из разных потоков, то выполняться они будут в порядке добавления, но как этот порядок добавления будет происходить ты не знаешь, а если знаешь, значит контролируешь вызывающие потоки отдельно. В общем, ты понял правильно и если важен порядок выполнение, то тебе этот порядок нужно контролировать самому.
>Если да, то вариант пилить отдельный поток, который по команде будет выполнять простые Invoke - хорошее решение?
Нет. Плодить потоки ради вызова Invoke это плохоее решение, тебе нужно синхронизировать нужную часть и делать вызовы из потоков которые либо обрабатывают результаты обработки информации, либо совершаю обработку этой информации.
Допустим, у тебя есть 3 задачи, которые требуют отдельных потоков, но при этом тебе нужно обновлять интерфейс в последовательном порядке, тогда ты на каждую задачу создаешь свой Task, добавляешь их в список, после чего используешь цикл в котором ждёшь Task.WhenAny до тех пор пока все задачи не выполнятся, в цикле проверяешь какая именно задача выполнилась, убираешь её из списка, если эта задача должна обновлять интерфейс первой, значит вызываешь BeginInvoke, если второй или третьей, значит добавляешь её в массив, в котором индексы это порядок выполнения задач и ничего не делаешь.
Выполняется еще одна задача, убираешь её из списка задач, проверяешь какой по счету эта задача должна выполниться. Допустим, что первым выполнилась вторая задача, а второй первая, значит у тебя в массиве заполнены первые два индекса, значит выполняешь каждую, из этих задач последовательно при помощи BeginInvoke.
Ну и т. д.
На разоре, наверно. Но на 99% это одна хуйня.
Та кмон.
Хочешь я взамен фото блинчиков со сгущенкой скину?
Или оладушков домашних?
Помоги пожалуйста.
var givenTenNumbers = new[] {5,9,1,3,7,4,0,6,8,2};
var result = givenTenNumbers[0] * givenTenNumbers[givenTenNumbers.Length - 1];
Жду к 20-00 на ул Пушкина за домом Колотушкина
Вы все дураки и гомосеки, мне нужно было буквально вот это видео https://www.youtube.com/watch?v=y8iUJXaObGY .
Держу вкурсе.
Ты дурак или гомосек? Я запостил после того как уже все сделал.
>А в C# 9.0 вообще новая веха наступает когда можно писать код не только быстрый, но и с 0 аллокацией памяти.
Изобрели то, что в нормальных языках вроде C++ было в 70-х? >_<
Сап, есть такой вопрос.
using(var client = httpClient()) {
var responseMessage = client.sendAsync();
}
responseMessage.ReadAsStringAsync()
Не будет ли проблем из-за того что я читаю содержимое после dispose у httpClient?
Здравый смысл подсказывает что так делать нельзя, но на удивление не падает.
Ответы с сервера ввиде json, стримов там нет.
Есть объективные причины по которым нужно иметь возможность возвращать responseMessage, но при этом не держать клиент открытым
Код в твоём посте не будет работать, потому что responseMessage объявляется вне контекста в котором ты обращаешься к нему. Это раз.
И два, если присвоить переменной responseMessage возвращаемое значение client.SendAsync, то никакого отношения оно к этому клиенту уже иметь не будет, у него тоже есть свой Dispose, который нужно вызывать.
аргументируй
>Код в твоём посте не будет работать, потому что responseMessage объявляется вне контекста в котором ты обращаешься к нему. Это раз.
По-моему вполне очевидно что суть вопроса не в этом
>>707218
>>707218
>то никакого отношения оно к этому клиенту уже иметь не будет, у него тоже есть свой Dispose, который нужно вызывать.
Где это про почитать, я ничего не нашел
Проехали, добрался до компа, протестил действительно dispose у httpclient не влияет
Диспоузить HttpClient и создавать новый не самая лучшая идея. Алсо не забывай await'ить таски.
>Где это про почитать, я ничего не нашел
Про что про это, блять. Вся тупость твоего вопроса заключается в том, что ты связываешь две разных переменных.
Это тоже самое, что написать:
int x = someObject.GetInt();
и после:
someObject.Dispose();
Спрашивать как это повлияет на int x.
> System.Data.SqlClient.SqlException: Cannot attach the file dbname.mdf as database dbname.
На стаковерфлоу в закрепе решение
> Ну короче бля хуй знает, баг воркграунда.
https://stackoverflow.com/questions/17012839/cannot-attach-the-file-mdf-as-database
Все что ниже вроде перепробовал.
Может кто фиксил подобное?
По гайдам пытался, никак не выходит
DeleteCommand="DELETE `IP_PC`, `Name_PC`, `MacAD_PC`, `Notice_PC`, `Domain_PC`, `General_ID` FROM `LocalPC`" Работает, но удаляет всю таблицу, а хотелось бы только одну строку
UpdateCommand="UPDATE `IP_PC`, `Name_PC`, `MacAD_PC`, `Notice_PC`, `Domain_PC`, `General_ID` FROM `LocalPC`" править дает, при обновлении выдает ошибку
Спасайте, что делать?
Анон, я разобрался со своей проблемой
Я предполагаю, что ты знающий
Подскажешь, как мне сделать обновление данных на gridview, после того как я в ней данные удалил/изменил
Данные изменились по кнопке в БД, но он показывает все еще старые на gridview
Я не сильно знающий и ковырял grid давно, мало того слабо понял твой реквест. Если тебе нужно апдейтить бд после изменения значений в гриде то вангую что тебе нужно гуглить и реализовать ивенты грида что-то вроде cellchanged или как-то так.
Или еще можешь сделать по тупому - реализовать отдельную форму/место для инсерта/апдейта/делейта где есть например текстбокс где юзверь вводит айди конкретной записи (или скролит грид+ивент onclick по записи) и условная кнопка делейт на которой уже вся логика работы с бд.
Надо повесить лямбду на ивент
Я из с++ вктатываюсь, по шарпу читал что-то года 3 назад, пытаюсь вспомнить теперь
То есть не WPF, a windows forms
Не понимаю в чем проблема. Получил данные из БД. Произвел биндинг модели к твоему датагриду, при изменении значения поля, данные объекта будут так же изменены если биндинг двухсторонний. Если ты не выключал трекинг, то после сохранения изменений, в БД все само обновиться.
1. switch - просто на каждый запрос ебашим case в котором задаем обработчик.
2. словарь - ключ - тип запроса, значение - обработчик.
Вроде как второй вариант мне больше нравится по причине того, что обращение довольно простым будет, типа если этот запрос есть в словарике - попробуй обработать, если нет - верни ошибку. Да и нет switch'а, который понижает читаемость кода. Что думаете, шарпаны?
Гугли chain of responsibility
Вешаешь на самый верхний элемент обработчик PreviewGiveFeedback и в нём можешь менять вид элемента, в котором принимается элемент
можешь показать на скринах как это работает? я просто в xaml нихуя не понимаю еще, какие-то биндинги хуиндинги, не ебу
вкатывайся в хачкель
Как понять на каком я уровне и какую книгу по шарпам начинать читать/какие видео смотреть. Ведь какие-то фундаментальные вещи по типу массивов, переменных и т.д я и так знаю, а более глубокие вещи и дотнет релейтед штуки нет. С чего стартовать чтобы на летних каникулах как следует обмазаться?
С троелсона начни.
Нет. Сейчас толко ФП.
Троелсен для старта, потом Рихтер для углубленных знаний. Сразу скажу, у Рихтера очень душное начало, которое будет интересно разве что интрпрайз петухам, но в целом книга действительно годная. Раздел про многопоточность и асинхронность самые топовые из всей шарп литературы.
Да, начало душное пизда. Интересно только через год-два вернуться и почитать про это все
Что майки движутся в правильном направлении, не нравится только их желание привлечь макак, которое привело к неявному main и коду как в жопаскрипте/петухоне. По мне так лучше бы на что то другое время потратили, например, поддержки socks прокси до сих пор нет.
что есть годного на сишарпе для машинного обучения?
пока нагуглил только ML.net, но что-то отзывы слишком неоднозначные
Не, так же реквесты не принимает нихуя. Забыл сказать, что пробую все запустить под Linux'ом, как обычно наебалово, короче.
public static class Zalupa{
public static Koncha[] ZdelauConchu(int KakMnogoKonchiNado) => new Koncha[100];
}
Это же очень удобно. Удобнее чем сделать:
public class Zalupa{
public Koncha[] ZdelauConchu(int KakMnogoKonchiNado) => new Koncha[100];
}
Просто потому что чтобы из другого места кода получить много-много кончи, мне не нужно ебучий объект смоздавать, я могу сделать таск и продуцировать сколько хочу кончи асинхронно, и вообще обмазаться ей с ног до головы. При этом и ошибки искать легче, я сразу могу понять в каком классе и из-за чего что-то наебнулось, я не боюсь что сборщик мусора удалит мой объкет, либо что я забуду удалить какой-то и он будет висеть там хуй пойми сколько, просто из-за того что я не отписался от события.
В общем, одни плюсы. Структуры и статичные классы - свет и процветание, обычные классы - тьма и упадок.
Типа проверяй папочку каждую минуту и если появился файл, то сделай то-то.
Зайди на сайт раз в 5 минут и скачай то-то.
Встал вопрос в том как правильно реализовать эту периодичность?
Пока что есть идея в том что отдельный бесконечный поток который бегает по моим задачкам и проверяет время, а в конце цикла Thread.Sleep(1). Но я не совсем уверен что так делать правильно, какие есть варианты и как вообще подобное делается в настоящих программах?
Асинк авейт
таймер
Делаешь проект типа воркер. Там будет создан класс наследуемый от бекграунд сервиса. Этому сервису реализуешь метод ExecuteAsync. Внутри просто бесконечный цикл, в конце которого await Task.Delay(переодичность выполнения этого самого воркера). Довольно просто и должно работать даже на линуксах, правда я не проверял.
Чтобы оно висело в трее, можешь добавить дополнительно всяких приблуд, но я бы просто добавил приложение в список сервисов и либо поставил в автозагрузку, либо коротенький скриптик для запуска сделал.
Ну, я пошел. И всем насрать, говорят: "Чел, оно ж работает, ты это, новые фитчи давай делай, а код, как-нибудь потом отрефакторишь".
Никаких кодревью. Никаких советов от старших коллег. Буквально: Дали компьютер со студией, дали проект, сказали - делай.
Так везде? Так и должно быть? Почему постоянно слышу в интернете про эти кодревью, про то как дядьки бьют по рукам за говнокод и в этом духе, но уже третье место и ничего такого нет, просто делай.
Как быть? Что делать? Я просто без какого-то фидбека начинаю галюцинировать и мне кажется что я все неправильно делаю, потому начинаю переделывать то что уже сделал, хотя оно работает нормально, но мне кажется что я что-то сделал не так, потому лучше создам новый проект и быстро перепишу так как надо, но только я его написал так как считаю что надо, начинаю что-то добавлять, все вроде идет норм, но потом понимаю, что что-то мне не нравится и по кругу ебаному. И выходит что я отдаю проект в виде, в котором мне не нравится, но всем похуй, его отправили куда-то, там протестировали, прислали заключение что все заебись и сказали делать другой. Я же так ебнусь нахуй, либо начну забивать на все и буду ебашить как попало, ведь всем плевать же, почему мне должно быть не?
А без легаси дерьма вида BeginExecute никак не обойтись? Какой фреймворк тогда пиши.
Алсо, проиграл с AsyncQuery, какой это нахуй асунк, если у них тред в конце блокируется? Код будет выполняться быстрее, если убрать часть с BeginExecute.
>>711272
Это для работы с OData. На .net core 3.1 пилю. Так даже майкрософт в своих примерах просто sleep делает. https://docs.microsoft.com/en-us/odata/client/async-operations
Так тебе же ниже написали тоже самое, только с использованием async и await
И Thread.Sleep там вставлено для того чтобы тот кто хочет прогнать код у себя, смог увидеть вывод в консоль результата асинхронного вызова, а не в качестве примера того, как делать если тебе нужно дождаться выполнения задачи.
>>711322
Код перенес к себе. Я не знаю, что там курят создатели этих классов в .net для работы с odata, но нервы мне потрепали знатно. Те классы почти ни с чем работать не умеют.
В итоге сделал через TaskFactory:
var tfc = new TaskFactory<IEnumerable<Название_сущности>>();
IEnumerable<Название_сущности> items = (tfc.FromAsync(query.BeginExecute(null, null), query.EndExecute)).Result;
Делаешь цикл while(true), в нем все действия, дальше в конце итерации пишешь int i = 0; while(i > n) i++; где n это условное обозначение времени. К примеру n = 4677448096544 это где-то минута.
В случае чего, лет через 10 когда обновишь пекарню, поставишь в условии цикла (i > n*2) - очень удобно.
Да тупо делаешь на System.Drawing.Graphics, только двойную буфферизацию сделай, чтобы не мерцало. Для laba1 вполне подойдёт, ничего учить не надо толком, всё есть, вплоть до преобразований в однородных координатах.
Ну, я ж не для лабы делаю, а чтоб разобраться.
Зачем ты BeginExecute использовал, ты совсем отбитый и не понимаешь, что два кода на пикриле выдают совершенно одинаковый результат? Ты зачем-то приплёл не нужный TaskFactory, еще и поток заблочил в конце своим .Result
Пердолинг, sir. Думаю, он для Linux приложение делает.
MS server 2017. при установке все оставлял по умолчанию
и следом, что и куда писать если я хочу подключить к базе данных по локальной сети, при авторизации через SQL профиль (а не профиль виндовс)
> и следом, что и куда писать если я хочу подключить к базе данных по локальной сети, при авторизации через SQL профиль (а не профиль виндовс)
При установке sql сервера он должен был выдать месседбокс со строкой подключения которую ты должен был схоронить и вставить у себя в проекте. Гугли теперь как ее посмотреть.
Вроде через SQL Management Studio можно строку скопировать
У тебя слева открыт не SQLEXPRESS
У меня есть текстовый документ, где находятся слова, разделенные пробелом. Я спличу их и добавляю в массив, но при выводе в консоль вместо букв знаки вопроса. Это с кодировкой связано? Как фиксить?
вот така хуйня
>Это с кодировкой связано?
Да.
> Как фиксить?
У ReadAllText есть перегрузка, которая принимает кодировку. Если пишешь под FW (и если звезды будут благосклонны), то должно помочь Encoding.Default. Если пишешь под Core, то надо явно указать кодировку ISO 8859-1 (её нет в стандартной поставке и надо стянуть нугет пакет). Но это гадание на кофейной гуще, я не ебу что у тебя там за файл, так что сам смотри какая кодировка нужна.
>её нет в стандартной поставке и надо стянуть нугет пакет
Я только вкатываюсь, хз как это сделать, помоги пожалуйста
Пишу обычное консольное приложение(.NET Core)
>Если файл сам делаешь, то сохраняй сразу в utf8 и не мучай жопу. Все таки 21 век уже давно настал.
Спасибо, все работает!
Т. е. решарпер заставляет идти наперекор конвенции от майкрософтов, которые говорят, что свойства должны именоваться с заглавной буквы?
Вангую, что это свойство приватное, тогда должно быть с маленькой.
Вряд ли в jetbrains стали бы выдумывать какую-то хуйню.
Либо на уровне проекта кто-то внес своё васянское правило в конфиг форматтера.
Узнаешь после того как тебя попрут из теплого офиса и ты окажешься в пятерочке рядом с такими же паникерами.
В каком смысле пиздоболов? Я из глухой провинции, тут кодеров почти нет, а они все равно нужны и потому предпочитают откладывать сроки сдачи и отговаривать от увольнений, потому что поиск нового может на годы затянуться.
В смысле любителей попиздеть не о чём. Нахуй ты вообще в шарп тред с этим зашел?
Я перепутал просто.
Я вот подумал о двух решениях:
1. Я делаю конечный автомат с состояниями и метод не может быть вызван, пока состояние не сменится на какое-то.
2. Я создаю внутри класса очередь выполнения и при вызове просто добавляю нужный метод в очередь, а потом дополнительный класс обработчик, достает эти методы и выполняет.
И оба решения мне не нравятся. В первом случае я не совсем понимаю как мне дождаться нужного состояния(просто вызывающий-то кусок кода не знает о том, что внутри класса происходит, он просто передал параметры в метод и ждет результат). Во втором как результат моего обработчика очереди возвращать туда, откуда метод вызвали.
Я наверное совсем тупой. Извините.
Мьютекс не подойдёт?
Использовать нужно классы SemaphoreSlim, Interlocked, SpinWait и ReaderWriterLockSlim и тп, в зависимости от контекста. Эффективнее всего будет синхронизация при помощи interlocked, потом идут все что с приставкой слим, самые низкопроищводительные это монитор, мьютекс, авторезетивент и т. д.
https://docs.microsoft.com/en-us/dotnet/api/system.threading
Если из книг, то у Рихтера хороший раздел про многопоточность с примерами реализации. Советую его, но если лень читать, то документации хватит.
Еще присмотрись к
https://docs.microsoft.com/en-us/dotnet/api/system.collections.concurrent
Возможно тебе будет достаточно использовать тред-сейф коллекцию.
Спасибо, буду Рихтера дрочить.
Я много с шарпом работаю, но всегда обходился мьютексами и тред-сейф коллекциями, даже не знал, что в шарпе спинлоки есть и всякое такое.
https://ideone.com/jOHYql
Меня больше всего интересуют перегрузки методов со значениями по умолчанию, очень хочется от них избавиться. На читаемость кода плевать.
Интересует именно личный опыт использования, статей и обзоров я нашёл прям дохуя.
Вин формс же портанули под нет кор.
Вин формс - это просто обертка над вин апи
Юзаем на линуксе/маке нативный нет кор, а для винформс ставим вайн.
Я гений?
Так везде виртуалки ставь и говори, что у тебя кроссплатформенное приложение. Нахуй вообще эти кросплатформенные языки, да?
Пишу значит говнокод и столкнулся с такой херней после обработки исключений не могу прервать метод при помощи return. Подскажите в чем херня?
Метод должен возвращать тот тип, который указан в качестве возвращаемого в его сигнатуре. В твоём случае это тип int, а ты пытаешься просто выйти из метода не вернув ничего. Либо пиши return 1, либо меняй сигнатуру метода.
Выйти без возвращения чего-либо, можно только в методах которые помечены как ничего не возвращающие, т. е. методы с void в качестве возвращаемого типа.
Можно еще просто пробросить эксепшн в вызывающий код, написав throw; вместо return.
изучаю WPF.. читал metanit - них не запомнил, все вылетело из головы. Теперь пытаюсь изучать на практике (я только так могу - пока сам не начну делать - ничего не запоминаю)
короче, вот у меня есть базе данных SQL таблица с тремя столбцами и где-нибудь в 1к строк.
Теперь я хочу сделать окно, в котором бы сверху и снизу были элементы управления, а в центре выводилось содержимое этой таблицы
При этом содержимое не влезет в окошко, поэтому справа должна быть полоса прокрутки которая бы позволяла прокручивать это содержимое (плюс помню на метаните где-то было упоминания что для таких вещей надо делать динамическую загрузку чтобы оно не все из базы грузило, а только то что на экране.. но не помню как где и что)
Да-да, я знаю что тут DataGrid - а можно какой-нибудь пример именно такого? А то нахожу только примеры где область равна размеру окна (без полос прокрутки)
>читал metanit
Сочувствую.
>пока сам не начну делать - ничего не запоминаю
Любимые слова лентяев.
Бери книгу и читай. У Троелсена хороший раздел по WPF, как раз интеграция с базой данных идёт. То что тебе нужно.
Вот так чтобы "пакажити как, а я сделаю бля буду" не бывает.
Ожидаемо.
>Любимые слова лентяев.
тут другое - когда я ставлю задачу, начинаю гуглить решения, смотрю кто как делает - вот только тогда у меня оно в голове укладывается. А когда просто читаю книгу/стать/папер - оно сразу же забывается.
>>713676
>Вот так чтобы "пакажити как, а я сделаю бля буду" не бывает.
у меня бывает))) я раньше так на С++ прогал (в геймдев вкатывался во времена когда движков еще не было). по началу тоже нихрена не понимал вплоть до указателей и постоянно всех заебывал вопросами. А теперь мой самый любимый язык, с которым я вкатывался в геймдев. Но жизнь такая - писать надо на том, за что платят, поэтому пошел учить шарп.
>>713676
>как раз интеграция с базой данных идё
ну тут вопрос не про интеграцию с базой данных, а про возможность сделать прокрутку части экрана. Но сих пор не нашел примеров чтобы у людей она была. выводят три строчки из базы и всё.
весь рофл в том, что пока все пилили опен сорурс, мелкософты сидели на своем .NET, как на золотом яйце. И что то переседели. Я вообще хз, кто сейчас для проектных решений выбирает стэк кора и всех его прелестей, если сейчас есть альтернативы куда удобней, проще и дешевле, чем .NET
Кстати учат сейчас решетки студентота (задачи с формочками ака welcome back to past), так что да, его стоит учить. Да и в 9 версии ФП завезут, может взлетит
PhP - хоронят 10 лет, работают на нем по сей день
Java - хоронят 5 лет, работают на нем по сей день
C# - не хоронили, но уже не работают (кроме легаси, SOF и пары укуренных SA)
А нам откуда знать в чем ты нуждаешься?
Сейчас фронт не делается без фреймворков(рикт, вью, ангуляр)
Проще и дешевле – это какие, кроме ноды?
Ходил по собесам год назад работу к тому моменту уже нашел, шел просто ради опыта собеседований, рассказывал, что делал с помощью ASP.NET Core MVC. Интервьюер спросил, мол, а сколько я изучал эту хуйню. Я сказал, что неделю, и ещё 2-4 недели писал. Он крякнул: "Мда, а у нас джава. Со спрингом надо пару месяцев ебстись, прежде чем писать что-то"
Мне, к сожалению, придётся джаву учить, либо оттачивать навыки вротендера, потому что там, куда я хочу, дотнета мало
> как уебищно выглядит, назад в нулевые. WPF as it is
Ну VS норм выглядит. Это не отменяет того факта, что майки хуй ложили на впф
Не нужен. Но ты через некоторое время ты столкнешься с тем, что захочешь подключить скрипты на свою страницу. А потом изучишь какой-нибудь фронтенд фреймворк и будешь писать на asp не mvc, а api
Может, и нет. Мсдн у майков не SPA
Что за КМС и для чего он тебе? Попахивает вордпрессом и 1с
>Проще и дешевле
пыха, рор, тот же нод (привет JS-ерам, которые кроме Node бэка не видели). Если крупный проект - Kotlin сейчас взлетает, java и # врядли, разве что из за больше комьюнити
>Интервьюер спросил, мол, а сколько я изучал эту хуйню. Я сказал, что неделю, и ещё 2-4 недели писал
не знаю, что ты ему рассказал и что ты вкладываешь в понятие "учил". Т.е. ты за 1 неделю его знаешь от А до Я и готов выкатить на проект? Очень сомневаюсь, подводных камней очень много (которые перевыпилились новыми камнями с перехода на 2.2 и на 3+)
>Со спрингом надо пару месяцев ебстись, прежде чем писать что-то"
тоже индивидуально. Смотря какие задачи ставяться, как разраб решает проблему. Я лично никогда не писал на JS начал педалить реакт и на плевой хуйне, как Redux просидел ломая голову неделю (хотя это просто ебаный глобал стейт - переведя на C# - класс с набором констант покрытый ассесорами).
>куда я хочу, дотнета мало
я уже писал в этот тред, возможно в предыдущий - когда началась эпидемия - у нас сначало выкосили всех джунов, потом начали закрываться один проект за другим. В итоге я на бенче начал в React, сейчас так же пишу на нем. Не знаю, чем это все закончится и как себя поведет рынок, но # имо такой себе вариант для вката. Я думаю браться за изучение TypeScript/Kotlin, еще не определился
>как уебищно выглядит, назад в нулевые. WPF as it is
А при чём здесь WPF и автор-долбоеб из нулевых? Или ты когда пиксельную игру видишь, которая сделана с использованием юнити, тоже начинаешь кукарекать про то что юнити говно, игнорируя качество графики в каком-нибудь Escape from Tarkov?
Проиграл с этой аналитики. Ладно еще тайпскрипт куда не шло, потому что жопаскрипт монополист в вебе. Но сравнивать Котлин, который поддерживается говнокомпанией, которая уже забила на его развитие, а также жабу, которая погрязла в легаси и уже несколько лет не развивается с C# и .NET, который поддерживается IT гигантом и постоянно дополняется новыми возможностями, а также улучшается. Это либо быть умственно отсталым, либо совсем не понимать то, о чём говорить и судить обо всём по постам с двача.
>Котлин
>говнокомпания
>забила на его развитие
> C# и .NET, который поддерживается IT гигантом
фанаты мелкософта в треде?
парень, я тебе не хочу ничего доказывать, но всю ты пыль, что описал - никак не относиться к созданию и поддержке интерпрайз приложений. Рыночек решает - кому на чем писать. Рыночек сейчас стоит спиной к .NET- и вся работа сейчас - это легаси. Не спорю, возможно запускают новые проекты - у кого на галере сфежаки хотя бы от 2.2 версии - пишите, интересно почитать, что за стэк и какая сфера. У нас же (как я писал раньше) все .NET проекты уже упали с саппорта
Проснись, сычуша, ты серишь. На .NET вакансий всего в 2 раза меньше чем на твою жабу. При этом около 50% из вакансий ориентированы на .NET Core, в то время как жаба это в 99% случаев говноспринг который уже задыхается от легасиговна.
причем тут Java, если я писал выше, что с .NET пересел на React? Я еще раз повторяю, что никого ни в чем не убеждаю. Гуглите вакансии и аналируйте рынок. У меня все.
Вот смотрите есть метод:
public async Task<int> Foo(){
int a = 0;
while(true){
await Task.Yield();
a++;
if(a>100) break;
}
return a;
}
Вот.
Я вызываю эту функцию в двух местах.
Что там происходить-то будет? Сколько итераций будет сделано? И вообще. Просто мне вот кажется, что должно быть как-то так: a будет локальной копией и они никак не будут друг на друга влиять, будет просто 100 итераций. Вот. Но в голове все равно какая-то тупая мысль, что на самом деле это будет одна и та же функция и количество итераций - хуй пойми каким будет. Вот.
В общем, где почитать про это? Ну или объясните сами, если не сложно.
> при нажатии Ctrl+C
Стандартная комбинация для завершения консольного приложения
>завершается с ошибкой
Отсюда не видно что за ошибка. Воооооот.
>как правильно завершать программу, чтобы ошибка не вываливалась в консоль
Запустить под отладчиком. посмотреть что за ошибка и почему возникает, исправить.
>>714903
Тут не будет никаких отличий от синхронного кода. Каждый метод у тебя работает только со своими локальными переменными. Вооооооот.
> Отсюда не видно что за ошибка.
OperationCanceledException. Как я понимаю дело в том, что я ожидаю результата выполнения. Скажем запрашиваю данные из БД или вывожу их в консоль. Воооооот. Ну и Ctrl+C вызывает это самое исключение. А что делать чтобы его не было я не знаю((( Я пробовал и передавать в таск CancellationToken и свой делать из CancellationTokenSource. Все равно если с помощью Ctrl+C останавливать работу в конце будет эксепшн.
Попробуй запустить в релизе, а не под дебагом.
Реакт это же фронт. Фронт на клиенте. А нет – бекенд. Ты, блядь, с базой из реакта работаешь? Авторизацию на стороне клиента проводишь? Охуеть
Все фреймворки жабаскрипта окуколжены, джанга питоновская тоже.
>Реакт это же фронт. Фронт на клиенте. А нет – бекенд
Что за хуйню ты пишешь, дебил? Или у тебя клеймо решеток на жопе набито, что кроме .NET на других языках не пишешь?
> кроме .NET на других языках не пишешь?
Пишу. Дарт, js. Ну и хули
Го? Элексир? Пхп? Джанго? Зачем?
>>715144
Либо твой пользователь загружает бандл 4 мегабайта, либо ты с каждым пользователем поддерживаешь gRPC-коннект. Не вижу пути, по которому тут будут какие-то плюхи. Я рассчитывал, что сделают что-нибудь с xamarin, когда в роадмапе Blazor было заявлено, что в будущем можно будет делать мобилки. Но там такие оговорки, что интерфейс будет не с помощью HTML оформляться, а, значит, скорее всего все тот же XAML будет. Да и xamarin не спешат закапывать, ожидается его ребрендинг под названием MAUI
При компиляции проекта С в папку к нему копируются файлы из проекта А и Д, хотя везде в ProjectReference Private="False" т.е чтобы не копировало файлы в проект.
Как сделать так чтобы не копировало? Это какая-то проблема зависимостей, если добавить проекты А и Д в С, то копироваться ничего не будет, но это делать надо вручную так как в интерфейсы они указаны как добавленные.
Ситуацию осложняет то что я пилю кучу микропроектов которые имеют как бы наследование друг друга и хочу чтобы все было чистенько, но все портит компиляция.
Я могу придумать костыли, но хотелось бы нормальное решение, а не очередной костыль за который стыдно.
нахуй ты мне тогда пишешь, что React, этожи фронт? Да, пересел с .NET на фронта (был фулстэком). Ну и хули? Не будет работы на React, пойду туда, какой стэк понравится.
Я замечаю, что писька .NET-чиков такая маленькая, что ее только зацепи, сразу начинается вонь на пол треда
private Class _class;
public class { get => return _class; set => _class = value }
?
Чтобы даже тому, кто с сахарком не знаком все было сразу понятно.
Private больше похоже будто надо поставить на true
GUI.CS
Эм.. Ну так же как и при поиске во всем листе, только искать не во всем..
https://github.com/SteamRE/SteamKit/blob/master/Samples/1.Logon/Program.cs
Если ты шарпист, то тебе кроме того что такое ключи(чем первичные от внешних отличаются) и нормальные формы ничего особо знать не нужно. Ну и может быть как join делается и чем left от inner отличатся будет. В исключительном случае - как построить индекс. Все, блин.
Не совсем понимаю зачем он здесь и как его сюда присобачить
Прост))) Разницы-то особой в данном случае не будет, что тут я запустил тред в котором открыл песенку и проиграл, что там я бы создал таск, который бы открыл песенку и проиграл бы ее.
А вообще что мой пример, что решение того анона - бред. По факту будет создана куча объектов плеера, если чел просто начнет щелкать как не в себя, будет жутких грохот и сожрано куча памяти и процессорных ресурсов. Я ХЗ просто что там за цель у чела, если какая-то программа-прикол, то и так сойдет, если там что-то типа: включил типа фоновый звук, потом голосовую дорожку диктора, потом звуковые эффекты по клику, то так делать не надо.
>цель
Сделать что-то типа пианино, где каждая клавиша - button(1,2,3,etc), клик на который триггерит проигрывание аудиофайла(ноты?)
>сожрано куча памяти и процессорных ресурсов
Мне ясно что так будет, я хз просто как сделать это по другому, чтобы при этом клавиши не прерывали звук друг друга при нажатии
делай await task.run на кнопке
> Разницы-то особой в данном случае не будет
Так у тебя безусловно отдельный поток создастся, а с Task у тебя будут использоваться уже существующие, первое нажатие скорее всего синхронно выполниться.
Если это именно сорт оф пианино, то тебе надо бы не просто воспроизводить эти файлы, а производить операции со сложениями сигналов. Кстати в данном случае даже асинхронность не нужна будет, у тебя затухающие колебании, при нажатии клавиши ты просто производишь математические операции со звуковым буффером. Такие дела.
нит. я уже минимум восемь лет кодирую (из которых 5 - за зарплату)
ни одной книжки толком не прочитал, все через решение задач.
но тут надо новые технологии на новом другом языке
>фанаты мелкософта в треде?
ну хорошо, котлины, пыхапы - а что делать если нужно стартовать не очередной говномагазин в вебе, а серьезный корпоративный софт?
Который может:
- в базы данных
- в серьезные нагрузки сервера
- интеграцию с документооборотом (возможность из всевозможных доков и экселей собирать данные и выдавать в таком же виде)
- знать про облака для хранения больших массивов данных (сканов например)
- хорошо развертываться в пару кликов без установки ебучих фреймворков
- без велосипедства
а к джаве религиозная ненависть так как всегда бесило
Хочу создать массив данных (data) из файла состоящего из 2 колонок (ссылка и подпись). У data конструктор принимает в себя 2 строки - ссылку и подпись. Как это сделать на лету?
Код - https://codeshare.io/21Wqz0
Зааускаешь поток который будет считывать строки из файла и добавлячть их в ИммутаблДиктионери. Запускаешь два потока на чтение файла, один будет считывать от начала строки до первого пробела (разделителя колонок), другой от конца строки и до пробела (разделителя колонок). После считывания они добавляют результат в массив. Получится два ассоциативных массива, по одному на колонку, индексы в которых будут означать номера строк.
Если файл большой, то можно разбить его на нексолько частей и обрабатывать их отдельно, а потом сджоинить массивы.
Также можно преобразовать два массива в словарь, но по мне так это лишнее действие.
> Запускаешь два потока
Зойчем? Если один поток нашел раделитель, смысл второму делать ту же работу но сдругого конца?
Синхронизация потоков и передача информации о нахождении разделителя займет больше ресурсов и времени, чем поиск этого разделителя каждым потоком. Всё равно каждому потоку нужно будет доходить до этого разделителя.
Нет. Не надо ничего синхронизировать. Один поток справится за то же время что и 2. Потому что 2 потока будут делать у тебя в 2 раза больше работы.
4 МБ файл с 300к строк меньше чем за секунду разбирает таким макаром. Если тебе нужно больше, то наверное придется хитрее поступать, но ты ничего про скорость не говорил, потому буду считать, что и так норм.
Блядь, неправильно поля класса обозвал и перепутал ту порядок разбитых строк. И хуй с ним.
Да, для интереса, я чутка раздул файл. До 100МБ и почти 9 млн строк. ~7 секунд в релизе. Жрет памяти правда как не в себя(ну а хули, в лист-то пихаем, он достигает края и расширяется)
https://www.dropbox.com/s/brc1gbe1jgqys29/asd.7z?dl=0
Лололо, мну развели на бесплатную работу(((
Ты совсем тупенький? Два потока у меня будут независимы и разделят работу на 2.
Есть у тебя стрка вида
"аааааа<разделитель>ббббб"
Допустим перед и после разделителя в сумме 5к символов. Ты действильно настолько тупой и думаешь, что 1 поток справится с проходом 5к символов быстрее, чем 2 потока каждый из которых одновременно обходи (5к - длина разделителя + 1 (первый символ означающий начало разделителя)) / 2 символов?
Как и предпологалось. Ничего особо не меняя, просто выкинув стрингбилдер (хз, что ты пытался им сделать), выкинув псевдоасинхронность (рили зачем? у тебя один потокок который все равно ожидает чтение), ну и главное заменив сплит на индексоф (у нас же гарантировано по условию что два столбца всегда будут) можно неплохо забустить.
А может ты тупой? У анона 2 столбца, те разделитель один на строку. Так зачем его искать дважды, проходом с начала и с конца?
Уебище тупорылое, задача не найти разделитель, а считать всё что находится слева от него и справа от него. Ты проходишь по массиву байт, который представляют из себя символы, до тех пор пока не встретишь байт который представляет из себя символ-разделитель.
> хз, что ты пытался им сделать
Я не знаю кодировку предполагаемого файла, стрингбилдер умеет ее распознавать. Вдруг у анона там в КОИ-8 строки? Хуй знает.
> рили зачем? у тебя один потокок который все равно ожидает чтение
Это в данном случае. Я ХЗ куда тот анон это собирается впихивать. Может быть он решит 10 файлов одновременно читать. Лучше уж тогда будет асинхронно читать, а не создавать потоки под это дело.
> ну и главное заменив сплит на индексоф
Для удобочитаемости. Если разделителем будет два-три символа, придется либо переменную с его размером вводить, либо магические числа в коде использовать.
Ну и да, я вроде не говорил что я оптимальное в плане перформанса решение сделал, просто оно довольно приемлемое и быстрее, чем считать весь файл и пото уже его парсить.
Ты реально дебил или не хочешь признавать обсер? Найти нужный символ легчайшая задача, парсинг такой простой штуки будет ио баундед.
>мну развели на бесплатную работу(((
ты скилл так качаешь
раз ты решил сам решить задачу, значит где-то в подсознании ты еще сам 100% эту область не докачал и твоему подсознанию требуется еще немножко практики. К примеру хелловорды и любые примитивные для тебя вещи ты ни для кого писать не будешь.
-мимокрок
конечно, XAML тому подтверждение. Хотели сделать под десктоп и мобайл один синтаксис на XML, получилось говно говна, в котором и по сей день некоторые плавают
>>714765
>кукарекать
батя твой кукарекает, чухан. И я не говорил, что автор долбоеб, я говорю, что вьюшка выглядит, как в нулевых на Win98. На XAML можно запилить охуенный GUI, но не тому, кто кидал пику. Про юнити, хуюнити можешь мне не писать, на этом говне не пишу и не играю
Плохим считается любой костыль, который просто откладывает решение проблемы до тех пор, пока вся конструкция из костылей окончательно не развалиться и не сможет решить очередную возникшую проблему.
В данном случае partial это и есть тот самый костыль.
Если использовать его уместно, а это - для того чтобы разделить автогенерируемый код от написанного вручную, либо для того чтобы над классом могли работать несколько человек. То ничего плохого в этом нет.
Ну если ты такое нагуглить не можешь, то в силу интеллекта просто ничего не поймешь и не реализуешь, даже если тебе рассказать "как".
Вот одна из первых ссылок в гугле:
https://stackoverflow.com/questions/33538527/display-a-image-in-a-console-application/33652557
using System;
using System.Runtime.InteropServices;
class Program
{
const int STD_OUTPUT_HANDLE = -11;
const uint ENABLE_VIRTUAL_TERMINAL_PROCESSING = 4;
[DllImport("kernel32.dll", SetLastError = true)]
static extern IntPtr GetStdHandle(int nStdHandle);
[DllImport("kernel32.dll")]
static extern bool GetConsoleMode(IntPtr hConsoleHandle, out uint lpMode);
[DllImport("kernel32.dll")]
static extern bool SetConsoleMode(IntPtr hConsoleHandle, uint dwMode);
static void Main()
{
var handle = GetStdHandle(STD_OUTPUT_HANDLE);
uint mode;
GetConsoleMode(handle, out mode);
mode |= ENABLE_VIRTUAL_TERMINAL_PROCESSING;
SetConsoleMode(handle, mode);
const string UNDERLINE = "\x1B[4m";
const string RESET = "\x1B[0m";
Console.WriteLine("Some " + UNDERLINE + "underlined" + RESET + " text");
}
}
using System;
using System.Runtime.InteropServices;
class Program
{
const int STD_OUTPUT_HANDLE = -11;
const uint ENABLE_VIRTUAL_TERMINAL_PROCESSING = 4;
[DllImport("kernel32.dll", SetLastError = true)]
static extern IntPtr GetStdHandle(int nStdHandle);
[DllImport("kernel32.dll")]
static extern bool GetConsoleMode(IntPtr hConsoleHandle, out uint lpMode);
[DllImport("kernel32.dll")]
static extern bool SetConsoleMode(IntPtr hConsoleHandle, uint dwMode);
static void Main()
{
var handle = GetStdHandle(STD_OUTPUT_HANDLE);
uint mode;
GetConsoleMode(handle, out mode);
mode |= ENABLE_VIRTUAL_TERMINAL_PROCESSING;
SetConsoleMode(handle, mode);
const string UNDERLINE = "\x1B[4m";
const string RESET = "\x1B[0m";
Console.WriteLine("Some " + UNDERLINE + "underlined" + RESET + " text");
}
}
Если при парсинге нужна скорость и низкое потребление памяти, гугли System.IO.Pipelines и Span<T>.
>ты скилл так качаешь
у меня 12 тасков на моем проекте, хочешь свои скиллы прокачать? Эстимейт каждого - 3-4 часа, дедлайн - конец недели. ЗП мне, таски тебе - идет?
нужно написать для core 3.0 web api генератор refresh токенов. JwtBeawer - валидирует access токены. Методы контроллера покрыты атрибутом [Authorize]. Тригер метода на выдачу Refresh должен срабатывать после получение не валидного access с expire time 60m.
Выложи решение на гитхаб, если будет норм - скину еще
Сделаю за 4 часа, час — $50. Тесты пишу, код на модули разбиваю, коммиты делаю атомарными. Аванс — 50%. По рукам?
>DataTime.Now
ясно, иди нахуй
>>718542
>Аванс — 50%
и ты туда же
Кто там хотел таски поклепать - мне нужен тестовый проект с контроллерами, где по роутингу идет редирект от контроллера получающего упавший access, до реализации refresher-a. Refresh пишите какой угодно, все равно свои клеимсы буду пихать.
Тебе нужен результат работы того, кто качает скиллы, или того, кто знает что и как надо сделать, чтобы это потом работало и было сопровождаемо?
а это я после получения результата оценю. Не думаю, что увижу что то хуже кода джуна. Пусть на аутентификации скилы покачают, а я таск закрою (может быть)
Ты из ДС? Соснешь мне хуй? Как раз скилл минета покачаешь за бесплатно
$50/час - у меня индус будет за $5 работать, если буду все таски свои плавить ему
влень искать карманного индуса, который будет делать качественно работу. А тут на халяву готовы таски лепить. Что я теряю? Одни профитаны
я предлогал датчанину сапортить его проект на ASP.NET MVC5 + jquery/vanilla за половину от его рейта ($40/h), а ты тут за 50 толкаешь
Ну, я же не виноват, что ты себя так низко оцениваешь. Кстати, какая-то хуйня с твоим датчанином. $40/в час это какое-то дно для Дании (если он оттуда).
3.2k+ за ремоут мне бы хватило с головой. По поводу Дании - говорит нормальный рейт. Он себя называет фрилансером, хотя за всю жизнь (7 лет пишет) работал только на 3 проектах. И еще если его словят за передачу таска - йому пiзда.
По его словам - у них внутреняя мирка с закрытым рыночком. Т.е. если у них будет открыта вакансия (в Аартусе к примеру) и я им кину CV на английском, то с вероятностью в 95%, что меня пошлют нахуй.
Вообще он говорит, что с "нашим" братом связываются только жлобы. Why i'm not surprised?
РАБОТАЕШЬ В ОДНО ЛИЦО
@
ПИШЕШЬ С НУЛЯ КРИТИЧЕСКИ ВАЖНЫЙ ИНФРАСТРУКТУРНЫЙ СОФТ
@
УЖЕ ЗА ТРИДЦАТЬ
@
ПОЛУЧАЕШЬ 2.2$ ЗА ЧАС
@
НЕТ ДЕНЕГ НА РЕЛОКАЦИЮ ИЗ ДЫРЫ
@
ПО ЖИЗНИ СЫЧ НЕ УМЕЮЩИЙ СЕБЯ ПРОДАТЬ HR-МЕНЕДЖЕРАМ
@
ПОНИМАЕШЬ ЧТО ПОТРАЧЕНО
это у тебя $400 ЗП? Если это так и ты сам понимаешь, что делаешь важную работу - иди и требуй больше. Если нет - меняй работу.
Два чая и печеньки этому капиталисту.
> РАБОТАЕШЬ В ОДНО ЛИЦО
Сейм. Со старта в одного. Слова аджайл и скрам, а также софт-скиллы вызывают ночные кошмары и мочеиспускание
4,4$-24лвл-кун
да я вижу но я не понимаю что от меня хотят, у меня в вебконфиге даже нет таких строк
Файл конфигурации - открой файл, посмотри на 67 строчку (вангую, что тэг не закрыт)
Если нет такого - удали webconfig и посмотри - измениться ли ошибка
ладно, если кому-то надо будет, у меня асп нет было херово поставлен, после переустановки все заработало
Но есть одно но, я могу такую вот херабору как на первом скрине провести и оно не упадет с ошибкой и если я не прирываю цикл, оно не будет останавливаться. В M$ реализациях вылетает исключение, что коллекция была изменена. Как добиться такого же поведения? Ну, т.е. я не совсем понимаю, где я должен кидать исключение и как смотреть что моя хрень изменяется.
добавляешь в список поле version и увеличиваешь его при изменении листа, создаешь свой перечислитель, который принимает в качестве аргумента твой список, и у которого тоже будет поле version, которое при создании будет принимать значение переданного списка. Далее при перечислении будешь сравнивать version перечислителя с version листа и если они не равны, то бросать эксепшн.
Лойс этому подсматривателю в исходники.
В чем суть, на SQL я могу сделать что-то типа
SELECT id + 1
FROM mytable mo
WHERE NOT EXISTS
(
SELECT NULL
FROM mytable mi
WHERE mi.id = mo.id + 1
)
ORDER BY
id
LIMIT 1
и найду дырку или верну новый номер этому пользователю. И это работает быстро даже если записей довольное много(на, на 100к записей точно нормально работало). Вот, а вот на EF когда я делаю что-то типа:
var used = db.Set<User>().Select(x=>x.Num).Sort();
if(!used.Any())
return 1;
uint missing = used.First();
foreach(var n in used.Skip(1))
{
if(++missing!=n)
break;
}
return missing;
То уже при 1к записей жрется куча памяти. Я конечно могу делать это же таким же SQL-запросом, либо вынести это в хранимку и ее вызывать, но что-то мне кажется, что тащить эту логику в само приложение - не лучшая затея.
Не бейте ногами, если для шарпа это какая-то ординарная ситуация и я задал тупой вопрос, я просто 5 лет был отвечающим исключительно за БД и все это вот, но в ходе оптимизаций и реорганизаций, теперь я стал фуллстек девелопером и нихуя не понимаю, как на ваших шарпах все это делается.
В чем суть, на SQL я могу сделать что-то типа
SELECT id + 1
FROM mytable mo
WHERE NOT EXISTS
(
SELECT NULL
FROM mytable mi
WHERE mi.id = mo.id + 1
)
ORDER BY
id
LIMIT 1
и найду дырку или верну новый номер этому пользователю. И это работает быстро даже если записей довольное много(на, на 100к записей точно нормально работало). Вот, а вот на EF когда я делаю что-то типа:
var used = db.Set<User>().Select(x=>x.Num).Sort();
if(!used.Any())
return 1;
uint missing = used.First();
foreach(var n in used.Skip(1))
{
if(++missing!=n)
break;
}
return missing;
То уже при 1к записей жрется куча памяти. Я конечно могу делать это же таким же SQL-запросом, либо вынести это в хранимку и ее вызывать, но что-то мне кажется, что тащить эту логику в само приложение - не лучшая затея.
Не бейте ногами, если для шарпа это какая-то ординарная ситуация и я задал тупой вопрос, я просто 5 лет был отвечающим исключительно за БД и все это вот, но в ходе оптимизаций и реорганизаций, теперь я стал фуллстек девелопером и нихуя не понимаю, как на ваших шарпах все это делается.
var firstAvailableId = context
.Posts
.Select(p => p.ID + 1)
.Except(context.Posts.Select(p => p.ID))
.OrderBy(i => i)
.First();
Просто из интереса: а зачем тебе такая оптимизация? У тебя пропадает автоинкремент и увеличится время записи в базу. Или у тебя настолько частые операции записи и удаления пользователей, что ты точно знаешь, что 2ˆ64 на всех юзеров тебе точно не хватит? В противном случае это выглядит как лекарство, которое хуже болезни.
Ну смотри, я работаю в конторе которая умные штуки делает. Эти штуки надо регистрировать на сервере и периодически всякие данные читать и схоронять. Временами штуки выходят из строя и их нужно заменить. Вот. Заменять вручную ID не вариант, потому что пользователи ПО низкоквалифицированны, им надо чтобы включил и работало, а они только состояние отслеживали. Так вот, был случай когда из-за адреса таки кончились, правда тогда адресов было только 2^16, думали всем хватит, кек, конторка-то была маленькой, из-за этого куча хуйни произошла, было решено сначала до 32байт на адрес выделять, чтобы типа как ОйПи выглядело, но оказалось, что за 5 лет работы с высокими нагрузками и постоянными заменами устройств и этого может не хватать, тогда и прибегли к штуке с вклиниванием адреса для устройств, которые удалили. Вот. Недавно таки решили перейти на 64 битные адреса, но решили, что лучше таки этот костыль оставить, а то вдруг через 20 лет все наебнется, а все кодеры уже помрут к тому времени. Как-то так. Ну, т.е я понимаю, что 2^64 это типа ~18квинтилионов, что дохера, но хуй знает, может быть простоит эта вся хуйня еще 200 лет, устройства будут тот же протокол тащить(ну а хули, наша контора его в 90х придумала, а он все еще используется, кек, а TCP вообще из 80х и скорее всего пока интернет существует он будет основным протоколом), и по всей галактике расползутся, и тут все внезапно встанет. А так еще чутка поработает, пока до 128 бит не расширят адреса.
Просто все тут старые и решаем перестарховаться, потому что в прошлый раз когда новая партия устройств не могла зарегаться и нормально работать, т.к. адреса кончились, нас чуть не разогнали к хуям, потому что это был один из жирных заказчиков и как-бы планировалось долгое сотрудничество, а такие вот оказии как-то не хорошо влияют на репутацию.
Так добавляй используя тот sql который ты написал в примере "на sql я могу". В чем проблемв?
И зачем ты Skip(1) вызываешь, вместо обычного прохода по массиву? Очевидно, что он у тебя памяти жрать будет дохера, потому что каждый раз возвращает новую коллекцию - 1 элемент
>каждый раз возвращает новую коллекцию - 1 элемент
Чего? Skip создаст енумератор и форич пройдет по нему один раз. ХЗ что у него там память жрет, он конечно выгружает себе все Num из таблицы, но на 1к записей это все равно только ~8Кб.
В реальной таблице больше миллиона устройств и как я понимаю именно то что я выгружаю их как раз и жрет столько памяти. Просто, как я сказал уже, я на шарпы только недавно был пересажен, до этого я занимался исключительно SQL и сейчас просто пытаюсь разбираться как оно у вас устроено.
Пока не пробовал, потому что сегодня ж выходной, к прод базе доступа удаленно нет. В понедельник посмотрю.
Потому что ты еблан, пытается заполнить словарь в области описания класса?
Что, блядь, тебе мещало так сделать:
Dictionary<byte, string> items = new Dictionary<byte, string>
{
{1, "sword"},
{2, "zalupa"},
{3, "hui"}
}
Или вынести это в метод, скажем InitItemList()?
Нет, блядь, ты какую-то хуйню пишешь.
Ну ебанарот, ну записли минимальный код, воспроизводящий проблнмк, да напиши, что ты ожидаешь, а что есть на самом деле. Очень охуенно с твоих словесных описаний пытаться понять, что у тебя там за код.
Читай CLR via С# и его раздел про многопоточность. Если кратко описать различия, то таск это более интеллектуальный тред, который самостоятельно контролирует распределение процессорного времени и избавляет тебя от части работы по синхронизации потоков.
Ну вот. После того как я получаю данные от клиента, ожидание в методе ProcessSession почему-то оканчивается и начинается двигаться дальше к остановке сессии, потом мой делегат пытается отправить ответ киленту, и выскакивает ObjectDisposedException. Вооооот. Даааа.
Я понимаю, что скорее всего дело в том, что я еблан и пытаюсь ждать void, а это нельзя, но а как тогда сделать? Ну, а чего я хочу? Я хочу вынсти обработку соединения клиента в делегат, чтобы логику разную логику можно было реализовать не особо меняя мой класс. Вот. Да.
Таки да. Заменил обработчик с Action<Session> на Func<Session, Task> и заработало как надо. Другое дело, что как-то все равно непонятно. Тупенький я, наверное.
>>720998
Task.Run выполняется моментально, так как внутри его делегата асинхронная функция, которая просто запускается и возвращает контроль.
Заменив на Func<Session, Task> у тебя лямбда выражение стало неявно возвращать Task (если добавить фигурные скобки твоему Task.Run, то у тебя опять всё наебнется), поэтому await срабатывает именно на этот Task.
Но вообще это говнокод, так как Task.Run в данном случае не нужен, сразу пиши функцию которую ты зачем то засунул в этот Task.Run
Ну, я засунул ее в Task.Run, потому что как раз думал вот что: Task.Run возвращает Task -> обернув асинхронную функцию, я все еще смогу ее ждать. Оказывается не смогу. Вот. Да.
Сейчас оно так выглядит.
Заодно проверил. Вроде 1к клиентов подключились, отправили, получили ответ и отключились нормально. Теперь надо придумать, как какую-то более сложную обработку делать, скажем собрать из пришедших данных HTTP пакет и обработать запрос.
>обернув асинхронную функцию, я все еще смогу ее ждать
Для таких задач есть специальный класс - TaskCompletionSource, но это уже будет выглядеть костыльно и применять его нужно только там где без него действительно обойтись нельзя, например в какой-нибудь сложной цепочке вызовов, выполнение которой нужно ожидать в одном месте.
Вся суть чтобы не было боксинга, с боксингом это сделать легко.
>что тип через generic мы запрограммировать не можем, но на этапе компиляции нам о типе известно
С этого места по-подробнее
Тебе асинк метод возвращает горячую таску, ты нахуя её оборачиваешь еще в таску? Если ты любитель делать Task<Task<Task<Task<Task<Task<Task<int>>>>>>>, о да придется писать await await await await await await, но умственно здоровые люди так не пишут.
Есть методы в классе которые принимают структуры которые реализует интерфейс, но принимают для оптимизации они через ключевое слово in. Интерфейс лишь нужен для intellisense, потому что если приводить структуру к нему будет боксинг, ну и для связывание только необходимых мне методов.
Так вот в методе мы заранее знаем какой тип он хочет принять, но я хочу вызывать этот метод не напрямую, а через рефлексию.
Вся соль в том что у меня есть список классов в которых есть куча таких вот методов и при загрузки программы они анализируются через рефлексию и происходит связывание между типом структуры и этим методами (которые как бы их обработчики) и таким образом я хочу в любом месте программы создать структуру, затем вызвать на ней extension метод, который найдет все обработчики для этой структуры и вызовет для них методы.
Будет что-то типа new MyStruct(123).Send();
И тут все обработчики этой структуры вызовутся, при том я нигде не должен явно писать что за обработчики, просто пиши методы что принимают такие структуры, а оно само все будет работать.
Вся проблема в том что я не знаю как вызвать метод через рефлексию таким образом чтобы передать в него структуру по ссылке.
С боксингом и классами все легко, но хочу именно структуру по ссылке чтобы все это работало на стэке и не нагружало GC.
>>721288
>>721290
Там Generic используется, а я на этапе связывания имеют Type структуры в этом и проблема. Без понятия как на этом создать делегат нужного мне метода.
Конечно, все тупенькие, один ты умный. Даже в документации пишут:
>It is often useful to be able to return a Task from a Task<TResult>, where the inner Task represents work done as part of the outer Task<TResult>.
Но куда им, дуракам пишущим документации, до великого знатока с двача, верно?
> все это работало на стэке и не нагружало GC.
Смешно читать такое, когда речь о рефлексии идёт. Ты понимаешь, что боксинг в данном случае вызовет меньшую нагрузку, чем ебля с передачей его по ссылке через рефлексию для избежания этого боксинга?
Так ведь
>It is often useful to be able to
в чем у тебя useful? То что ты able to, не значит что тебе надо так делать. Напомню, на случай, если у тебя паамять хлебушка, то ты сказал буд-то при использовании асинхронных лямбд, надо будет писать цепочку эветов, что не так. ХЗ с чем ты спорить пытаешься.
>Лямбды тоже можно делать асинхронными
>И потом писать await await await
>Нет
Это нагрузка будет только при загрузке приложения, я же хочу получить не супер мега быструю загрузку, а быструю работу приложения.
У меня уже есть рабочее приложение с боксингом, но хочется сделать все по красоте иначе смысл в структурах теряется.
А я хочу написать event ориентированную систему которую не стыдно показать кому-то другому.
>в чем у тебя useful?
Где у меня, долбоеб? Ты настолько отбитый, что в примере c foo и bar начинаешь спрашивать в чём польза этих классов?
>То что ты able to, не значит что тебе надо так делать.
Ты хоть сам понял что высрал? Если "ты можешь и это полезно/удобно, то это не значит, что надо так делать".
Не перестаю проигрывать с этих жалких попыток оправдаться. И написал я про await await чтобы указать на неочевидное поведение, которое можно встретить при использовании асинхронных функций в лямбда-выражениях, но закомплексованный долбоеб конечно же принял всё на свой счет и начал нести бред.
> то ты сказал буд-то при использовании асинхронных лямбд, надо будет писать цепочку эветов, что не так.
Ну так покажи мне, как в этом >>721304 примере обойтись без await await или .Unwarp(), скотина тупорылая.
>Это нагрузка будет только при загрузке приложения
А боксинг у тебя на всей работе приложения отразится что ли? Ну создаст он у тебя на старте несколько объектов, потом gc их соберет. В чём проблема? Или у тебя приложение работает пару секунд?
https://github.com/BakaVaka/TcpLib/tree/master/src
Опять этот злоебучий аваилабл.
>Возвращает значение, указывающее количество полученных из сети и доступных для чтения данных.
В реальной жизни тебе будут прилетать сообщения не всегда целиком за раз - т.е. ты прочитал все из стрима и у тебя аваилабл = 0, но часть сообщения еще летит по проводам.
Боксинг происходит на моменте вызова события, т.е как раз во время работы приложения, а не на его старте.
Вроде бы нашел решение через создание generic делегата, которые оказывается дает обычный Delegate, который затем надо приводить к generic типу и тогда боксинга не будет.
Но обнаружил другую странную фигню, оказывается когда передаешь структуру через ключевое слово in, то эта структуру теряет всякую связь с интерфейсами т.е через рефлексию не видно что она реализует какой-нибудь интерфейс, но если убрать in, то видно реализацию интерфейса.
Это я про ParameterInfo говорю.
Тоже самое происходит если использовать ref.
Конечно я уже придумал грязный хак, тупо хранить в словаре по имени названия структур которые реализуют нужный мне интерфейс, а затем проверять по имени подходящая ли структура в том методе что я исследую, там различие только в конце, у не in/ref структуры будет название с & на конце. Но это не совсем правильный метод, но рассмотрев абсолютно все свойства и методы, я на нашел другого способа.
Ну и зачем эта ебля, если ты можешь создать функцию, которая будет вызываться из конструктора структуры, которая будет принимать её в качестве параметра и обрабатывать всеми обработчиками для данной структуры.
Обработчики будешь прописывать в partial классе. Единственный минус в том, что при добавлении обработчика нужно будет явно прописывать его вызов в общей функции, которая этот обработчик вызывает.
>Боксинг происходит на моменте вызова события
Ну вот и получается, что у тебя рефлексия работает на протяжении всей работы приложения, а не только при запуске.
ДатаАвалибле дает тебе знать, готовы ли данные к прочтению, при этом оно может вызвать эксепшн, если удаленный хост внезапно закроет соединение.
>А как надо, если я не знаю по какому протоколу работать будем?
А как ты работать то собрался тогда? Наугад?
> ДатаАвалибле дает тебе знать, готовы ли данные к прочтению, при этом оно может вызвать эксепшн, если удаленный хост внезапно закроет соединение.
Ну, оберну чтение в try-сatch и как-то обработаю это дело же.
>>721563
> А как ты работать то собрался тогда? Наугад?
Ну, дык вся логика обработки сообщений, по моей задумке, должна быть вынесена в ProcessSessionHandler, там уже пользователь библиотеки(я), может логику в соответствии с протоколом реализовывать. А TcpServer - Session это просто служебные классы, чтобы не писать каждый раз повторяющийся код. Вот, для примера, скажем мне сегодня нужно реализовать простую логику: клиент подключается, я его регистрирую и шлю ему пакет проверки соединения и потом просто повторяю проверку соедниения по таймеру, чтобы знать что клиент подключен и работает нормально, я просто пихаю эту логику в ProcessSessionHandler. А завтра я решаю что мне нужно HTTP сервер намутить и я не хочу тащить апач или что-то такое, я сделаю класс, который бы собирал из пришедших байтиков запрос, запихну экземпляр в ProcessSessionHandler, буду в цикле пихать в экземпляр класса байты, пока не получу нужный пакет или пока не истечет лимит, если будет валидный запрос - обработаю его и пошлю ответ, если нет - дропну соединение. В этом и задумка как-бы, чтобы сделать такую вот маленькую библиотечку, которая не зависит от протокола и чтобы можно было ее таскать с собой и каждый раз не реализовывать всю эту фигню.
Просто да, я понимаю, что никому нормальному оно не всралось, но я вот такой вот еблан. Изобретаю велосипед и есть готовая нормальная библиотека, для вот этого вот всего, чтобы просто можно было сделать класс который должен был бы парсить байтики, я бы пришедшие данные в него запихивал и когда получал сообщение - отдавал какую-то логику обработки реализовывал. Но я, как не гуглил, нашел только WatsonTCP и NetCoreServer. Watson не подошел потому что он почему-то не хотел вызывать событие получения сообщения, если это было долгосрочное подключение, и я вот шлю-шлю пакеты, а он это событие вызывает только после того как я дропаю соединение, хз, может быть я тупой и не понимаю что-то. А у NetCoreServer на тот момент были проблемы с 500+ соединениями, хотя заявлялось что 10к умеет держать, ну и тогда были утечки, но сейчас гуглил, вроде пофиксили.
Ай, ладно, моих скиллов все равно недостаточно, чтобы такое сделать и чтобы оно было не только мне удобно.
> ДатаАвалибле дает тебе знать, готовы ли данные к прочтению, при этом оно может вызвать эксепшн, если удаленный хост внезапно закроет соединение.
Ну, оберну чтение в try-сatch и как-то обработаю это дело же.
>>721563
> А как ты работать то собрался тогда? Наугад?
Ну, дык вся логика обработки сообщений, по моей задумке, должна быть вынесена в ProcessSessionHandler, там уже пользователь библиотеки(я), может логику в соответствии с протоколом реализовывать. А TcpServer - Session это просто служебные классы, чтобы не писать каждый раз повторяющийся код. Вот, для примера, скажем мне сегодня нужно реализовать простую логику: клиент подключается, я его регистрирую и шлю ему пакет проверки соединения и потом просто повторяю проверку соедниения по таймеру, чтобы знать что клиент подключен и работает нормально, я просто пихаю эту логику в ProcessSessionHandler. А завтра я решаю что мне нужно HTTP сервер намутить и я не хочу тащить апач или что-то такое, я сделаю класс, который бы собирал из пришедших байтиков запрос, запихну экземпляр в ProcessSessionHandler, буду в цикле пихать в экземпляр класса байты, пока не получу нужный пакет или пока не истечет лимит, если будет валидный запрос - обработаю его и пошлю ответ, если нет - дропну соединение. В этом и задумка как-бы, чтобы сделать такую вот маленькую библиотечку, которая не зависит от протокола и чтобы можно было ее таскать с собой и каждый раз не реализовывать всю эту фигню.
Просто да, я понимаю, что никому нормальному оно не всралось, но я вот такой вот еблан. Изобретаю велосипед и есть готовая нормальная библиотека, для вот этого вот всего, чтобы просто можно было сделать класс который должен был бы парсить байтики, я бы пришедшие данные в него запихивал и когда получал сообщение - отдавал какую-то логику обработки реализовывал. Но я, как не гуглил, нашел только WatsonTCP и NetCoreServer. Watson не подошел потому что он почему-то не хотел вызывать событие получения сообщения, если это было долгосрочное подключение, и я вот шлю-шлю пакеты, а он это событие вызывает только после того как я дропаю соединение, хз, может быть я тупой и не понимаю что-то. А у NetCoreServer на тот момент были проблемы с 500+ соединениями, хотя заявлялось что 10к умеет держать, ну и тогда были утечки, но сейчас гуглил, вроде пофиксили.
Ай, ладно, моих скиллов все равно недостаточно, чтобы такое сделать и чтобы оно было не только мне удобно.
Затем что я хочу иметь чистый и красивый код.
Отдельно структуры которые являются способом передачи данных.
Отдельно обработчики где я регистрирую только класс (можно и не регать, просто я так ускоряю запуск) и там уже методы сами регистрируются без моего участия. Захотел удалил метод, захотел добавил и нигде ничего писать не нужно дополнительно.
Плюс дебажить такое удобно.
А еще можно через атрибуты отключать/подключать функционал.
Может чего еще придумаю на основе этого.
>>721540
Нет, там при работе вызывается созданный делегат на моменте запуска.
Бенча 2 потому что затем пришла идея проверить скорость вызова делегата и как видишь разница не велика, и это еще возможно из-за каста в дженерик. Но делать я его решил без динамика, уж очень долго с ним.
IdeaCall это то что я придумал.
Дальше тоже самое, но с боксингом, кстати удивительно но нагрузки на GC нет, я думал будет.
DirectCall это прямой вызов.
Delegate это вызов через созданные делегат напрямую.
EventCall это вызов через event EventHandler.
Ну и IdeaDynamicBoxingCall это вызов через DynamicInvoke, т.е через рефлексию.
Все это дело было с повторами в 100_000_000 раз.
Вызывался кстати метод которые суммировал из прокидываемой структуры поле, чтобы не было читинга
бумб
Ну, няша, ты что-то наговнокодил. Что тебе мешало так сделать?
А вообще, у шарпов синтаксис поприятнее, меня вот задалбывало то '->' то '.' использовать и держать в голове, по указателю я обращаюсь или не. Короче, у шарпа оно как-то все более структурированно, имеет какую-то общую фому, плюс глаз легче цепляеется за ключевые слова типа ref out и т.д. Опять же, можно очень сильно упрощать себе жизнь, ловя ошибки на этапе компиляции, вместо того чтобы потом кучу времени искать где же ты там изменил то что должно было быть неизменяемым.
Таки можешь, только вот обычно на шарпе это не особо надо.
Зато в шарпе можно бла-бла-бла. Вопрос поставлен некорректно.
да, 400$. полугосконтора в мухосрани в области жизнеобеспечения города.
конечно потребую поднять зарплату, но сначала придется сделать, а то заявляют что все просто, а я просто не хочу работать, а на улице и так полно желающих
Мм.. как жи хочеца контлоллировать.. опелативку.. скачать контлоль озу.. так сболщик мусола.. ето не то..
1. Для расширения приложения сторонними разработчиками. Создаешь определенные условия, которыми должно обладать расширение и подгружаешь дополнительный функционал без необходимости лезть в основной код.
2. Для работы фреймворков. Которые анализируют твой код при помощи рефлексии и дописывают комплексные части за тебя.
3. Для большей автоматизации. К примеру, у тебя есть меню и несколько его пунктов. Не используя рефлексию при добавлении нового пункта, тебе придется лезть в код и помимо описания нового элемента, добавлять его в общее меню, возможно меняя порядок отображения. При помощи рефлексии достаточно написать логику вида - если у класса в имени содержится MenuItem, значит берем его свойство Title и вставляем в отрисовку общего меню в порядке обозначенном его свойством OrdinalNumber. Те для добавления нового пункта, тебе нужно всего лишь создать новый класс с таким названием и задать необходимые свойства, лезть в основной код не нужно. Соблюдая как DI принцип, так и ОC принцип. При этом тратя меньше времени.
4. Для изоляции отдельных компонентов. Подгружаешь их в отдельный домен и работаешь с ними при помощи рефлексии, не опасаясь того, что они повлияют на работу твоегр приложения без твоего ведома.
5. В крайних случаях, можно использовать для запиливания костылей к уже скомпилированному коду, перекомпилировать который нет возможности.
>>724002 >стучайно отправил
*хоститься и не лезть в основной код. Но этот код не появиться в сборке и приходиться компилировать отдельно и запускать эту свистелку-перделку уже под рантайм основного приложения. Вопрос - зочем? Ладно, если какой то крупный интерпрайз 24/7 крутиться в продакшене и к нему нет доступа, но если сама же команда разрабов будет пилить такие костыли на ходу, то запуск одного приложения + N костылей (который будет так же с зависимостями - это ад адский). Кстати да, когда по методанным получаешь дерево типов - можно ли делать Reference на них?
2. >дописывают комплексные части за тебя.
К примеру? Не понимаю, о чем речь
3. Почему не перекомпелировать?
4. Это более ли менее здраво
5. Тот же вопрос, что и 1,2.
Ок, есть охуенно огромная сборка, которая компилиться 2-3 часа, а у заказчика нет времени на это. Ты пишешь костыль, как основной модуль узнает, что есть такой вот приставленный костыль? Ведь в основном модуле этот функционал не заложен и на него нет ни эндпоинтов ни ссылок - вообще нихуя.
Ну, я написал для тестирования на формочках простенький эмулятор клиентов. Вбиваешь адрес, количество клиентов, жмакаешь кнопочку, они стучаться и ответ сервера рисуют на своих вкладочках, плюс небольшой текстбокс с текстовым представлением ответа. Как-то так. Понимаю что не самый честный способ проверки.
Почитай еще теории. Бросает в тильт не из за корструкций, а из за того что ты динамикопетух, еще и пришел из языка-калькулятора для школьников/ученых. Это как с трехколесного велосипеда перепрыгнуть на мотоцикл и винить во всем конструкцию.
Если боишься, значит не знаешь, значит теорию нужно подтянуть. Я сам на шарп с жопаскрипта перешел, свободно писать начал только после трёх книг по шарпу и одной по ооп и паттернам проектирования.
Попробуй пару лет писать на си и плюсах, кек. Я вот когда на третьем курсе нам начали шарп давать, радугой кончал от того как там все удобненько. Да и какие конструкции там могут быть неудобными или неочивидными? Разве что лямбды попервой, но первое время можно без лямбд кодить, вынося все это в отдельные функции. Ну или ООП, но ООП это отдельная срань, которую нужно отдельно от шарпа учить.
у тебя там настолько большая штука что по 50 клиентов одновременно регистрируются ?
Мне не дается разделение программы на части. Типа, создаем сервис, к нему еще один сервис, а в результате все работает и легко модифицируемо
Что почитать, чтобы строить красивую архитектуру?
Работаю больше года, вроде руку набил, но уперся в потолок. Вместо совершенствования шарпа изучил js и vue на примитивном уровне, что позволяет писать простенькие spa, а сейчас понимаю, что хороший бекендер ценится больше, чем тяпляп фуллстек
Ну, я не знаю насколько она большая будет. Но считаю что надо заложить производительность на случай если такая ситуация произойдет.
https://metanit.com/sharp/tutorial/3.8.php
Почему конструктор не работает?
статические переменные в абстрактном классе. Братишка - ты долбоеб, земля тебе пухом
https://dotnetfiddle.net/tT47Dg
В общем, будь внимательнее. Во-первых, ты зачем-то пишешь BMW(...) : Auto(...), так оно никогда не работало. На метаните используется base.
Второе, ты используешь статичные свойства в абстрактном классе. Это значит что все наследники обращаясь к этим свойствам будут последнее присвоенное значение использовать. Если хотел чтобы они больше не изменялись, для этого есть readunly, если хотел чтобы они только внутри класса менялись, делаешь set приватным или протектным.
Ну и в общем с оформлением кода. Почитай гайдлайны, стиль кода это важная штука, особенно если ты скидываешь его другим людям. Создается впечатление, что тебе просто похуй.
Так я этим сейчас и занимаюсь
Вы видите копию треда, сохраненную 31 августа 2020 года.
Скачать тред: только с превью, с превью и прикрепленными файлами.
Второй вариант может долго скачиваться. Файлы будут только в живых или недавно утонувших тредах. Подробнее
Если вам полезен архив М.Двача, пожертвуйте на оплату сервера.