Вы видите копию треда, сохраненную 18 апреля 2021 года.
Скачать тред: только с превью, с превью и прикрепленными файлами.
Второй вариант может долго скачиваться. Файлы будут только в живых или недавно утонувших тредах. Подробнее
Если вам полезен архив М.Двача, пожертвуйте на оплату сервера.
ITT элита продолжает обсуждает будущее этого прекрасного и современного продукта компании Microsoft. Только в этом треде элитные разработчики ответят на самые острые вопросы индустрии.
Литература вторым постом
1. Ресурсы:
- http://stackoverflow.com/questions/tagged/c#
- http://www.tutorialspoint.com/csharp/
- http://professorweb.ru
- https://metanit.com/
- 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, делать намного сложнее.
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'а. Плюс няшные темы как в студии
dotPeek - бесплатный декомпилятор от JetBrains
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
Прошлый тред тонет здесь: >>1797054 (OP)
- 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
Напиши текст для новой шапки.
Все равно человек герой. Взял, да и перекатил.
вот тут есть пример чего я хочу реализовать
https://www.ownedcore.com/forums/mmo/path-of-exile/poe-bots-programs/617196-release-poe-d3d9-null-renderer-0-gpu-1-cpu-usage.html
но для игры на флеше а точней adobe air
То ли дело какой-нибудь PL/SQL - если ты профи, то будешь получать столько же, сколько сеньор шарпист, а знать дополнительно ничего не нужно.
Самый простой способ найти функцию рендера и подставить вместо нее функцию, которая ничего не делает, чем снизить нагрузку на видеокарту почти до 0. Сомневаюсь, что кто-то реверсил Adobe AIR.dll, так что в руки какой-нибудь IDA Pro и вперед копаться в асме.
Как вариант найти адрес функции начала сцены по смещению, но для этого надо понимать что это такое, DirectX или OpenGL или еще какая хуйня.
Как пофиксить такую ошибку?
>Your project is not referencing the ".NETFramework,Version=v4.7.2" framework. Add a reference to ".NETFramework,Version=v4.7.2" in the "TargetFrameworks" section of your project file, and then re-run NuGet restore.
Проверял в TargetFramework, там стоит v4.7.2.
Еще перезапускал NuGet, чистил кэш, толку никакого.
> есть ли что-то про архитектуры кроссплтформенных решений?
нетстандарт, неткоре
> как я понимаю в шарпе такой подход не будет работать
> А как тогда?
> Делаем разные реализации для каждой платформы
В качестве примера - современные MVVM-UI-тулкиты.
Кроссфплатформенный шаблон выглядит так:
Солюшон (Тест1)
Проект (Тест1_ЮИ), зависит от: дотнетстандарт
- Логика, окошки, модель (model), вью-модель (view-model) - абстрактные и платформонезависимые
Проект (Тест1_виндовс), зависит от дотнетстандарт, Тест1_ЮИ, ВПФ или формочки
Проект (Тест1_линукс), зависит от дотнетстандарт, Тест1_ЮИ, ГТКшарп или Кутшарп или от голых иксов или от фреймбуфера нахой
Проект (Тест1_андроид), зависит от дотнетстандарт, Тест1_ЮИ, андроид СДК или чо там
Проект (Тест1_макось), зависит от дотнетстандарт, Тест1_ЮИ, мак СДК или чо там
- представление (view), реализованное средствами целевой платформы/тулкита/сдк
Всю логику пишешь в основном первом проекте солюшена Тест1_ЮИ. В остальные проекты не лезешь принципиально, они заточены под то, чтобы динамически выводить предоставляемые твоей вью-моделью данные и отдавать ей же события ввода. И соответственно, при сборке решения заводишь несколько конфигов, которые под каждую целевую платформу, на которую ты нацелился, собирают и разворачивают только два проекта из всего решения: Тест1_ЮИ и Тест1_%платформнейм%
Создай новый проект заново и вручную добавь в него все файлы из старого.
>современные MVVM-UI-тулкиты
Модно, стильно, молодежно уже Model-View-Update, хотя он и раньше был:
https://docs.microsoft.com/en-us/dotnet/core/dotnet-five#model-view-update-pattern
Модель находится на клиенте или на сервере? Если на клиенте, то надо отправлять запрос на сервер при изменении. Если на сервере, то просто логгировать, используя NLog, Serilog, еще чего.
INotifyPropertyChanged - это просто интерфейс, который ничего не делает. WPF умеет автоматически через рефлексию пытаться взаимодействовать с INotifyPropertyChanged. Это не веб, но ничего не мешает реализовать это самому, смотреться только дико будет.
Настолько молодежно, что его даже негде применить и хз зачем вообще его применять
>Самый простой способ найти функцию рендера и подставить вместо нее функцию, которая ничего не делает
Так EasyHook это и делает - перехватывает вызов функции и подставляет вместо него тот что тебе нужен.
Ну так учи SQL. Если не выучил, значит не так уж это и просто - быть экспертом по SQL.
В чём различия понятий "асинхронность, многопоточность и параллельность", опиши каждое, если они чем-то различаются.
Многопоточность -- это когда код может выполняться в разных потоках, не обязательно одновременно. Параллельность означает что потоки могут выполняться одновременно, асинхронность -- это способность потока запускаться, не блокируя порождающий его поток.
Почему программа останавливается? Здесь 2 ридлайна, после того как я нажимаю интер после этого появляется fff2 и программа не завершается, последний метод не срабатывает.
>и программа не завершается
Верней завершается вся программа, при этом что не срабатывает второй ридлайн
async void - анти-паттерн и может вызывать непредсказуемые результаты, используй async Task.
Понял, спасибо
Ну всё равно какой-то авто-интер срабатывает и после вывода ффф2 опять заканчивается программа, я не нажимал на интер
я вот кстате подменил d3d9 из того форума, картинки нету но память жрет абсолютно одинакового
>асинхронность -- это способность потока запускаться, не блокируя порождающий его поток.
Т. е. асинхронность недостижима в однопоточных системах?
Надо еще вырезать код, который создает константные буфферы и который загружает меши с текстурами. Причем такие буфферы бывают еще разных режимов. PoE ловит такую хуйню и дает бан.
Идея работы видеокарты следующая:
- процессор лезет на диск и достает например модель персонажа
- процессор создает константный буффер и буффер модели
- процессор загружает все это в память видеокарты
- видеокарта, используя шейдеры (мини-программа), делает манипуляции с буфферами и рисует изображение
Слышал новые видеокарты хотят научиться доставать ресурсы без процессора, не слежу.
Task.Run убери везде.
Thread.Sleep на await Task.Delay(1000).
ShowTimer не должен быть асинхронным.
totalTime сделай внутри функции которая увеличивает эту переменную, перед циклом while;
>последний метод не срабатывает.
Отключи оптимизации при компиляции, возможно Console.Read() вырезается из-за того что дальше никакого кода нет. Если не поможет, то замени на Console.ReadLine();
Философский вопрос. Асинхронность в шарпе всё равно использует потоки, просто не системные потоки.
>Философский вопрос.
Смотри так на собесе не скажи, а то быстро попустят.
>Асинхронность в шарпе всё равно использует потоки
Не всегда. Если асинхронная задача выполняется быстро, то всё происходит в рамках одного потока. Для того чтобы этого не происходило есть флаг TaskCreationOptions.LongRunning, тогда под выполнение данной задачи буде выделен отдельный поток.
Асинхронность это больше про взаимодействие с внешними устройствами, а не многопоточность. Толку от того что ты отправишь запрос на сервер в отдельном потоке не будет.
Всё равно ведь сохраняется стек и счётчик инструкций. Если они сохраняются, то там таки есть отдельный поток, пусть это и не поток операционной системы.
Поправь меня, если я не прав.
https://youtu.be/Tb2Fx9qku_o?t=272
Зачем это знать? Есть высокопроизводительные локфри алгоритмы, которые могут упереться в мемори барьеры и похерить код. Жаль, в отличии от плюсов, в шарпе есть только фул бирор.
99% шанс, из собеседующих никто это знать не будет.
Штош, тогда не буду в курсе.
Так при чём здесь недостижимость асинхронности в одном потоке? Она вполне достижима, просто этот один поток будет переключаться между задачами в пуле потоков.
Асинхронность это когда ты не выполняешь задачу сразу, а возвращаешься к другим задачам, откладывая выполнение текущей. Это полезно когда на этапе выполнения задачи задействованы сторонние устройства, которые выполняют задачи на аппаратном уровне - сетевые запросы, чтение файлов с носителей, печать документов. Тебе достаточно периодически возвращаться к ним и проверять их статус.
>Можно написать простой синхронный код, но выполняться его участки будут параллельно.
Но это зависит от архитектуры процессора, как сказано в видео. А для эффективности многопоточного кода достаточно чтобы у процессора было >= 2 ядер.
Прямое же.
В асинхронном методе поток выполнения доходит до await. Он сохраняет стек и возвращает поток выполнение в точку вызова асинхронного метода.
Философский вопрос: если у потока в двух точках разный стек, то разве это один и тот же поток? Если считать, что это поток операционной системы, то ответ да, возможна реализация асинхронности с помощью одного потока операционной системы. На деле происходит переключение потоков реализации асинхронности! Стеки-то разные, счётчики инструкций разные. Это натуральное преключение потоков.
Он не сохраняет стек и не возвращает поток в точку вызова. Дойдя до await поток возвращается в пул потоков, помещая задачу в очередь пула потоков.
Сама асинхронная функция это объект в виде машины состояний в которой каждый await и всё что до него это определенный блок кода, выполнение этих блоков никак не связано с потоком который дошел до первого await.
Запусти асинхронный метод и выводи Thread.CurrentThread.ManagedThreadId перед await, во время работы метода и по его окончанию. Номер потока который продолжает выполнение после await будет всегда совпадать с номером который выполнил заключительную часть асинхронного метода.
>Номер потока который продолжает выполнение после await будет всегда совпадать с номером который выполнил заключительную часть асинхронного метода.
Что говорит нам, что это один и тот же поток CLR. Не вижу, как это противоречит тому, что я написал выше.
Тебя на собесе попустят с твоими философскими вопросами и попытками маняврировать.
Отнесусь к этому философски и буду сразу уточнять, что интервьювер имеет в виду под потоком.
Я думаю, на собесе так и так попустят.
Если ты глядя на код ничего не понял, то чего ожидаешь от тех кто этого кода не видел?
значит не повезло тебе
я вот прямо щас ебусь с таким
но похоже у тебя не мой случай и прицепом за мной не пойдешь
потому что шарп толком уже никому не нужен.
джава как была, так и осталась, а шарп, традиционно сильный в программах под винду, просто умер вместе с виндой. осталось только юнити и совсем чуть-чуть энтерпрайза.
винфон/винмобайл, винформ, впф, сильверлайт, виндоус сервер - все сгинуло.
сейчас на каком-нибудь жс/го/котлине можно гораздо быстрее написать несложный бек, либо на той же жабе, если нужно что-то более громоздкое. шарп не нужен, это видно по количеству вакансий.
Ну блин. Кода с собой нет.
Суть, было так:
foreach(var obj in SomeDTOArray)
{
//Простыня всяких манипуляций с этим объектом, запросы к базе, все это вот
await Api.PostResult(result);
}
это работало нормально, но блин, можно же сделать все разом, вот я и решил что было-бы неплохо вынести эту простыню в отдельный таск и получил
List<Task> tasks = new List<Task>()
foreach(var obj in SomeDTOArray)
{
Task t = MySuperMethod(obj);
t.Run();
tasks.Add(t);
}
await Task.WhenAll(tasks);
Bот. И что получилось, а то что в определенный момент, по непонятной мне причине в этом Api.PostResult() выскикивает нулл-эксепшн, хотя апи, по сути, это просто такой вот класс:
public class Api
{
private static HttpClient _http = new _http();
readonly string _uri;
Api(string uri)
{
_uri = uri??throw new ArgumentNullException(nameof(uri));
}
public Task PostResult(SomeObject post)
{
Uri requestUri = new Uri($"{_uri}/api/..."); //<- вот тут вот как раз и кидается нулл референс, дескать _uri - нулл
...
}
}
Ну блин. Кода с собой нет.
Суть, было так:
foreach(var obj in SomeDTOArray)
{
//Простыня всяких манипуляций с этим объектом, запросы к базе, все это вот
await Api.PostResult(result);
}
это работало нормально, но блин, можно же сделать все разом, вот я и решил что было-бы неплохо вынести эту простыню в отдельный таск и получил
List<Task> tasks = new List<Task>()
foreach(var obj in SomeDTOArray)
{
Task t = MySuperMethod(obj);
t.Run();
tasks.Add(t);
}
await Task.WhenAll(tasks);
Bот. И что получилось, а то что в определенный момент, по непонятной мне причине в этом Api.PostResult() выскикивает нулл-эксепшн, хотя апи, по сути, это просто такой вот класс:
public class Api
{
private static HttpClient _http = new _http();
readonly string _uri;
Api(string uri)
{
_uri = uri??throw new ArgumentNullException(nameof(uri));
}
public Task PostResult(SomeObject post)
{
Uri requestUri = new Uri($"{_uri}/api/..."); //<- вот тут вот как раз и кидается нулл референс, дескать _uri - нулл
...
}
}
>традиционно сильный в программах под винду, просто умер вместе с виндой
шта?
как юзер видел софта под винду на шарпе - по пальцам одной руки можно пересчитать.
а в ентерпрайзах переходы на линуксы только мечты. как было - так и осталось.
>а в ентерпрайзах переходы на линуксы только мечты. как было - так и осталось
каво? работал в сбере, друг работал в х5 ритейл. нигде нет виндовых серверов. ну может и есть где, но мы не видели.
да и вообще, вы ебанутые чтоли, какие сервера на WINDOWS SERVER в 2020 году? все уже давно либо свои сервера делают под линухом, либо арендуют у амазона под тем же линухом.
>ну может и есть где, но мы не видели.
если не видели, значит не существует, ага )
весь виндовый софт в ентерпрайзах никуда не делся одним махом. это только в мечтах распильщиков "хуяк хуяк и линукса". а в остальном то же самое - переписывать софт под линукс сервер только потому что вот - мало кто будет.
Сказочник. Если в твоей мухосрани нет вакансий, то это не значит что их вообще нет. Шарп разрабов порядка 6 млн сейчас и потихоньку начинают писать под линухи и контейнеры.
Факт - на шарпе гораздо быстрее написать бэк, чем на го/жава/скала. Дотнет по перформансу уделал жаву.
Десктоп двум с половиной анона сейчас нужен и всяким шаражкам.
Azure сейчас по доле рынка не уступает AWS. Там естественно и куча виндовых серваков и дотнета и powershell. Но дотнету винда сейчас нафиг не нужна, сами МС перетягивают на использование их фреймворка под линухами. Дотнета достаточно крутится и под AWS/GCP.
https://www.youtube.com/watch?v=kX0eX5tDGgc
Попытался прочитать этот код, но глаза отказались. Надо или форматировать нормально или через ссылку на какой-нибудь pastebin.
Так ведь уже есть.
Тебя даже шторм не разбудил
что поделать. У каждого подхода свои недостатки.
Как в WinForms нормально подстроить размеры элементов под шрифт и разрешение экрана?
Я делаю вот так:
using var g= button.CreateGraphics();
var bs = g.MeasureString(button.Text, button.Font);
w = (int)(bs.Width);
h = (int)(bs.Height);
button.ClientSize = new Size(w, h);
Но получается хуета и текст обрезанный.
Какое бы значение я не ставил в этом: Application.SetHighDpiMode(HighDpiMode.SystemAware); всё равно получается хуета.
Винформс не адаптивная, нужно wpf юзать
"Эта херня не работает - почини" - дебажу, разбираюсь в коде, вношу исправления.
"Эта херня должна работать по новому" - разбираюсь в коде, меняю
"Запили эту херню" - пытаюсь найти схожий функционал, запиливаю херню
"Эта херня работает на старых библиотеках/не соответствует новой архитектуре/работает медленно" - переделываю как надо
"Сделай ревью этой херни" - делаю код ревью, пишу комментарии.
"Ананон, анон, что мы будем делать? Анон, анон, как мы будем жить?" - собираемся с командой и обсуждаем проблемы архитектуры или как будем делать конкретную нетривиальную фичу.
А еще есть планирование следующих итераций, где обсуждаем и разбираем задачи, оцениваем времязатраты; созвоны с клиентом; личные консультации с сотрудниками по небольшим проблемам разработки.
Думал сделать это как ref поле. Но оказывается так нельзя.
Можно ли как-то сделать это без использования unsafe и без пихания в каждую структуру всего массива структур.
У структуры должен быть фиксированный размер, цепочка связных структур невозможна, потому что размер первой структуры должен быть бесконечен.
Можно делать так:
struct MyStruct
{
public int Value;
public int NextIndex;
}
Где NextIndex это индекс следующей структуры в массиве структур.
Можешь юзать боксинг:
struct Point<T>
{
public T Value;
public object next;
public Point<T> Next => (Point<T>) next;
}
и инициализировать массив так:
Point<int>[] points = new Point<int>[100];
object next = null;
for(int i = 99; i >= 0; i--)
{
var p = new Point<int> {Value = i};
p.next = next;
next = p;
points = p;
}
Console.WriteLine(points[2].Next.Next.Next.Value);
Всрато, неэффективно, но без массива структур. Вообще, для такой хуйни созданы классы, посмотри что это такое.
Нахрена тебе винформс? Бери и делай в браузере, как белый человек. ХЗ в чем проблема-то. Если это вообще что-то простое, то можешь вообще на электроне делтать, как все нормальные люди. Серьезно, тебе же удобнее будет.
и да, изменять структуру через Next не получится, так как при каждом Next получаешь совсем новую структуру. Поэтому либо юзай NextIndex как писал анон выше, или класс, как все нормальные люди.
Но не понимаю, что тебе мешает хрвнить в структуре ссылку массив. Да, придется хранить дополнительно 12 байт, а не 8, и че.
Тогда можешь даже сделать так
struct Point<T>
{
public T Value;
public Point<T>[] arr;
public int index;
public ref Point<T> Next =>
ref arr[index+1];
}
Но учти, что ref это не указатель и не ссылочный тип, и вместо налла кинет в тебе в ебло ексепшн.
лютое говно. да еще на лютом говне - жс
WinForms - это лёгкость, простота, ясность и производительность.
WFP - это какое-то кривое чудовищное говнище для поехавших.
А уж JS-параша не нужна в принципе.
WinForms - это лёгкость, простота, ясность и производительность.
пофиксил
когда нужно будет создать что то адаптивное, да с сложнее тупынх кнопочек, то сразу простота и легкость улетят в одно темное вонючее место
Адаптивность
Возможность кастомизации - создание контролов с любой визуальной частью простыми средствами, а не еблей с OnPaint
ну и MVVM из коробки
https://pastebin.com/YjjuumER
Зачем выдирать интерфейсы, если у тебя нет других реализаций интерфейса и ты не собираешься использовать эти классы полиморфно? По-моему это глупо. Интерфейсы мудны. Логгер велосипедировать последнее дело, ставь NLog.
> public enum ServerState
Почему не bool? Undef нигде не используется.
> Socket acceptor = new Socket();
var
> acceptor.Bind(new IPEndPoint(IPAddress.Parse(_host), _port));
Нет валидации, запросто может вылететь исключение
> acceptor.Listen(100);
Магическое число
В целом нагородил "архитектуры" где её нет, получилось горе от ума — путанный студенческий код.
Ну дык async Task предполагает что я ждать буду, а мне не надо. Я конечно могу и не ждать, но тогда IDE будет мне упорно светить зелененьким что нужно подождать.
_=MyAsyncMethod() если нужно fire and forget
>Зачем выдирать интерфейсы, если у тебя нет других реализаций интерфейса
Я не тот анон, но я всегда выделяю интерфейсы для больших и/или сложных классов. Они добавляют читабельности.
Смотришь на интерфейс и сразу понимаешь внешний функционал класса, понимаешь его связность с другими классами, понимаешь, насколько он грамотно выделен.
Ну блин, не хотелось мне оборачивать прием сокета в Socket clientSocket = await Task.Run(async () => await acceptor.AcceptAsync(), cancellationTokenSource.Token). Выглядит это убого.
ну а кто вас заставляет не любить TcpListener и опускаться ниже без особой на то причины
Если уж пилить велосипед, то либо с идеально архитектурой, либо с какими-то фишками. А это что? Поделка из раздела "топориком на коленке".
Курсовая это. Вебсервером оно должно стать. С поддержкой этих ваших шифрований и прочей фигней. Ну и возможностью в случае чего быть не только веб-сервером, а каким-нибудь сервером для проверки времени. Не будешь же ты время засовывать в HTTP, когда можно просто отдать просто байтики.
Да я как-бы уже посмотрел как гайды так и исходники того же кестрелла. Просто например кестрел по мне слишком сложноватый для курсача, с другой стороны то что в гайдах там совсем какая-то примитивщина, где мы берем просто HttpListener, пишем один цикл, добавляем асинхронный обработчик, и все готово. При этом оба эти варианта заточены исключительно под веб, а мне таки хотелось чтобы можно было запилить решение которое могло бы в теории таки не ограничиваться 2 протоколами.
>нужно ли вообще это делать,
Зависит от проекта. У репозитория есть свои плюсы, например, облегчение юнит-тестирования, также за счёт unit of work можно лучше описать логику работы с транзакциями и лучше контролировать изменение данных.
>В одних примерах репозитории возвращают IQueryable<T>, в других IEnumerable<T>
Только репозиторий должен работать напрямую с БД, т. е. он не должен возвращать IQueryable, так как IQueryable не загружает данные в память перед тем как их отфильтровать, он фильтрует их на стороне сервера.
> в одних сохраняют изменения после каждой операции, в других этим занимается unit of work, хрен поймёшь.
Сохранением, изменением, восстановлением должен заниматься unit of work это его прямое назначение.
А если я к возвращаемым из репозиториев IEnumerable буду применять всякие .Where().Select(), я же получается загружу лишние данные из БД, и только потом буду их фильтровать. Это ведь не хорошо?
IEnumerable уже загрузил всё, вот если к IQueryable применить фильтрацию, то будет запрос к бд.
еще раз дам ссылку
https://habr.com/ru/post/259829/
ищи на странице заголовок "Persistance ignorance"
и читай этот раздел
Так я и спрашиваю, плохо ведь всё загружать из БД, если мне нужны отфильтрованные данные? Фильтрация на стороне бд ведь лучше?
И если возвращать IQueryable и к нему применять всякие фильтры, то фильтрация будет происходить в бд. Зачем тогда репозиториям возвращать IEnumerable (то есть всю таблицу)?
я зачем ссылку дал? прочел бы и понял суть
Пытался сделать
DateTime.ParseExact("28 декабря 2007", "dd MM yyyy", new CultureInfo("ru-RU"));
Но выдаёт исключение String '28 декабря 2007' was not recognized as a valid DateTime
Поэтому вся фильтрация происходит в репозитории, а из него возвращаются отфильтрованные данные. Если тебе репозиторий возвращает IQueryable, значит ты из кода вне репозитория будешь работать с БД. Что тебе не понятно?
>Поэтому вся фильтрация происходит в репозитории
То есть репозиторий должен определить методы Where и прочие?
IEnumerable означает, что данные уже загружены, и ты вне репозитория не сможешь применить логику, повлияющую на БД
Если под "определить" ты подразумеваешь фильтрацию и выборку, то да. Происходит это либо в зависимости от параметров запроса метода репозитория, либо в зависимости от самого метода. Например, если тебе нужен товары всех видов кроме определенных, то у репозитория должен быть метод ProductRepository.GetAllProductsExcept(ProductType[] pTypes), а внутри этого метода ты уже вызываешь осуществляешь соответствующий запрос к бд с нужной фильтрацией.
Замени еще new CultureInfo("ru-RU") на CultureInfo.GetCultureInfo("ru-RU")
>Зачем тогда репозиториям возвращать IEnumerable (то есть всю таблицу)?
зачем зачем . причины
1 логика фильтрации закодирована внутри метода, так что вернет он уже отфильтрованное (и обычно имя метода намекает)
2 если логика фильтрации не закодирована внутри метода, то может принимает спецификацию
3 А может реально нужно прочитать все. GetAll должен читать все по определению.
4 А если и спеки нет, то может кодил тупой кодер, для которого нормально, что он идет за пивом, притаскивает домой все содержимое магазина, берет бутылочку, а остальное в мусор
и там в скобочках обосрался немного где (int) но все равно увеличивается b каким-то хуем
Да, через потоки.
Но это не самоцель "создать потоки", смысл асинхронности - не задерживать выполнение программы, а пропускать выполнение дальше. Автоматически создавать потоки и не иметь управление ими.
Многопоточность это всегда про управление потоками, а не использование их для достижения "пропустить код без задержки" главного цикла
шиза, конечно,
lock лишний, если изменение переменной происходит в одном месте. Если не в одном, то лучше заменить на Interlocked.Increment(totalTime);
> шиза, конечно
Не шиза, а магическое мышление:
> я низнаю що такое патоки, мене сказали тут асинк - там авайт - и буит работать. И ищо мне сказали пишиш таск.рун, скобачьки, стрелачку, фигурные скобачки и вот шо в фигурных скобачках - то будит асинхрона. А остальное миня ниибёт. Главнае - работаит.
да вообще то даже если и в одном. если чтение происходит в другом и у вас не асинк/авайты то в теории могут быть проблемы из-за оптимизаций компилятора
Каких оптимизаций? int переменную можно безопасно изменять одним потоком одновременно и считывать эту переменную из нескольких потоков тоже одновременно. Потому что это всё атомарные операции.
>Каких оптимизаций
перестановка инструкций
кеширование значения
инлайн переменной
и тому подобное
да. лучше не знать. а зачем знать. все равно говнокод пишем, да текущая архитектура процессоров спасает положение. да jit действует по алгоритму "да ну хз лучше я лишний раз не полезу оптимизировать"
И потому пока lock-free не пишешь, то и проблем нет
а в данный момент я в очередной раз пишу телеги в мс и остальные ко ибо очередной гейзенбаг с NRE
будет
Посоветуйте, есть ли смысл вкатываться в шарп? Какие подводные камни? Что почитать, чтобы быстро освоиться, минуя стадию хелловорлдов и физбаззов?
>картинка
>.net на mobile и iot
Я бы постеснялся такое скидывать.
Касаемо количества вакансий - смотрю только по ДС. Разница в между количеством вакансий на жабе и количеством вакансий на шарпе - огромная, разница более чем в 2.5 раза.
>Факт - на шарпе гораздо быстрее написать бэк, чем на го/жава/скала
Про джаву и скалу соглашусь, про го ничего не могу сказать. Но если шарп - это энтерпрайз язык, то какой смысл от того, что на нем можно написать бек быстрее, чем на жабе? Энтерпрайз может себе позволить оплатить дополнительные часы работы разрабов. Вот если бы у шарпа была такая же экосистема как у жабы - тут можно было поспорить. Пока что вся экосистема шарпа по сути завязана на одну контору, как это и было 10 лет назад.
>Дотнет по перформансу уделал жаву.
В плане clr vs jvm? Ну принеси пруфы, посмотрим. Однако перфоманс в энтерпрайзе не так уж и важен, имхо.
Оправдания жабапетуха:
>за счёт легаси дерьма вакансий больше в 2.5 раза
>компания будет платить за хуевую жабу больше просто потому что
>если хоть один жаба-петух не слышал про выход .Net в опенсорс, значит шарп это только майкрософт
>компании будет всё равно на хуевую производительность жабы просто потому что
проиграл. Майкрософт это, кстати, один из больших плюсов C# и .Net, они поддерживают большой штат высококлассных специалистов, которые каждый день работают над улучшением платформы. Они могут себе позволить делать код-ревью тех кто хочет сделать свой вклад в опенсорс, что еще больше повышает качество кода. Всё это время разработчики Java сосут лапу и думают как выжить, о развитии языка даже речи не идёт, всё держиться на Java-макаках, которые не хотят осваивать более лучшие инструменты.
>В плане clr vs jvm? Ну принеси пруфы, посмотрим. Однако перфоманс в энтерпрайзе не так уж и важен, имхо.
https://devblogs.microsoft.com/dotnet/performance-improvements-in-net-5/
Вот тебе июльский отчет об улучшении производительности. Показывай подобное от жаба-разрабов.
Хочу вкатится, ток непонятно на какой шаблон больше спрос там mvc не mvc, react не react, какая то темень но интересно
У ASP .Net сейчас один шаблон - MVC. Только View можно отбросить, так как это задача фронтенд фреймворка, бэкенд только общается с БД и отдает данные в json формате. Самый популярный сейчас фронтенд фреймворк это React, потом Angular, потом Vue. В дополнении к этому нужно знать Entity Framework и SQL.
Из фронтенд фреймворков приятнее всего работать с Ангуляром, потому что архитектура и принципы похожи на ASP .Net, но для него нужно будет выучить Typescript (осваивается за пару недель при условии что знаешь C# и JS).
Ну хоти. Я-то спрашивал про время актуальности, а не вкат.
Тоже по пол года не захожу, а как зайду то сразу вижу вброс про винду.
Через 4 дня выходит .NET 5 и окончательно стирает все вопросы о кроссплатформенности, а у него какие-то старые мантры десятилетней давности.
вот только они там умудрились набрякаченджить по сравнению с 3.1
посмотрим посмотрим
И все равно там нет ответа на главный вопрос
доколе мы будем писать постоянно ConfigureAwait(false)
https://medium.com/@bigoudi/using-native-wheel-picker-in-xamarin-forms-ui-day-1-23732d00b459
https://github.com/softlion/WheelPicker-Samples
Я так понимаю, надо наследоваться от селектора или же есть способы проще? Много времени на это тратить нежелательно, а сделать хочется красиво и удобно. Сам я вообще плюсовик, пожалуйста, направьте в нужное русло
Ну бля, если ты видя готовое решение не можешь написать своё, то анон здесь бессилен.
Правильно, не нужен. В следующим перекате уберёшь.
Какой шанс, что популярность скакнет OVER 9000% как питухон в свое время "взорвал" интернеты?
2 года скриптов на питоне, потом смещено бекенд на JS/C++
Надеюсь, с выходом .net5 вакансий станет на 50% больше и я смогу конкурировать на 100к хотя бы
Есть демо версия. Как оно по твоему отображается? Особенно учитывая, что у них проверка лицензии оффлайн происходит.
Я пошарился в нугет-пакете, там дллки, насколько понимаю, сурсы с них не получить
Ясно. Пиши тогда сам, реализацию найдёшь на JS-е, перенести на WPF будет не сложно.
> сурсы с них не получить
да сурсы получить легко. просто они бесполезны же ведь это хамарин где ты описываешь хамлом содержимое, а потом рендереры пытаются на конечной оси пытаются это нарисовать средствами системы понативнее.
гугли. всегда можно что то да нагуглить
например вот https://www.codeproject.com/Articles/279704/iOS-UIPickerView-like-control-in-WPF
Спасибо, видел это, как раз собираюсь переделать, если ничего лучше не получится
Конструктор замени на статичный чтобы предотвратить возможность создать несколько таких таймеров.
В чём может быть проблема?
Вычищаю адаптацией вот этого https://github.com/Silv3rPRO/proshine-cleaner
если что. Из коробки она не работает, надо было допилить всякие штуки.
Излишние методы иногда ссылаются сами на себя (и тут мне надо кумекать алгоритм), но есть и такие, на которые ссылаются подлинные методы, но на самом деле нет
так делай таймер одноразовым, а калбек таймера пусть перезапускает таймер
или же сделай while(true) (на самом деле while ct.IsCancellationRequested) с кодом выполнения и await Task.Delay вместо таймера
И теперь вот не знаю, а как действительно лучше с именами классов поступать. Ну, просто сереьзно, все в моей галлере тупо делают 4 папочки: Models, Controllers, Data, Services иногда добавляя Const и Util и хреначат в них, потому чтобы как-то различать схожие по незнанию сущности приходится изебываться как не в себя, потому что вот у нас есть User, и есть еще один User, один это от Identity, другой внутри приложения, и когда они встречаются в рамках одного класса получается какая-то залупа, потому в конторе придумывают всякие AppUser, и прочую странную фигнюа ведь серьезно просто Identity.User, Application.User - все понятно и при этом вроде норм смотрится.
В общем, объясните, как вы именуете классы, как неймспейсы используете, как папочки и расположение файлов у вас организованы, потому что чаще всего я примерно как у нас на гитхабе вижу, но мне вот как-то оно не нравится, как-то оно просто при росте кодовой базы превращается имхо в какой-то пиздец и удобнее было бы, наверное, папочки скорее по фитчам разбивать. Короче, делитесь своими секретиками, как проект количество файлов с иходным текстом в котором перевалило за 500 держать в структурированном состоянии, чтобы искать было просто и чтобы не было проблем с пониманием какая сущность где.
Да, проблема у нас еще в том, что никто не хочет брать на себя работу сделать какие-то общие библиотечки и вынести то что часто пользуем в отдельный проектик, потому получается вот такая срань: Ты пилишь свой микросервис, изначально что-то общее скопипастил из другого, потом идет время, в том куске что-то поменялось, а тебе не хочется менять свой код, потому что оно-то работает у тебя и ничего тебе нового не нужно, и получается что куча дублирования. Я говорил: "Давайте вынесем это в отдельную библиотеку, чтобы каждый раз этой хренью не заниматься", но мне говорят, что это лишняя трата времени и проще копипастнуть. Вот.
И теперь вот не знаю, а как действительно лучше с именами классов поступать. Ну, просто сереьзно, все в моей галлере тупо делают 4 папочки: Models, Controllers, Data, Services иногда добавляя Const и Util и хреначат в них, потому чтобы как-то различать схожие по незнанию сущности приходится изебываться как не в себя, потому что вот у нас есть User, и есть еще один User, один это от Identity, другой внутри приложения, и когда они встречаются в рамках одного класса получается какая-то залупа, потому в конторе придумывают всякие AppUser, и прочую странную фигнюа ведь серьезно просто Identity.User, Application.User - все понятно и при этом вроде норм смотрится.
В общем, объясните, как вы именуете классы, как неймспейсы используете, как папочки и расположение файлов у вас организованы, потому что чаще всего я примерно как у нас на гитхабе вижу, но мне вот как-то оно не нравится, как-то оно просто при росте кодовой базы превращается имхо в какой-то пиздец и удобнее было бы, наверное, папочки скорее по фитчам разбивать. Короче, делитесь своими секретиками, как проект количество файлов с иходным текстом в котором перевалило за 500 держать в структурированном состоянии, чтобы искать было просто и чтобы не было проблем с пониманием какая сущность где.
Да, проблема у нас еще в том, что никто не хочет брать на себя работу сделать какие-то общие библиотечки и вынести то что часто пользуем в отдельный проектик, потому получается вот такая срань: Ты пилишь свой микросервис, изначально что-то общее скопипастил из другого, потом идет время, в том куске что-то поменялось, а тебе не хочется менять свой код, потому что оно-то работает у тебя и ничего тебе нового не нужно, и получается что куча дублирования. Я говорил: "Давайте вынесем это в отдельную библиотеку, чтобы каждый раз этой хренью не заниматься", но мне говорят, что это лишняя трата времени и проще копипастнуть. Вот.
Статью не читал, подход хороший. Если модели в одном месте начинается "Customer", "SmallCustomer", "CustomerLight", "CustomerWithZalupa"... Особенно хорошо ложится на CQRS - модель вообще можно держать вместе с командой/запросом.
Но а что насчет
var time= offsetType/пусть это типа enum/ switch{
OffsetType.Day => DateTime.Now.AddDays(offsetValue),
OffsetType.Minutes => DateTime.Now.AddMinutes(offsetValue),
...
};
?
Просто мне кажется это удобнее чем городить кучу ифов или вообще ебануться и цепочку ответственности для этой херни делать. Вроде с ходу все ясно, при этом довольно компактно. Хотя я бака что в иногда достает из этого свича экшн, наверное так делать не стоит, но в общем случае же он все еще удобен и прост для понимания.
Так это проеб в архитектуре, а не именовании. Чем дольше откладывают рефакторинг, тем ближе всё становится к пиздецу.
Если нужно присвоить значение переменной, то удобней использовать switch-expression, особенно удобно когда нужно присвоить несколько значений - возвращаешь кортеж и деконструируешь его. Если нужно сделать какие-то действия, то лучше обычный switch, также он удобен когда несколько значений отвечают за одно и тоже действие.
Заменять обычный свитч можно только паттерном Состояние, когда ты вместо свитча создаешь состояния и присваиваешь их объекту который их принимает.
Какой пиздец. Пиздить по ебалу всех, кто region использует. Я их ещё в 2008 ненавидел, а теперь так вообще хочется выслеживать кодера с арматурой за такое.
Интерфейс - это контракт. А потом уже полиморфизм.
Ну вообще относительно вакансий под разные технологии смотреть СНГ в принципе глупо. Надо в первую очередь смотреть те страны, где эти технологии разрабатывают. Майки щас нет5 распиарят и через 1-2 года кол-во проектов и вакансий на нём попрёт в гору (в целом в них и щас недостатка нет).
Производительность хоть где нужна. Но у энтерпрайза как раз большое кол-во пользователей и, как следствие, трафика. У них есть такая фигня как SLA - https://en.wikipedia.org/wiki/Service-level_agreement
Часто требуется чтобы ресурс под нагрузкой полностью загружался в течении 1-3 сек. Мы умудрялись тяжёлые сайты за 200-500мс полностью загружать и отрисовывать, когда у тебя наплыв несколько тыщ юзеров разом. Клиенты тоже могут тебя ссаными тапками закидать, если им постоянно отклик ждать приходится.
У меня их 100, полёт нормальный. Под каждый набор сущностей свои репозитории.
Это не скроет кучу приватных полей и методов, хотя при чтении кода нужно зачастую видеть лишь внешнее поведение класса.
Ну блин, няша, вот я делаю имплементацию какого-то интерфейса, удобнее же взять и отделить ее #region. Получается оч удобно, конечно при условии что ты из этих имплементаций не тянешь что-то что в других имплементациях лежит, но я обычно так не делаю.
Да-да, все же в ДС живут и в каждом городе есть конторы, которые предлагают такие вот ЗП. В моем вот за шарписта с требованиями будто в гугл платят 80к рублей, это с 6 годами опыта.
Удобнее когда у тебя этот интерфейс лежит в отдельном неймспейсе. А регион только служит успокоительным вида "у меня не насрано в структуре приложения, потому что я по регионам разбил всё.
Так интерфейс и лежит в отедельном неймспейсе.
Просто банально нужно 2-3 интерфейса имплементировать в рамках одного класса.
Вообще, складывается ощущение что не нужно никогда, разве что наследуешься от совсем уж какого-то базового абстрактного класса в котором просто логика которая всегда и везде используется, а вот если уже брать уровни повыше, то получаешь ненужный обвес в наследство и проще вообще использовать только интерфейсы.
Вот и поясните, когда надо-то, а то мои попытки использовать наследование, когда иерархия состоит хотя бы из 3 уровней превращается в пиздос.
абстрактный класс - когда есть общий функционал и нужно будет написать имплементацию для методов у которых будет общая сигнатура, но разная реализация
класс - когда есть общий функционал (методы, свойства, поля), но тебе нужно его расширить.
Интерфейсом классы не заменишь хотя бы потому что у интерфейса не может быть конструкторов (в 8 версии можно объявить статический конструктор, констант (в 8 вресии может), полей.
предпочитай де-ле-ги-ро-ва-ние (чокнутый фильтр двача), кроме случаев, когда наследование выгоднее или так и должно быть
Гуляю по разной степени паршивости долгостроев. Не видел ConfigureAwait(false). В новых его тоже нет. ЧЯДНТ?
Гуляешь по говнокоду значит или по коду с UI
Ну или asp.net core где SyncronizationContext-а нет и можно не писать.
Но скорее всего по говнокоду, ведь рекомендация гласит - используйте везде ConfigureAwait(false) во избежание потенциальных дидлоков. Но это не значит, что дидлоки будут везде - потому народ и не пишет, пока не стрельнет
Опытный же программист пишет всегда когда не нужно иное.
Как бы, типичный случай - петушок громче всех кричит о том в чём совершенно не разбирается.
Просвещайся, петушок:
https://devblogs.microsoft.com/dotnet/configureawait-faq/
ты сам хоть читал что дал?
по твоей ссылке написано (впрочем и так все знают)
"Why would I want to use ConfigureAwait(false)
-Improving performance
- Avoiding deadlocks
"
впрочем тут ничего нового. и так все знают, что нужно ConfigureAwait(false), чтобы избежать дедлоков
но вижу не все знают что в асп.нет КОРЕ!!! нет такой крайней
нужды ибо
https://blog.stephencleary.com/2017/03/aspnetcore-synchronization-context.html
так что больше кумекай, а потом кукарекай )
>- Avoiding deadlocks
>нужно ConfigureAwait(false), чтобы избежать дедлоков
Избегает дедлоки использование ConfigureAwait(false) в случаях когда твой код используется в качестве импортируемой библиотеки. В этой статье это подробно описывается.
Ты же высрал:
> используйте везде ConfigureAwait(false) во избежание потенциальных дидлоков
Хотя в той же статье есть пример с использованием ConfigureAwait(false) в WPF/WF который приводит к дедлоку.
>но вижу не все знают что в асп.нет КОРЕ!!! нет такой крайней
>не все знают
Ну да, даже сам создатель не знает, спешите видеть (пикрил из статьи).
>в случаях когда твой код используется в качестве импортируемой библиотеки. В этой статье это подробно описывается.
ну я библиотеки часто пишу.
более того, любой модуль в программе рекомендую воспринимать как библиотеку. Сегодня он вызывается без контекста, а через годик может нарисоваться контекст, даже в asp.net core приложении.
Конечно если ты пишешь CRUD вебапи то конечно не будет, а если что-то серьезное где вовсю многопоток гуляет - там другое дело
>Ты же высрал:
во первых не я. это рекомендация
во вторых рекомендация ПОДРАЗУМЕВАЕТ не "писать везде", а писать везде, где явно не требуется true. Это ты решил воспринять слова буквально "пишите везде"
Рекомендация тоуба " if you’re writing app-level code, do not use ConfigureAwait(false)." указывает на слой UI (или рядом с ним) о чем и гласит пример в виде онклик, да и вообще дефолтный true из-за формоклепщиков, мол дидлок лучше чем доступ не из того потока (почему я хз - я не понимаю такой формулировки)
> Хотя в той же статье есть пример с использованием ConfigureAwait(false) в WPF/WF который приводит к дедлоку.
а зачем тут ConfigureAwait(false)? ConfigureAwait(true) по дефолту и придуман именно для UI. И я про UI тоже упоминал, раз ты читаешь все буквально.
>Ну да, даже сам создатель не знает, спешите видеть (пикрил из статьи).
из той же статьи (пикрил)
ты и меня читаешь невнимательно и свои же ссылки
Программисты делятся на 2 вида
кто еще не ставит ConfigureAwait(false), там где контекст явно не нужен и оставляет "ну вроде работает же и так будет всегда"
и кто УЖЕ ставит ConfigureAwait(false).
Я из тех кто уже.
Это помимо либ, где без этого вообще никуда
впрочем так то я юзаю Fody и он за меня ставит, но считаю это костылем.
Удивляюсь что мс не сделали что то типа
await
await!
вместо длинннннючего ConfigureAwait
А что тебя держит в твоём городе?
Я свалил из вонючей мухосрани в ДС вообще без подготовки и плана, просто заебала беспросветная совковая нигерия в снегах без перспектив и надежд. Поначалу спал в хостелах с гастерами, всё ценное носил с собой в рюкзаке (большом и желтом, хе-хе), учил питон, и уже через 3 месяца работал в тёплом офисе и снимал комнату на одного. А через год жил уже совсем как белый человек.
Допустим я не хочу жить в хостеле, а при текущей ЗП чтобы снимать даже студию я должен, минимум, год откладывать(имеется ввиду заплатив за полгода вперед, конечно, я же если решу ехать хочу быть уверен что закреплюсь, а не просто приеду, попержу в студии и поеду обратно), при этом я не знаю города, я не умею заводить знакомства и не хочу просто сыграть в рулетку. Оставаясь тут, есть ненулевой шанс, что таки либо станет все лучше со временем(у дедек старше же ЗП больше), либо таки подвернется шанс. А поступать импульсивно - ну такое.
мимо
Нет никакой лотереи. Чем быстрее перекатишься, тем раньше начнёшь нормально жить.
Курьер в яндекс-яде или аналоге получает 200 руб./час. Это самая тупая работа, куда берут всех. Если работать 20 дней в месяц (2 дня через 1) по 12 часов, то чистыми на руки получишь 42к. Из них 15к отдашь за комнату. На остальное живешь, на жрать без изысков, связь, на шмотки, мыльно-рыльное хватит. Параллельно ходишь по собесам, ботанишь и восполняешь пробелы в знаниях. На работе в плеере английский (аудиоуроки) учишь.
Если у тебя есть опыт работы несколько лет в твоей мухосрани, то тебя в принципе на первом же собесе в ДС возьмут на зп, большую чем в мухосранях, этак в 1.5-2 раза, а если поискать побольше, то и оффер будет пожирнее.
Нет, конечно я понимаю, ты не хочешь жить в хостеле. Только, анон, пойми, там и не живут, там спят. В остальное время ты работаешь. В выходные сидишь в кафе с ноутом. Кроме того, не бывает так, чтобы всё и сразу. Да, вначале потерпишь, зато потом профиты перевесят все эти мимолётные невзгоды.
Мне реально жалко людей, которые живут в глубинке, которые пашут, но получают гроши, в то время, как московские линивые бездари гребут бабло деньгами, нихера не знают, нихера по сути не делают, и ещё и не довольны чем-то.
>Если работать 20 дней в месяц (2 дня через 1) по 12 часов
Я думаю, очень мало кто в таком графике сможет что-то учить в свободные дни.
1-5 методов в каждой репе, знания об источнике данных не выползают из Persistence слоя вообще.
_alertsRepo.Exists(alertId);
_usersRepo.LoginAttemptsFor(userId);
_recordsRepo.LastYearRecords();
Вообще тут 2 стула:
- пишешь больше кода, но имеешь легко поддерживаемый и масштабируемый проект;
- пишешь меньше кода с одним классом/методом под миллион не до конца определённых нужд, но страдаешь при расширении проекта, от внезапно изменяющихся требований, от притаившихся на несколько месяцев багов, от merge конфликтов.
Всё проще - нужно отправлять старпёров, тащущих свои техники разработки из эры динозавров, на пенсию. Или хотя бы на переобучение. Код станет чистым и никто не будет беситься.
Прикол в том, что эти старпёры до глубины души уверены в своей правоте и своих техниках. Но они лихо разбиваются об реальность, когда им начинают выставлять метрики.
Был джуном/мидлом, следовал стандартам, которые установили деды. В эти стандарты входили несколько классов в файле, классы на 1к строк кода, #region, #pragma, и прочий индусский код.
Потом начал усиленно учить паттерны проектирования, алгоритмы, смотреть за конференциями, читать код крутых чуваков и всё это мракобесие само собой отвалилось.
Получается так, что без использования #region работа ускоряется. Можно замерить сколько времени уходить на чтение, написание и понимание кода. Убрав весь мусор из класса я трачу в 2-3 раза меньше времени чтобы выполнить те же самые задачи. У меня получилось это доказать местным дедам в двух разных конторах. Пришлось повозиться с презентацией, подборкой примеров из текущих проектов, переписыванием их по новому.
Я за 15 лет асбтрактных классов так и не понял. Тоже обычно или интерфейс или какой-то совсем базовый класс, типа Entity, у которого только Id есть.
Все проекты, в которых приходилось работать с асбтрактными классами - это индусский говнокод, 10+лет легаси, которое разваливается на ходу, и учебка.
>1-5 методов в каждой репе
маленький какой то проект
>_recordsRepo.LastYearRecords();
а потом понадобится фильтрация для этих рекордсов и понеслось
но раз у тебя 1-5 методов значит "не понадобится". Обычно это не так - обычно надо и надо и методы либо множатся либо пухнут
это базовый класс, который нельзя инстанцировать, что хорошо если нужен базовый класс, который хотелось бы чтобы нельзя было создать инстанс и обязательно делали наследника. Попутно дается возможность заставить наследника реализовать нужные методы.
И полезен он там, где собственно такое и нужно. Зону использования абстрактного класса нечем заменить. У интерфейсов другая ниша.
Абстрактный класс можно использовать как интерфейс, но не всегда наоборот.
В общем адски полезная вещь там где он нужен
Я знаю всё что можно знать об абстрактных классах (с точки зрения их пользователя). Они мне ни разу не пригодились. Приходится с ними работать только тогда, когда у тебя уже куча легаси или когда проморгал код ревью. Но не отрицаю, что под какие-то задачи с определённой архитектурой они могут нормально ложиться.
От них веет жавой, а в жаве с написанием красивого кода беда.
>Они мне ни разу не пригодились
>Приходится с ними работать только тогда, когда у тебя уже куча легаси или когда проморгал код ревью.
>От них веет жавой, а в жаве с написанием красивого кода беда.
Ты же сам себе противоречишь. Это что-то уровня "Мне обувь ни разу не пригодилась. Приходится ей пользоваться только когда ноги в говне или отморожены".
Мне вот например наоборот сложно представить код в котором нет применения абстрактному классу. Вот есть у тебя функционал, часть этого функционала общая, а другая часть зависит от чего-либо, но при этом этот функционал используется в обобщенном коде.
Что ты применять будешь? Интерфейс? Но тогда весь общий функционал придётся переписывать каждый раз когда ты его наследуешь. Класс? Но тогда тебе каждый раз придётся запоминать/смотреть какая часть функционала используется в обобщенном коде. Вот здесь нам и приходит на помощь абстрактный класс - в нём можно оставить общий для всех функционал, а конкретный для каждой реализации, но используемый в обобщенном коде, объявить в виде абстрактных методов и свойств, таким образом каждый раз наследуя этот класс, т. е. каждый раз имплементируя конкретный функционал, компилятор будет за тебя создавать шаблоны тех методов которые используются в обобщенном коде, тебе останется написать реализацию для них, тебе не нужно смотреть этот обобщенный код.
>100+ сущностей
и к каждой сущности по выборке требований всего ничего (видно по 1-5 методов)
>Что ты применять будешь? Интерфейс?
Композицию. Рано или поздно упрешься в множественное наследование, которого нет в C#.
Да, я знаю что можно взять тупо VPS сервер и будет тоже самое и годовая цена будет как за плату(хотя плата вроде помощнее), но я хочу именно физическое устройство, которое рядом, к которому я имею непосредственный доступ и чтобы когда решу свернуть сервера можно было что-то еще замутить из этого.
Разверни серверлес на амазоне или ажуре. Бабки будет чаржить только за использование. Не используешь - не платишь.
Посмотрел я по ценам там и не думаю что это выгоднее платы будет если я захочу не тупо 1 бота туда закинуть, а скажем наращивать их количество. Чего я и хотел бы делать в будущем.
Плюс я это не для коммерции делаю, а чисто для удобства.
К примеру на дискорд канал закинуть бота который из моей базы по запросу что-то выдавать может или в телеграмме сделать бота который будет видос с ютуба качать и скидывать сообщением (да да, очень нужно когда интернет на мобилке не стабилен).
Это на азуре может дорогого стоить если активно юзать.
>>851895
>надежный инет
Судя по роутеру надежный. Да и мне даже 99% аптайм избыточен, 95% за глаза хватит.
>белый ip нужен
Есть такой, провайдер давал давным давно бесплатно и у старых клиентов не отобрал.
Хотя мне больше для ботов нужен сервак.
>плату еще где то разместить нужно
Под столом рядом с основным компом, там места дофига, да и кушает копейки эта система.
Вопрос лишь в том что брать и насколько сложно с этим работать.
Опыта в этом у меня даже не 0, а скорее -1.
Потому что дизайн нормальный, когда не нужно изворачиваться и выдумывать как впихнуть невпихуемое
>Ты же сам себе противоречишь.
чем? легаси никто не трогает, его переписывают и потом отключают навсегда.
когда проморгал в код ревью, возвращаешься назад, выпиливаешь и даёшь по рукам девелоперам и больше так не делают.
Первая ссылка - то, что хотел. Спасибо, чел.
Последний зарегистрированный сервис типа IService, TImplementationбудет добавляться в конструктор если в конструкторе ты укажешь просто ClassConstructor(IService myService);
Для того чтобы выбрать какой-то определенный, тебе нужно добавлять в конструктор IEnumerable<IService> myServices
ClassConstructor(IEnumerable<IService> myServices);
Далее в теле конструктара ты можешь либо перебором выбрать нужные сервис, либо написать:
TImplementation service = myServices[0] as TImplementation;
Таким образом ты получишь первую зарегистрированную имплементацию.
я не первоначальный анон. У меня нужды нет.
А оно такое, что конечный класс объявляет контракт "я принимаю себя такое" и дело уже внешней стороны впихнуть его зависимости. Даже если будет фабрика собирать. Просто фабрики это руками писать, а лениво.
Можно обернуть в один класс вида SomeServiceResolver, в котором будет метод IService GetService<implementation>() который будет возвращать определенную имплементацию.
Далее регистрируешь SomeServiceResolver как синглтон и внедряешь в конструктор зависимых классов у каждого вызывая GetService<ConcreteImplementation>();
А это уже ServiceLocator, что антипаттерн.
Фабричный метод зафигачить - не антипаттерн просто руками делать. И даже ActivatorUtilities не поможет.
например в SimpleInjector можно указать условие "если впихивать в этот класс, то эту имплементацию"
DI от майков ущербен в этом плане.
>Ну и как ты этот метод вызывать будешь?
services.AddTransient<MyService>(p=>и тут собираем его руками подсовывая свою имплементацию IService)
это работает и по факту единственный нормальный вариант
но уж больно ручной
DI через КОНТЕЙНЕРЫ - это самая САМАЯ КРУТАЯ И ПОЛЕЗНАЯ КОНЦЕПЦИЯ
Что такое писать в стиле ООП? Это классы как кубики. из этих кубиков мы сооружаемся что-то, потом пнули его и оно заработало. И контейнер позволяет сконфигурировать это сооружение и подменить любую его часть на нужную, перегрузив тем самым часть функциональности.
Без этого же мудрят разные точки расширения, которые использовать нужно по правилам, где то по особому регистрировать.
А контейнеры делают все это тупо проще. Единая точка расширения и переопределения.
В общем имба самая настоящая.
Это про все ООП. А F# никто в реальных проектах почти не использует.
Интерфейсы в конструкторе это зависимость кубиков от других кубиков. Так что самая суть
И поскольку кубики и их зависимости собираются в одном месте и автоматически, то потому и можно кубики на свои менять если нужно расширить че то
люто удобно.
Так его уже со всех сторон обсосали. Обычная галочка, ничего грандиозного.
Уже джва месяца жду! Буду пытаться один из самых маленьких сервисов конвертировать и тащить новый docker image - https://hub.docker.com/_/microsoft-dotnet-aspnet/
Пару недель назад пробовал собрать self-contained образ, получилось 80Мб без тримминга - /p:PublishTrimmed=true
https://docs.microsoft.com/en-us/dotnet/core/deploying/trim-self-contained
С трим опцией должно вообще 40мб получиться.
Для сравнения наши текущие образы в районе 300мб. В джава отделе - 400мб. В пхп отделе - 4ГБ! Хз чё они там делают, но это пистец.
Кор 3.1 сервисы уже уделывают джава сервисы по скорости, а с net5 вообще шансов не будет.
Ставлю 100 рублей, что перенесут
так то нет связи наличия или отсутствия IoC с тем, что на скрине.. Ну вообще нет.
Так кто про отсутствие IoC говорил? Она там есть, просто код раздувается когда нужно внедрять зависимости, а в асп.нет за тебя всё фреймворк делает.
ты скрин выдал и записку про DI прилепил и мол без этого будет как на скрине
я же отметил, что вообще нет связи скрина с DI
То у тебя IoC, то DI, запутался в терминах? На скрине тебе нужно внедрить в качестве зависимости обобщенные типы, при этом эти типы взаимодействую друг с другом, в итоге получается такая простыня из перечислений типов.
не запутался
DI это концепция, упрощенно "впихивай зависимости извне". а в DI подходе в ASP.NET чего то уникального нет- там базовая концепция "инъекции через конструктор" (исключая Startup класс, который уникален, но не из-за DI)
А значит фраза " DI как в ASP.Net" говорит про контейнер. И даже если нет, то это неважно, ибо на скрине определение generic класса, к которому использование или не использование DI не имеет никакого отношения
был бы на скрине конструктор, который принимает всю эту кучу параметров - тогда можно было бы спориь на тему "вот без DI так, а с DI этак".
но определение generic класса и "инверсия зависимостей" (или отсутствие таковой) есть перпендикулярные вещи
>На скрине тебе нужно внедрить в качестве зависимости обобщенные типы
из скрина этого не следует. аж вообще не следует. этот класс может быть с легкостью с пустым конструктором и не нарушать DI во время использования
я не спорю, что он пиздец. Я оспариваю лишь связь с DI, мол с DI будет все не так
DI это про зависимости. а не про дженерики, так что никак он не влияет на сигнатуру класса. DI влияет на то, как потом все это будет попадать внутрь. Но оно вполне может попадать и со временем и вообще внутри быть изначально (хотя это не следует из названия класса, но мало ли в какой области приложения этот класс обитает)
то есть если обладатель этого класса прочитает по DI то в итоге он переделает конструктор и всё. сигнатура останется прежней ибо связи нет
Программист это про борьбу с ошибками. Ты опять хочешь лишить нас последней работы за 50к?
>Ты опять хочешь лишить нас последней работы за 50к?
а такая еще есть? это ж зарплата недонедонедоджуна
> Программа компилируется - значит программа работае
Обратная совместимость, слышал про такое? Никто не уберет из шарпа наллы или сделает варнинги компайл тайм ошибками.
>или сделает варнинги компайл тайм ошибками.
ну так то это есть. просто не очень игноры в ней работают.
Сисяшарперы.
на джуна 32 тысячи сейчас
Там 4 обобщенных класса которые входят в 1 класс, при этом эти 4 обобщенных класса должны взаимодействовать друг с другом, т. е. некоторые из них имею ссылки на других. Чтобы всё это реализовать нужно создавать объекты последовательно, потом внедрять их в конструкторы других и тд, либо можно сделать так чтобы у 4 обобщенных классов была ссылка на 1 класс в который все они включены, что приводит к вот такому перечислению обобщений.
Но если делать всё в рамках ASP .Net то 4 класса регистрируются как службы в виде конкретных реализаций и автоматически внедряются в зависимости от присутствия друг друга в конструкторах других классов.
>Там 4 обобщенных класса которые входят в 1 класс, при этом эти 4 обобщенных класса должны взаимодействовать друг с другом, т. е. некоторые из них имею ссылки на других.
контейнер - по факту автофабрика, но ничего не мешает описать то же самое кодом. И описывается же - в языках где с типами все плохо или в андроидах, где влом разбираться с идиотским контейнером.
Контейнер добавляет удобства не писать ручками инстанцирование и упрощает именно этот аспек "сборка графа", но не является магическим артефактом и то, что соорудил автор кода на скрине - его личное видение кода, а не вынужденная мера "а по другому низзя"
Ну так я про это и говорил изначально - ASP .Net удобное упрощение, не нужно писать всё в ручную, при этом код получается чище. Разве не для этого фреймворки нужны?
>ASP .Net удобное упрощение, не нужно писать всё в ручную,
вообще то оно там ОБЫЧНОЕ
1 сначала мы имеем классы, которые делают много.
2 потом узнаем про SRP и делим все это на классы, но зависимости инстанцируем на месте
3 потом узнаем про DI и его плюшки в виде "можно подменить зависимость на другую" и начинаем принимать в конструктор, да по возможности вообще интерфейсы дабы можно было подменять
4 как следствие возникает код, который должен инстанцировать этот граф. пишем руками - это норма
5 понимаем, что можно писать не руками, а доверить рантайму сгенерить за нас этот код сборки - и рождаем контейнер.
А где же тут то, что на скрине? а нигде. Абсолютно никакой связи. Сигнатуры классов до контейнера и после него абсолютно одинаковы (а почему бы им быть разными - мы всего лишь позволили писать код рантайму вместо ручек)
А код на скрине - безумная фантазия какого то программиста, а не "мир без DI"
>ASP .Net удобное упрощение
так то DI от мелкософта - самый примитивный по фичам. Просто он встроен не как раньше только контракт и приходится использовать его или городить огород.
>а не "мир без DI"
Код на скрине это "мир с DI без фреймворков которые за тебя делают большую часть", не понятно почему ты захотел увидеть что-то другое, попахивает шизой.
>Код на скрине это "мир с DI без фреймворков которые за тебя делают большую часть"
ок. уйдем от DI. наличие или отсутствие фреймворков тоже не заставляют рождать такой код. Да вообще НИЧЕГО не заставляет, кроме безумия или лютой неопытности программиста.
попытка натянуть сову на глобус "или берете DI и фреймворки или у вас будет такое..." обречена на провал, потому что "такое..." не будет.
Без фреймворка больше ручной работы, а не априори говнокод. да и фреймворк не помешает родить то, что на скрине и зарегать это в контейнер.
Фреймворк создаст условия которые позволят упростить код, при этом функционал не изменится.
>Да вообще НИЧЕГО не заставляет, кроме безумия или лютой неопытности программиста.
Так тебе задачу описали. 1 класс обобщенный с общей логикой для различных конкретных реализаций, и n классов которые наследуют общую логику от базовых классов + предоставляют свою, конкретную для каких-то определенных методов. У каждого из этих классов, кроме 1 обобщенного есть несколько реализаций, при этом какие-то из этих n классов взаимодействуют друг с другом. Как ты собираешься всё это реализовать по-другому? У тебя либо ничего не получится, либо получится говнокод, либо получится тоже самое что на скрине.
Вот фреймворк и сокращает объем этого описания, потому что внедряет зависимости автоматически, если ты следуешь определенным конвенциям.
фреймворк дает архитектурный каркас, что позволяет избежать разброда и шатания архитектурных решений в коде и готовые реализации разного функционала
>Вот фреймворк и сокращает объем этого описания
твою задачу решает не фреймворк, а IoC контейер, который по факту просто библиотека, которая используется фреймворком для своих нужд.
выброси асп.нет/возьми другую либу IoC (коих дохрена) - и твоя задача "потому что внедряет зависимости автоматически" будет решена.
Я использую DI от мелких и подход как в асп.нет коре вида services.AddFooBarModlue() вообще в WPF проекте, и в консольных приложениях тоже.
у тебя встала задача "автоматического внедрения зависимостей" и контейнер IoC решил тебе ее. asp.net core тут сбоку стоял.
>Как ты собираешься всё это реализовать по-другому?
хз. это сильно абстрактная задача
>У тебя либо ничего не получится
получится. IoC контейнер решает свою задачу, но это не значит, что в остальном мире говнокод. Собственно код идентичный - различается лишь composition root
> либо получится тоже самое что на скрине.
не. такое точно нет. у меня мозг не родит такое, а обойдется более простыми решениями.
Я просто никогда не преобразую такое "этих n классов взаимодействуют друг с другом" в то, что на скрине. Общаются? - значит через интерфейсы знают друг о друге. Если контейнер решает задачу, то она ТОЧНО ТАК ЖЕ решается и без контейнера, ведь контейнер решает только задачу сборки графа объектов. А то что на скрине - хз. больше похоже на кривой медиатор, чем на общий нужный всем абстрактный класс
У нас тыщи контейнеров крутятся в AWS/GCP. Как бы 100мб vs 4гб в итоге в дохрена разницы вываливаются в куче разных метрик. И $$ превращается в $$$$$.
По идее через 2 часа объявят о релизе
пока нет обновления на студию - можно сказать, что не вышел
Не видел чтобы оно само обновлялось. Разве что со студией прилетало.
какой то спорный по фичам релиз получился
ну и как обычно всегда "мы наконец то докумекали"
вот как с IReadOnlyList они потом ввели
как с нуллами
а теперь вот и с ламбда static (даже пхп умнее лол)
Зачем учить Шарп в 2021? Без тралленка. Какая сфера интересов и целей у людей, выбирающих шарп? Где вы видите себя применяя этот язык?
Бэк на ASP .NET Core + EF Сore, фронт на Angular.
Из самых больших направлений: веб, геймдев, мобилки, облака. В основном это какие-то огромные агрегаторы, где черт ногу сломит.
Теперь на нём что угодно пилить можно. Даже всякие CLI тулзяки. Пилится быстро, компилится куда надо легко и весит мало.
С Blazor можно переставать учить жабаскрипт. Вакансии потихоньку подтянутся.
>С Blazor можно переставать учить жабаскрипт
Нельзя. Иначе придётся пилить кучу велосипедов, вместо использования готовых решений.
Ну так у любой новой технологии в начале мало пакетов и тулзяк. Их за год настрочат дофига. Хотя в случае с Блэйзор у него уже много чего из коробки есть и можно подключать существующие нугет пакеты.
Любой не примитивный, анимированный элемент интерфейса, который приятно выглядит.
По части юи обычно прилепливается какой-нибудь богомерзкий кендо юи, который нехуя не красивый, не приятный и не упрощает разработку. В конечном итоге все в велосипеды заканчивается и проклинаются дятлы, которые всякого дерьма в проект натащили. Или твоя-любимая-юи-либа-нейм зарастает хаками.
С другой стороны, например, есть всякие визивиги, но кастомеры срать хотели на дефолтные возможности визивига и на то, что оно в ишаке не работает.
Хотя, круто очередной раз фиксить выпадающий список в популярной либе.
Соре, не имею ничего против формошлепов, там без б лучше реакт и коробочный ангулар. С тем же успехом можно пойти дальше и использовать цмски на шарпе.
если бы на фронте был не говножс, а что то вменяемое, то и блазоры были бы не нужны.
Так правильно, красноглазые с++ девы (читай ржавые), только недавно релизнули WebAssembly. Технология еще довольно молодая.
Это библия .Net, ты её должен прочитать и не один раз, а несколько, после чего держать под рукой и обращаться при любой непонятной ситуации.
Сижу на 10 студии до сих пор, мне норм
а решарпер еще не готов (
хочешь что то одно - тащишь гигабайт говна
"Big news: Avalonia is now supported in ReSharper with our complete toolset – code completion, navigation, support for bindings, and quick-fixes for creating all sorts of Avalonia properties. We will continue polishing this support, and we are very interested in your feedback. "
можно учиться на своих и чужих ошибках и больше так не делать
Изучай паттерны и применяй их на практике, смотри чужой код. Сначала будет сложно и не понятно, но первая программа написанная с применением паттернов и соблюдением принципов SOLID тебя сильно обрадует.
> Изучай паттерны
Так изучаю. Просто применяешь, а потом новые требования или уточнения появляются из-за которых этот паттерн скорее мешается.
> смотри чужой код
Смотрю. Но если смотреть коллег - то там просто хреначат простыню в 4к строк в каждом классе и заебись. А на гитхабе создается впечатление что задачи были ясны сразу и не было такого: Сделай эту штуку, ту, ту и ту. Ты сделал, говоришь что все готово, а тебе говорят: Ну, вообще-то заказчик мудак и он хочет не те две шутки а вон ту-ту и эту штуку и еще в довесок такой вот функционал и чтобы на самом деле твой софт потреблял не больше 100мб оперативки и использовал вот эти вот штуки, т.к. у них там уже есть что-то и они хотят твою хуевину к своей присобачить.
> Просто применяешь, а потом новые требования или уточнения появляются из-за которых этот паттерн скорее мешается.
Значит не правильно применяешь. Паттерны как раз и создавались для того чтобы в код без проблем можно было вносить изменения и новый функционал.
Частой ошибкой новичков бывает желание сразу описывать классы и взаимодействие между ними, а потом уже исходя от этого описывать действия для выполнения нужных задач. На самом деле нужно начинать написание кода с того что он делает, а потом уже подстраивать под него классы, создавать интерфейсы. Еще не нужно стараться подстроиться под определенный паттерн, на начальном этапе нужно просто писать код и придерживаться общих правил, а определение необходимого паттерна придёт по ходу написания кода.
А что еще есть? Динамикодрисню учить я не хочу, на плюсах ебаться с атавизмами си тоже. Остается джава и хипсторские языки без вакансий. Джава противная, на хипсторских языках нет работы.
В результате остается шарп - нормальная типизация, сахарка больше чем в любом хипсторском языке и тонна вакансий. Если знаешь другой такой же язык, то говори.
А что там учить-то? Я вот в ВУЗе учил плюсы, предложили работу на шарпе, за неделю освоился и пошел работать. Это же оч простая штука, причем все из коробки, сейчас все нужное ты ставишь нугетом, я как вспомню, как с ебучим Make разбирался, как подключать библиотеки нужно было в плюсах, сколько ебли с тем что какой-то компилятор отказывается компилировать твой код из-за того что в одной из либ что-то сделано с каким-то не совсем стандартным способом, аж в дрожь бросает, а тут все просто, понятно, работы достаточно, платят нормальные деньги. Короче, учить там ничего особо и не нужно оказалось-то, после плюсов-то, сами либы что в стандарте - для всего буквально есть и тебе не нужно даже думать о том чтобы свой велосипед делать. Короче, чил, легкие деньги и работа на расслабоне. Я не понимаю скорее как кто-то в 2020+, выбирая не фронтенд - выбирает не шарп. Ну, допустим в городе твоем нет вакансии с шарпом, есть только джава, тут ясно, но куча всяких шизов лезут в Го, в Раст, в питон, прости господи. Вот зачем они это делают? Почему вообще тогда бы фортран не взять, а потом верещать всюду, что на работу не берут.
Он её обогнал, потому что некий Гугл распопуляризовал его через всякие универы, конференции, тулзяки. И на нём было удобно быстро накидать каких-то формул и выборок данных и повертеть этими данными всяко разно для какого-то анализа. Не надо было во всякий дата саенс погружаться, просто взял и сделал. У учёных можно и 10 дней для результата программы подождать, лол.
Короче он стал популярным просто потому что. Удачное стечение обстоятельств. Так то шарп (кстати оба, и си и эф шарп) круче питона. Но Гуглу будет впадлу на Майкрософт подсаживаться, поэтому они будут продолжать пилить свои Го. Уж лучше бы в Раст вкладывались, ей богу.
Очепятка, имелось ввиду что дата сайентистам не надо погружаться в компьютер сайенс. Data science то им как раз нужен.
Я уже 2 часа пользуюсь :)
Тоже наслаждаюсь рекордами и инитами.
Те кто пишет кучу DTO и вообще обмазывается CQS то рекорды это как божья роса.
> Частой ошибкой новичков бывает желание сразу описывать классы и взаимодействие между ними, а потом уже исходя от этого описывать действия для выполнения нужных задач. На самом деле нужно начинать написание кода с того что он делает, а потом уже подстраивать под него классы, создавать интерфейсы
Предлагаешь нахуярить говна в один класс, а потом раскидывать это всё по разным классам и чистить вилкой?
Это понятно, но структы создают когда нужны immutable типы с value semantics, и рекорды как раз такие (сравниваются по свойствам, а не по ссылке), к тому же имеют удобный синтаксис для создания и копирования. По-моему в большинстве случаев где раньше бы использовался struct теперь удобнее использовать record, не?
а где раньше использовался структ? чтобы в кучу не срать. Другого смысла для использования struct со всеми его побочками нет
> и рекорды как раз такие
Сначала были records в паскале и диды с удовольствием юзали их. Потом диды-сишники сделали структы - аналог паскалевых рекордсов и благостно урча тоже юзали их, но снабдили их некоторыми свойствами классов. Диды-паскальщики глядя на это, обзавидовались и создали новую спецификацию паскаля, в которой рекордсы так же обладали некоторыми свойствами классов.
И вот наступил сегодняшний день и ньюфагам тулят старые добрые рекордсы паскаля под видом чего-то нового и модномолодёжного. Прикольно быть дидом и видеть всю историю своими глазами.
мимодед
Сильнее всего проиграю, когда ньюфагам впарят в сишарп бегин энд, как более кодокондуктовое новшество вместо "устаревших скобачек".
всё тот же мимодед
Оно туда и идет
Код уже сложнее читать с этими новыми using
Приходится в голове вычислять где будет диспоз вместо явного блока
Теперь вот их
с <5 or 25
тоже сложно читается
Да и вообще куча всякой ерунды что и не упомнишь в силу их "а реальная польза где "
ну это твой личный подход такой.
не все IDisposable прямо уж так нужно диспозить, но в основном нужно. Неча ресурсы удерживать больше необходимого
сам по себе Disposable кривой паттерн, но стандартно используется именно он
1) как ебануть функцию расстановки живых перед началом игры, чтобы не прокликивать на клаве 400 клеток вручную?
2) если захочу ебануть это в винформс, чтобы мышкой выбирать, сложно будет реализовать выбор клеток и отрисовку игры?
винформы вообще не юзал
Предлагаю начинать реализацию с места входа программы. Т. е. с метода Main, допустим у тебя там будет создание класса, который будет выполнять всю логику, тогда ты пишешь:
var dispatcher = DispatcherFactory<DefaultDispatcher>.Create();
dispatcher.Run();
Далее ты переходишь к созданию класса DispatcherFactory и его метода Run. И так по цепочке.
Таким образом ты сразу понимаешь какие классы тебе нужны, а какие не нужны. Если сразу пытаться представить эти классы в голове, то обычно пишешь много лишнего и в целом написать потом общую логику сложнее.
Чтобы утечек памяти не было в случае когда объект использует ресурсы системы.
Нет, это хуйня какая-то, там половины функций обычного ListView нет
>как ебануть функцию расстановки живых перед началом игры, чтобы не прокликивать на клаве 400 клеток вручную?
Рандом или читать из файла.
>если захочу ебануть это в винформс, чтобы мышкой выбирать, сложно будет реализовать выбор клеток и отрисовку игры?
Не особо, только сетку программно создавай.
ну хз че оно так долго. в Items та же коллекция что ты прибиндил (если ты конечно его используешь) и достать элемент из коллекции это ж константное время
другое дело достать вьюху для элемента
это выделение новой добавленной строки что ли? лучше доверить это декларативщине
ну хз. набросал на коленке пример где листвью(гридвью) на 100к элементов и выделение нужного элемента с индексом 90к да с автоскролом на него
все мгновенно
Даже не знаю тогда, у меня, конечно, завязана всякая хуйня на это выделение, но тормоза идут именно в строчке
view.SelectedItem = view.Items[newRow]
>view.SelectedItem = view.Items[newRow]
ну я выбираю из ориг коллекции (к которой бинд делаю). впрочем даже так
SelectedItem = (Item)ListView.Items[90000];
результат тот же
http://paste.org.ru/?cwilch
даже на миллион чуть чуть медленнее
ты там проверь не убил ли ты виртуализацию
в частности не перегружал ли шаблон
ну я убивал виртуализацию когда перегружал шаблон тем что в инете находил и оно было неправильное.
ну это кроме явного выключения виртуализации
больше способов не знаю.
так то с листвью редко работаю -только когда нужна скорость, а датагрид сильно медленнее
я включил виртуализацию и переход такой же быстрый, но сама первоначальная загрузка списка очень долгая.
она там и так включена. впрочем неважно же. на переходе не тормозит
попробуй мой пример у себя и посмотри в чем разница с твоим подходом
можешь разделить свое
view.SelectedItem = view.Items[newRow]
на 2 строки и поймешь конкретно в какой тормозит.
хотя 99% на SelectedItem из -за вызванных побочных эффектов которые ты накодил на смену выделения
ну и конечно я говорю про биндинг вариант использования листвью. напрямую я его никогда не заполнял
Ладно, спасибо
> И вот наступил сегодняшний день и ньюфагам тулят старые добрые рекордсы паскаля под видом чего-то нового и модномолодёжного.
Их тулят как модную ФП фичу из хаскеля и фшарпа. Я конечно не дед и паскаль не изучал, но сомневаюсь что рекорды в нем основаны на иммутабельности и аналоге with expression.
Обновил сегодня студию на работе. Два раза намертво зависала во время отладки, протекая памятью из зо всех щелей. Один раз оставил её в таком зависшем состояния на 10 минут (посрать бегал, да), прихожу, а она к тому моменту уже 6 гб оперативы выжрать успела.
Вроде как не должно же быть проблем если я мигрирую на него вот так вот? Или лучше не испытывать судьбу и уже в другом проекте плюшки 9 шарпа попробовать?
Не думаю, что с обратной совместимостью чето будет.
А вот с тем, что на прод сервере может не быть нет 5, проблемы будут. Проверь что он есть или если юзаешь докеры, что там уже есть образ с ним.
Скорее всего, само обновление особых проблем не доставит, но если ты начнешь перепиливать что-то для "попробовать новые фишки", проблем масса может вылезти. Оно тебе надо за неделю до релиза? Кроме того, 3.1 дольше поддерживаться будет.
но в реале уверенно можно переходить не ранее 5.1.
А щас переходить просто потому что "хочется пощупать новые фичи"
Новичок так не напишет. Он понятия не имеет о каких-то диспетчерах и фабриках и вообще о том, что можно логику в два класса распихать. Не зря же интернет наводнён вопросами типа "как передать параметры из одного класса в другой?". Да я и сам такой был. Какие-то там паттерны проектирования. Вот тебе класс на 10к строк кода. Работает и фиг с ним.
Это щас кажется что это всё просто. Но когда только начинаешь, то все эти красивые слова - это всё пустой звук. Прям совсем пустой. Вообще абсолютно никакого понимания.
dispatcher.Run(); - это уже пиздец магия и чтобы сюда новичку дойти, придётся пол года книжки/статьи читать.
Я сначала прочитал книгу + возвращался к кратким статьям в интернете для того чтобы освежить память. Потом сразу пытался писать с применением паттернов и соблюдением принципов SOLID. Да, первый раз было сложно, голова пухла, я прокручивал всё в голове сотни раз и всё равно не мог обрисовать как всё это сделать, но в итоге сделал и результат меня более чем обрадовал. При этом первый раз я начал с жопы, а именно с описания классов, а не логики. Последующие проекты ты уже делаешь с мыслью "как мне раньше такое в голову не приходило, это ведь так удобно". В общем, ты либо идёшь навстречу страху "у меня не получится, я тупой" и борешься с соблазном "да захуячу лишь бы работало и хуй с ним", по итогу становясь программистом который пишет хороший код, либо присоединяешь к адептам "эта хуйня только замедляет разработку, вы сами себе палки в колеса вставляете, мой код ничем не хуже" и продолжаешь писать говнокод.
>либо присоединяешь к адептам
либо становишься прагматиком
Этапы прохождения к чистому коду
- говнокодер - пишет код для своих нужд, работает через жопу, но плевать.
- начинающий программист - понимает, что код говно и хочет знать, как сделать его хорошим
...эти пропустим...
- шаблонист - упарывается паттернами, все пытается впихнуть в паттерны, выразить через паттерны, паттерн на паттерне сидит и паттерна в паттерн паттернирует
... еще пропустим...
- перфекционист - везде ищет идеал. обычно у такого время и бабло не жмет, поэтому есть возможность порассуждать, посравнивать, возможно знает несколько языков и везде видит "фатальный недостаток"
- прагматик - принимает, что идеал недостижим и что чистый код не значит упоротая приверженность к "вот так принято", а "все должно быть к месту". Пишет хороший код, но если позволяет ситуация, то не боится отойти от канонов "чистого кода", если от этого есть выгода и при этом все равно не сделать нерасширяемое говно ибо есть опыт.
У меня на этот случай регулярка есть которая меняет кириллические символы на латинские, если выглядят также.
претензий нет - все таки EAP, но все же неприятно
У меня его нет. У меня нормальная dvcs
Ну а по теме - а что гит. Ну сделаю я откат и чо. Это равносильно " не начинал"
ну значит пора выигрывать )
У меня веб проекты и решарпер. Делал несколько глобальных изменений по всему солюшену сегодня (namespaces, class names, formatting) - нормально работает.
ключевое слово "веб"
с xaml же все далеко не так хорошо. И так было всегда. Решарпер подрос хорошо в этом плане, но в EAP видимо что-то сломали. Зато новые иконки (зачем только)
Уверен. На предыдущей версии студии во время отладки этого места зависаний не было. Да и зависания происходили после выполнения одного шага отладка (F10).
Вот и мне непонятно, кого пытаются все эти любители аббревиатур наебать? KISS, YAGNI. Серьезно, это третий проект в котором я участвую и каждый, блядь вот так и выглядит: да не парься, тут простенькая срань, сделай главное быстро, я делаю быстро, меня просят показать что все работает, а потом докидывают и докидывают новые требования и пожелания и некоторые из них ну не получается не меняя того что писал впихнуть, приходится переделывать то что уже есть, часто модель, а меняя модель приходится перепиливать куски которые с этой моделью работают, потому что таки есть разница: изначально сказали что будут такие вот сущности - я вынес их в enum и использовал свич, но теперь это полноценный класс и теперь большая часть работы с ним уже в этом классе -> одни куски исчезают, другие появляются.
У тебя не "писать на всякий случай", а обычный говнокод. С самого начала нужно строить адекватную архитектуру, а не колосса на глиняных ногах.
Смотри, YAGNI (в отличие от KISS который рулит) это хуйня. Он нужен для контроля всяких шизиков с OCR, которым дай волю они будут неделями писать никому не нужную хуйню. Но твоя проблема не в YAGNI, а в том что ты написал нерасширяемый кал. Твоему коду должно быть похуй откуда читаются настройки - из json или бд. Все что ты должен был поменять когда сказали что нужно читать из бд - дописать еще одну функцию которя читает настройки из бд, и добавить ее вызов когда нужно. Изменение внешних апи должно решаться добавлением/изменением нескольких однострочных адаптеров. Если у тебя при подобных изменениях распидорашивает весь код - проблема не в YAGNI. Ну и конечно изменение требований в середине проекта это зло, тебе придется время от времени переписывать огромные куски кода. И наперед ты это не предугадаешь. Чем больше напишешь сначала - тем больше будешь переписывать потом. А так-то YAGNI - хуйня, спорить тут могут только клоуны и каргокультисты.
> как ебануть функцию расстановки живых перед началом игры
Простейшая задача же, ты чо?
У нас есть поле из клеток, соответственно, мы это поле можем описать массивом, соответственно, каждой клетке мы можем присвоить уникальные координаты (x, y) являющиеся индексами массива. Есть способ даже в одномерный массив вписать двумерные поля из ячеек. Но для простоты используем двумерный:
https://pastebin.com/BBvH9ces
SOLID он для того и нужен, чтобы избегать неожиданного столкновения с неизвестностью (реальностью). Ты полностью абстрагируешь слои друг от друга и не даёшь им протекать никуда. Поэтому когда приходится менять какую-то модель или имплементацию класса, то ты только меняешь тот слой, к которому эти модели/классы принадлежат, а вся остальная кодобаза остаётся как есть.
Внешние АПИ (Controller/Action в данном случае) не должны меняться после выката в прод. Тебе надо добавить versioning
https://github.com/microsoft/aspnet-api-versioning
https://github.com/microsoft/aspnet-api-versioning/tree/master/samples/aspnetcore/SwaggerSample
И когда придётся добавлять новый функционал, то просто выкатываешь новый контроллер с изменённым функционалом и твои endpoints выглядят так
/api/my-controller/action?v=1.0
/api/my-controller/action?v=2.0
>да не парься, тут простенькая срань, сделай главное быстро
Это блядь в каждом проекте происходит! За 10 лет не было ни одного проекта, где бы всякие менеджеры и тим лиды не произносили этих слов. И каждый(!) раз потом работы по переписыванию было в несколько раз больше, чем если бы изначально нормально сделали.
Бизнесу всегда всё нужно вчера. Но со временем ты начинаешь их хотелки фильтровать и учиться предъявлять контр аргументы. А потом ты сам лид/архитектор, и не позволяешь бизнесу такую хуйню на голову твоих программистов скидывать.
> 1) как ебануть функцию расстановки живых перед началом игры, чтобы не прокликивать на клаве 400 клеток вручную?
Я в вузе выебнулся и читал из битмапа: белая - пустая; черная(или любая другая) - живая. При отрисовке можешь как угодно уже рисовать.
> если захочу ебануть это в винформс, чтобы мышкой выбирать, сложно будет реализовать выбор клеток и отрисовку игры?
Да нет. Особенно если совместишь с битмапом который я выше предложил. Ты же, как я понимаю, будешь в обычном PictureBox'е рисовать, а он спокойно в битмап превращаяется и наоборот, твое поле так же легко битмапом представлять.
Я вот делал что на каждом ходе схоронялась картинка, типа чтобы можно было проследить как там развивалось и самые удачные потом зацикливал и делал гифки как обоины для телефона. Вооооот.
Смотрите, вот пишут в интернете что не нужно диспозить HttpClient, типа нужно сделать один на все приложение. Другие пишут что нужно для каждого эндпоинта(либо наоборот для каждого api) свой делать. Третьи берут и диспозят.
Как правильно-то, если мне нужно на разные адреса постоянно слать Get'ы, а потом преобразовывать полученную информацию и на другие адреса слать Post'ы?
Ну, чтобы было ясненько, допустим есть n запущенных сторонних сервисов расположенных на разных доменах у которых есть общий API, мне нужно получить от этих серверов информацию и отправить в другой, но уже мой. Сервисы могут в процессе работы отваливаться либо запускаться новые, потому я предоставляю возможность пользователю добавить Uri на который я буду слать Get'ы, т.е. я заранее не знаю вообще с какого сервиса буду брать данные и сколько одновременно их будет.
Ну, пока что я не стал выдумывать и просто засунул Http-клиент в статический класс-обертку и просто имею коллекцию Uri'ев для Get'ов, но майкрософт пишет про какие-то АшТиТиПиФактори и со стороны оно выглядит прикольно, типа такой вот будет у меня сервис, где я просто вызываю метод GetItems() и получаю что мне нужно, потом как-то привожу к нужному мне виду и делаю PostItemsToMyServer(items), но в их примерах BaseUri вбивается хардкодом в конструкторе этого сервиса, а я ж как-бы не знаю еще Uri, а если передавать его в метод, ну, тогда и разницы-то большой нет между тем что я буду в статический класс этот Uri передавать.
В общем, реквестирую ликбез по HttpClient'у и как такие вот штуки нормально делать. Не думаю что задача какая-то уникальная и нет бест практис по ней.
> АшТиТиПиФактори
> если передавать его в метод, ну, тогда и разницы-то большой
Там наверное идея в том что АшТиТиПиФактори может решать сколько ей клиентов нужно. Может использовать один (как я понимаю это рекомендованый вариант, нужно только thread safe методы использовать). Может навернуть пул клиентов. Может использовать один клиент для запросов к какому-то частому uri, а для всех остальных - второй. И т.п.
АшТиТиПиФактори он создает HttpClient-ы по запросу, но впихивает в них HttpMessageHandler, которые кеширует на некоторое время.
Это позволяет иметь сколько угодно нужных тебе HttpClient с нужными настройками, не создавать на каждый из них и кое как ловить изменения днс (для этого HttpMessageHandler и не живет вечно)
Эти HttpClient можно смело диспозить.
Делай как требуют того создатели - один на всё приложение.
>Как правильно-то, если мне нужно на разные адреса постоянно слать Get'ы, а потом преобразовывать полученную информацию и на другие адреса слать Post'ы?
Оборачивать в статичный класс и слать из него. Слать можно одновременно на разные адреса. Если нужна тонкая настройка: изменить куки, изменить заголовоки, изменить тип данных, то создаешь HttpRequestMessage, указываешь всё нужное у него и используешь HttpClient.SendAsync для его отправки.
Проблемы могут возникнуть только при необходимости использовать прокси-серверы для выполнения запроса, потому что HttpClient не поддерживает изменение прокси-сервера после того как класс уже создан. В такой ситуации для таких запросов лучше использовать более легковесный WebClient или WebRequest.CreateHttp.
public
void
MethodName()
{
}
?
Ну или может быть есть какие-нибудь плагины, чтобы можно было вот так вот написать:
publiс:
int a {get; set;}
string b {get;set}
?
Просто ну раздражает меня что какой-нибудь метод
public async Task<IEnumerbla<IClient<IAdmin>>> GetAdminsWithPrivileges(IEnumberble<IPrivilegel> privileges, Func<IAdmin,bool> filter, int maxItems = 100)
занимает так много места просто для объявления. Ну, допустим параметры я могу свернуть в столбик, что чутка места сэкономит, но все равно довольно много места отъедает, если я решаю разделить окно редактора на 2, то не влазит уже.
Да, первый вариант неоч смотрится, но это пока что самый приемлемый уровень, еще бы студия не пыталась за меня отступы ставит. Раньше такого не было кстати, а сейчас решаешь лямбду написать пишешь customers.Where(x=> и в этот момент студия вместо x что-то пытается свое всатвить и ты вынужден остановиться, нажать бекспейс, потом когда выпадет список нажать Esc и только потом ты можешь нормально писать лямбду. Вот что за херня? Я вообще уже думаю что нужно бы перейти для написания кода в какой-нибудь Vim, лол, или еще что-то такое простое, а в студии только отлаживать.
> (^$)|[^0-9.]+
> ^\\d{1}$
Это регулярные выражения, которые по отдельности работают нормально, а я хочу соединить их в одно выражение, но у меня не получается.
>Это регулярные выражения
Я какбэ догадался
>^\\d{1}$
Это чё? Зачем две палки когда есть собака? Что за {1}?
>а я хочу соединить их в одно выражение
Т.е. соединить? (^$)|[^0-9.]+|^\\d{1}$ или (^$)^\\d{1}$|[^0-9.]+^\\d{1}$ ? Надеюсь первое, второе совсем наркомания
>^\\d{1}$
> Это чё? Зачем две палки когда есть собака?
Можно и так и так
> Что за {1}?
Чтобы можно было только число из одной цифры ввести
> (^$)|[^0-9.]+|^\\d{1}$
Это я пробовал, если так написать, то условие [^0-9.]+ отваливается, на буквы нет реакции никакой
А должно быть false. У меня уже крыша едет.
А как не false, если я ограничиваю ввод цифрами, а он true на буквы выдаёт. Блять, я просто хочу, чтобы он выдавал true, когда я ввожу ОДНУ цифру в диапазоне от 0 до 9. На двухзначные и больше числа должно быть false, на отрицательные false, на буквы тем более false.
>Блять, я просто хочу, чтобы он выдавал true, когда я ввожу ОДНУ цифру в диапазоне от 0 до 9
/^[0-9]$/
Посоветуйте книги, в которых по больше практики, чтобы было какие api есть и как использовать, желательно современные api что есть в .net core.
Вот так вроде работает
(^$)|/^[0-9]$/|^\\d{1}$
Но если диапазон уменьшить, то ему похуй. Это из-за | что ли. Вообще уже не соображаю, блять.
потому что это не буквальное определение костылей
Вы чё дятлы? Какой сложнее, скобачники не люди.
only =>
only var
only using ... ;
Мне 23 года, специально залезаю в классы дедов и коммичу syntax исправления, потом лоллирую как они смотрят на меня, когда видят.
да можно вообще все убрать. сделать как в перле. мозг распарсит. зачем еще человеку то мозг как не в "уме интерпретировать код"
Есть вкусовщина, как ; var =>, а есть то, что лучше не трогать.
В каждом языке мозг привыкает цепляться при чтении за маркеры и скорость и поиска глазами по коду сильно растет.
Если же маркер зашит в код и неявный (его нужно самому расчитать), то это мешает читабельности.
убрать using когда много вложенных using - это приемлемо, раз язык не позволяет сделать одно определение using для многих элементов. Но тотально убирать using только "потому что можно" - ИДИОТИЗМ
и да. не напрягает ConfigureAwait(false) везде писать? Хотя, скорее всего, ты просто не пишешь
Пишу GIS интеграции по COMу, как прадеды завещали.
Да при чём тут асемблер просто у меня гореть начинает когда что бы объяснить их необходимость начинают городить уровня "А давайте представим мульти вселенную в которой есть 8 альтернативных вселенных похожей на нашу в которой мы имеет доступа к родительским классам потому они были написаны и реализованы в неизвестный момент времени неизвестно кем и мы даже не знаем их реализацию и вот в одном из таких случаев мы можем создать делегат указывающий на нужный нам метод." Будто читаешь конспекты по физике написанные первокурсником с будуна.
ну есть уже обычные реализации этих методов в классах которые прекрасно читаемы и соблюдают структруру кода и его иерархию. Для тех кому мало перегрузку их сделали, абстрактные методы добавили, виртуальные НЕТ БЛЯДЬ хочу предполагать мульти вселенную и что где-то есть какие-то методы поэтому буду делегаты хуярить которые еще и должны и методу соответствовать по параметрам и модификаторам.
так у тебя претензии к тому, что ты там читаешь или к самим делегатам. ты уж определись
Потому что делегат, как "интерфейс callable" просто архисверхполезная шняга и незаменим.
Комбинирование делегатов...ну это сделали, чтобы event реализовать. Ну так им захотелось "а пусть будет так еще вот уметь"
Сможешь на пальцах пример обрисовать их использования где они были НЕЗАМЕНИМЫМЫ? Можно даже с псевдокодом я не против. Я понимаю концепцию их но я даже сам себя переубедить не могу что это костыль но у меня то опыта больше чем лаба1 и лаба2 нет, может понимание их использований через жирные проекты приходит
>Сможешь на пальцах пример обрисовать их использования где они были НЕЗАМЕНИМЫМЫ?
изи.
вот тебе древняя концепция - нужно принять калбек в метод. Как будешь реализовывать? Как опишешь что "мне вот нужен метод который примет это и вернет это" не вводя в язык такого описателя?
Какие такие калбеки? да хоть те же евенты. даже если не любишь шарповые евенты (как не люблю их я), а используешь что то типа
observableObject.Observe(...сюда что передавать? мудрить интерфейс плюс класс?...)
или list.Where(..сюда тоже интерфейс мудрить IPredicate?...)
попишешь так и задашь вопрос "а почему я не могу передать метод, как во многих других языках". Почему я должен реализоывать интерфейсы на каждый чих. Я что на жаве что ли пишу?
А тебе в ответ - низзя. передача метода потребует "интерфейс для метода", а это костыль
постоянно же. Каждый раз когда LINQ пользуешься - вот оно
ну и когда пишешь где нибудь Action<>/Func<>, что тоже очень часто - тоже оно
про event-ы я промолчу, я их избегаю, но обсервабле тоже нужны делегаты
Ладно, спасибо. Видимо мне нужно больше больше практики по теме, сейчас хоть всё не так однозначно стало
А как без них линкью и асинхронщину писать? Или ты про саму реализацию делегатов? не читал, как они внутри устроены
Есть парадигмы: ООП и ФП (функциональное программирование)
в шарпе они представлены обе в какой то степени. Передача функций, анонимные методы - все это относится к ФП
И даже если шарпист нихрена не смыслит в ФП все равно использует вещи оттуда. Тот же LINQ это из функциональной парадигмы.
Ну или даже просто где нужен калбек или "мне нужен метод, нахер мне ради этого плодить интерфейс" то использует делегаты
Так его везде пихать уже давно не надо. Только если desktop, самописный контекст синхронизации или библиотека.
Нормальные люди пихали его до 2018 года, и потом перестали с выходом стабильной версии кора. А остальные только к 2020 догнали, что ConfigureAwait(false) то оказывается ставить надо! Только поезд ушёл.
ничего с выходом кора не изменилось. Ну разве что в asp.net core его по дефолту нет и это позволяет не писать жертвуя некоторой долей перфоманса и в надежде, что контекст никогда не появится
Всегда, когда нужно передать функцию как параметр.
Очень часто используемый пример с анонимной функцией
var someEntity = _cache.GetOrCreate("some-key", entry =>
{
entry.AbsoluteExpiration = TimeSpan.FromHours(1);
return _repo.GetSomeEntity(id);
});
Тут метод GetOrCreate принимает 2 параметра - ключ для поиска значения в кэше и функцию, которая притащит свежие данные, в случае если кэш пустой.
Упрощённо GetOrCreate выглядеть будет так:
T GetOrCreate<T>(string key, Func<ICacheEntry, T> func) {
if (_internalStorage.Contains(key))
return _internalStorage[key];
var value = func();
_internalStorage.Add(key, value);
return value;
}
Ну так о вебе и речь. Исключения перечислены выше. В консоли и в тестах контекст вообще редко кто добавляет.
В перформансе разницы вообще нет. Хоть ConfigureAwait(false), хоть ConfigureAwait(true). Можно доверять на эту тему статьям в инете, мы лично делали свои тесты, бомбардируя сервер тыщами запросов. Проверялось на разных машинах. Результаты были одинаковые.
При внезапной нужде в контекстe добавить ConfigureAwait(false) по всему коду можно в 1 клик через ctrl+. или alt+Enter.
>Хоть ConfigureAwait(false), хоть ConfigureAwait(true)
это если нет контекста. иначе есть, что как бы очевидно.
>добавить ConfigureAwait(false) по всему коду можно
как бэ нельзя.
и как бэ эта простыня читабельности не добавляет.
ты там походу пьяный в честь пятницы, твои комменты не стыкуются друг с другом
ну так это у тебя "о вебе речь". Я про "только веб" и не говорил
во первых разница есть, просто ее не видно тебе из-за малого оверхеда по сравнению с работой всего остального.
во вторых даже там может быть контекст (ну кастомный конечно, у меня вот есть) и писать код в стиле "да не не нужно будет никогда никогда" самонадеянно. Ну обычный код конечно никогда, но вот какой нибудь код написанный тобой (а не внешняя либа) имеет шанс попасть потом в контекст в будущем и нужно помнить "ага в этом проекте такого не будет, а в этом будет" и придет такой джун на проект и будет думать "нет контекста похер" и совсем не знать о том что не похер
из этого вывод - лучше писать во избежание
а про автоматизм там все проще
- нельзя везде проставить ConfigureAwait(false) там где "забыл" проставить. У тебя на проекте это проблем не вызовет - у меня же получишь дедлок (хотя формально он тоже асп.нет кор)
- ну и да. тотальное ConfigureAwait(false) засоряет код, потому то вы его и не пишете - с этим думаю спорить не будешь
ой. не дедлок..., ну в общем ты понял
и вообще речь о том что этот ConfigureAwait(false) есть говно
все так рады var но мало кто просит "замените ConfigureAwait(false) на что то вменяемое", чтобы вот не было такого "надо писать/можно не писать" раз уж сделали херню, что по дефолту ConfigureAwait(true)
https://github.com/dotnet/csharplang/issues/2542
и никаких подвижек
зато целый юсинг скобочки убрали (а убирать их нужно далеко не везде, но кого это волнует - модно же)
Говоришь, что знаешь какие методы запускаются, как узнаешь? Вероятно можешь понять и почему?
Ну я же могу в дебаге посмотреть какие методы вызываются, так вот вызываются по сути чисто рандомные методы но постоянно
Каком сервере, какой импут, болезный? Хорошо хоть аниме прикрепил,обозначив себя умственно отсталым.
Импуте обычном блять, хтмловском, а сервере дотнетовском, мы в c# треде гений, вот собственно выделена строчка с тем самым импутом
Так это не сервер, долбоеб, это браузер. И на скрине даже не Blazor. Тебе в js смотреть нужно, С# здесь не причем.
Да, я тоже так подумал, проблема в том что вызывается именно серверный защищенный onClick метод например сейчас такой, если его закомментировать будет другой, и я не понимаю как это возможно, это же защищенный метод, его тупо НЕ ВОЗМОЖНО вот так вот вызвать из клиента какой бы ни был бы скрипт,
>А это правда что .net core шлёт телеметрию?
Доку почитать не вариант?
https://docs.microsoft.com/ru-ru/dotnet/core/tools/telemetry
>вызывается именно серверный защищенный onClick
Бесполезный набор слов. Какой onclick, Blazor?
Короче, подробно опиши проблему. Мож у тебя там ASP.NET 4 Webforms какойнить, который никто в глаза не видел уже лет 20.
>Стандардтный EventHandler
>вебформс
Не стандартный.
>Ну как бы да у меня асп вебформс
И что я должен из тебя все это клещами вытягивать или гадать?
а что в разоре или мвс евентХандлеры сильно отличаются? да и какое это имеет отношение ведь не важно где, защищенный метод не может вызываться вот так из клиента
Я просто не понимаю что конкретно мне скринить потому что то выполняется и то что вызывается вообще не имеет отношения друг к другу, там общее только то что они на одной странице, как я и говорил методы вызываются совершенно рандомно, мне что весь код страницы скринить? там порядка 400 строк бака
>а что в разоре или мвс евентХандлеры сильно отличаются? да и какое это имеет отношение ведь не важно где, защищенный метод не может вызываться вот так из клиента
В старом ASP.NET совсем другой конвейер обработки запросов, событий, вообще все другое. Там непрозрачно все происходит, с магией. Так что разбирайся.
По моему в вебформах как раз таки все просто, есть клиентская сторона, есть серверная сторона, а в мвс нихуя не понятно, где страницы, где коды страниц, все намешано как спагети, часть кода страницы в одной директории, часть кода страницы в дргуой, часть кода страницы вообще где-то манямирке который я никогда не увижу, разве это удобно? ну да предположим мвс немного быстрее, но ведь в вебформах можно часть code behind вообще низкоуровневым сделать, и оптимизировать код так что мвс такое и не снилось, а в мвс и блазоре что? фреймворки? библиотеки сторонние? надстройки? вы думаете это будет работать быстрее чем низкоуровневый код? что плохого в том что у тебя есть контроль над рендером? разве это не дает еще больше свободы в оптимизации страницы? а вместо веб апи можно использовать веб методы
Про дебаг кстати я вообще молчу, и понял почему ты сначала спросил про "Как ты узнаешь об этом?" потому что да в случае мвс это нихрена не очевидно, там дебажить не возможно, понятно зачем туда ввели докер, без него дебажить код просто не возможно потому что он раскидан по всему решению, и вперемешку с клиентским кодом, как это можно дебажить если ты даже за потоком проследить не можешь?
https://hub.docker.com/_/microsoft-dotnet-sdk/
Мы Alpine и Ubuntu используем. Можно образ использовать через докер или k8s.
Но можно и на машину установить
https://wiki.archlinux.org/index.php/.NET_Core
Официальной установки под Arch правда не видно
https://docs.microsoft.com/en-us/dotnet/core/install/linux
>разве это удобно
>вот у меня всё просто и понятно
>двач памахи методы самовызываются што делать
>catch (ThreadAbortException){}
А ты смешной.
Чувак, ты поехавший. Начинай читать нормальные статьи и книги, чем скорее, тем лучше. Иначе это станет не излечимым.
Ну да, прогеррам на мвс такое не понять, они могут только копировать код с гитхаба или юзать фремвокри, а за претензию к catch (ThreadAbortException){} поясни, в чем проблема скипать сейфовые и обработанные исключения?
>>855724
>Чувак, ты поехавший. Начинай читать нормальные статьи и книги, чем скорее, тем лучше. Иначе это станет не излечимым.
Есть что ответить по сути? кроме оскорблений? Разве я кого-то оскорблял? Так если ты переходишь на личное из за тебе нету чего ответить по сути может это не я поехавший
>Но можно и на машину установить
Да я знаю, просто у меня уже dotnet-sdk-3.1.8 стоит из комьюнити репа. AUR стараюсь использовать только в крайних случаях, тем более с такими новыми пакетами. Я пока почти не читал доку по .NET 5, не будет ли конфликтов, как я будут .NET CLI использовать разных версий на одной машине?
>Можно образ использовать через докер или k8s.
Само собой. Наверное так и сделаю.
>Лучше бы помогли.
Еще бы знать как помочь. ASP.NET тыкал давно когда на винде был, сейчас на линуксе и использую net core.
>Есть что ответить по сути? кроме оскорблений? Разве я кого-то оскорблял? Так если ты переходишь на личное из за тебе нету чего ответить по сути может это не я поехавший
Он наверное имел ввиду, что у тебя все наоборот. Сами Microsoft неоднократно писали, что создали ASP.NET Core потому что он удобнее, безо всякой магии, а ты твердишь обратное. К слову, в новом ASP.NET Core есть Razor Pages, это сильно более продвинутый Webforms, попробуй.
Спасибо Анончик, нынче олдов совсем не уважают, облепились фремворками и копипастом с гитхаба и спят и сидят довольные, а у меня между прочем легаси, вот возьми, я угощаю
Ну ты просто не с той стороны зашел со своей проблемой. Так мало инфы дал, что единственный, кто тебе может помочь это чел с такой же проблемой, который все решил сам. Вероятность встретить тут такого чела невелика. Вот и пошли в общем-то небезосновательные предложения перекатиться на технологии поновее.
Про разор я в курсе, ну а насчет магии смотри, простой быстрый пример на дефолтном проекте, вот предполий хочу я зайти в метод и посмотреть что происходит в view? А мне не дают, почему? В вебформах такой фигни нет, там можно даже в авто генерируемые классы можно зайти и почитать и даже изменять, не знаю зачем это может кому нибудь понадобиться но все же
Я в ваших дотнетах 15 лет сижу. У нас тоже есть говно легаси 10+ летней давности и 1гб кодобазой. И есть системы из микросервисов на core 3.1 и net 5.
Я успел нырнуть с головой во все веб фреймворки, которые МС когда-либо пилил, начиная с древнего asp (без всяких net, где на VBScript писать надо было). И на каждом рабочем месте мы перетаскивали легаси на что-то более новое, дабы продлить поддержку, улучшить читаемость, не иметь глюков с новыми ОС, повысить производительность и т.д.
>Есть что ответить по сути?
Судя по твоим сообщениям у тебя страшная каша в голове. Тут даже страницей текста не объяснишь, где эту суть начинать ухватывать.
MVC так то тоже уже легаси. Я их 3 года не использовал. Теперь АПИ пилят, и потихоньку начинают перекатываться на gRPC и HTTP2 и Blazor.
Но в MVC очень просто найти откуда что приходит, как обрабатывается и как рендерится. Но только при условии, что проект писал нормальный программист без сильной склонности к креативу. Твой Controller/Action определяет имя папки и файла твоего View. Но тебе никто не запрещает указывать конкретно какое View в данном методе рендерить и какую модель ему отправлять. Во вью лежит только то, что относится конкретно к отображению данных с минимум C# и js. Вся логика должна быть вне твоего Web проекта и должна быть свободно перетаскиваема хоть на десктоп, хоть под мобилки (SOLID должен соблюдаться).
Фронт-енд часть так и остаётся почти чистым html + js + css, только с небольшим пререндерингом на сервере (обычно для безопасности и иногда для удобства с валидацией и прочей чисто фронт-енд функциональностью).
В поиске по дереву файлов проекта вводишь "(имяконтроллера)View" и всё, ты уже видишь что это за view и что в нём происходит. Это гораздо удобней ситуации когда у тебя всё в куче.
Да я в общих чертах знаю как мвс работает, то что ты написал я точно знаю, и ничего не имею против мвс, просто мне не очевидно то что есть люди в асп которые не знают вебформы, и еще более странно что есть люди которые открыто его хейтят
>>855752
Ты имеешь в виду когда можно просто использовать хелперы и прожать F11? Никто не заставляет тебя писать весь код в одном файле, делай рефрактор как захочешь, просто там поток для построения страницы как у классических приложений, условный мейн и дальше функции которые в этот мейн вызываются, а клиенту ты передаешь то что тебя надо по мере выполнения потока собственно мне это и нравилось когда я в асп перекатывался из дектопного программирования,
>условный мейн и дальше функции которые в этот мейн вызываются
Ну да, простыня под названием процедурщина, самый ущербный стиль, который ведёт к путаницам и является родителем макаронного кода и вопросам "у меня методы вызываются непонятно откуда, что делать?".
Именно этот "условний мейн" состоть буквально из 10-20 строчек, я не понимаю про какой спагетти код ты говоришь
>мне не очевидно то что есть люди в асп которые не знают вебформы, и еще более странно что есть люди которые открыто его хейтят
Ух негодяи, да?
Странно, но ты как то умудрился в нём запутаться.
На самом деле всё очевидно - легче жрать кактус и говорить что он вкусный и тебе совсем не больно, просто потому что для того чтобы употреблять нормальную еду нужно немного потрудиться и выучить что то новое, а тебе лень.
Если ты по поводу того трабла о котором я спросил, то это вопрос именно к клиентской части, а не серверной, а точнее вопрос к постбеку, костылями этот вопрос можно решить, например юзнуть Page.IsPostBack, или можно избавиться от мастера, или возможно
Event.preventDefault(), но я ищу причину почему выстреливает не правильный постбек, у меня есть подозрения на updatePanel или js теоретически это еще может быть signalR хотя он и не может вызвать защищенные методы, но ведь он может вызвать постбек после которого и сработает евентХандлер, так что в любом случае єто клиентский трабл
Это просто новая версия .NET Core.
Ну смотри, допустим ты делаешь сервер на сокетах. Все же довольно просто и основная логика - всегда одинакова: приняли клиента - как-то начали обрабатывать. Но вот обработка может быть разной, допустим первому пользователю твоего класса нужно modbus, а другой - хочет таки http, а третий вообще irc хочет, кому-то нужны сессии, кому-то не нужны, может быть кто-то просто хочет на любой запрос - время отдавать текущее и ничего больше. Ну и разве плохо будет если твой класс сервер - просто будет принимать делегат вида void(Server, Client). Пользователь твоего класса тупо описывает что ему нужно: тут мы побайтово читаем, как-то пакетики обрабатываем и делаем modbus фигню, а вот тут мы пытаемся запрос парсить как строку и если все ОК - отдаем ресурс и т.д.. "Сервер" при этом вообще никак не меняется, он просто создает тастку в которую засовывает твой делегат и дальше ждет приема клиентов. Хорошо же.
Да, это не совсем ООПшно. И ты конечно мог бы сделать в ООП стиле, только вот зачастую оно не требуется, а еще чаще ты просто хуйню напишешь, а так - твоя библиотечка в этом случае будет строк в 200, если же будешь все ООП делать - код разрастется, а пользователь будет вынужден разбираться во всей этой структуре - что куда пихать, какие классы ему создавать и т.д.
Ну, по крайней мере мой охуительный опыт работы в 1 год вот такое впечатление оставил. Да.
Пробовал, вроде работает. Но вот еап райдера не запускается, поэтому фичи 9 шарпа попробовать не могу. Сука, им деньги платят, а они вовремя не могут выкатить поддержку нового языка, хотя анонс 9 шарпа был еще в марте, вроде.
Хуй знает, кто этот райдер кроме линуксоидов и макодебилов юзает.
двачую вопрос, там вообще как десктоп приложения уже можно пилить из под Линуха или только ВЕБ? Студии всё так же нет, только КОД?
или ты про редакторы? ну там только Rider
>там вообще как десктоп приложения уже можно пилить из под Линуха или только ВЕБ?
Да, wpf точно. Почитай, я хз. Или лучше установи и сделай dotnet new, покажет доступные шаблоны, хотя я опять же хз насчет все ли шаблоны из коробки есть, может их отдельно нужно ставить.
>>855970
>Студии всё так же нет, только КОД?
Нах не нужна ты че, 10Гб весит минимум, тормознутое глючное дерьмо. VSCode с Omnisharp позволяет все тоже самое.
да ну какой WPF.
даже если редактор умеет WPF и запускается под линукс то это ничего не значит ибо приложение не запустить для дебага
а дизайнер...поставил я на днях Rider и дизайнера для WPF под неткоре просто не существует.
В твою мобилку тоже встроена телеметрия, как и во все поисковики и популярные сервисы, в винду, в небо и Аллаха. Добро пожаловать в реальный мир, Нео.
Не волнуйся, всем похуй на какое маняме ты дрочишь.
>Я правильно понимаю, в ваш этот свободный дотнет встроена блядь телеметрия.
И че? Это среда разработки, логично, что им нужна инфа как она работает на устройствах, чтобы ее развивать. Телеметрия отключается вручную. Вообще как бы кто этим пользуется, тот занимается разработкой и ему пох что там сканируют в системе, это же рабочая машина. dotnet может быть в докер контейнере, что вообще исключает выход за пределы одного процесса.
> ему пох что там сканируют в системе, это же рабочая машина.
>пох что там сканируют в системе
>это же рабочая машина
Блядь блядь блядь сука блядь что происходит?
>>856029
Это другое.
Не не подождите ёбана.
Что происходит вообще? У вас теперь документация для телеметрии идет?
Вы там ёбнулись вконец?
Мало знать дотнет и сишарп нужно еще внимательно изучать телеметрию сука блядь по оф докам?
А сертификация по телеметрии есть?
Какое другое? Это все тоже самое, что и везде сейчас. Дальше будет еще круче.
1920x1080, 1:10
Можно как то забустить вывод текста в консоль?
Молодчага.
могу выкинуть архивом или на гитхаб, но там код говна т.к. изначально это был проект интерпретатора брэйнфака с поддержкой слов разной длинны
Хитро.
А почему в итоге получилось аниме?..
>Самое простое - берешь картинки, читаешь как битовую карту и просто рисуешь в консоль. Может быть тот анон как-то сложнее придумал, я для вуза вот так вот как я сказал делал.
Там же не статическое изображение, а анимация. Битовые карты это про что вообще, гуглить обработку изображений?
Простейшую анимацию ты можешь замутить последовательно читая картинки. Да, не самый оптимальный вариант, но вполне для мелкой фигни сгодится. Возьми сделай какую-нибудь серию из 100 фоточек, запили 30 кадров в секунду и у тебя будет анимация.
Делаешь интерфейс: INotification, с методом void Notify(string message), там уже под каждую OS - делаешь свои реализации: WindowsNotification, LinuxNotification и т.д. Там уже от платформы пляшешь. Тут мы берем из винапи что-то, там GTK, тут какие-то андроид хуевины.
При сборке контейнера просто можешь ебануть дефайнами выбор когда какой INotification использовать. Изи-бризи.
Пока писал подумал, что скорее правильно было бы не INotification, а INotifier. Имплементирующие его - делают это под разные платформы и окружения, а вот INotification - может быть скорее каким-то сообщением с приоритетом, типа: ImportantNotification, InformationNotification и т.д., чтобы была возможность как-то управлять этими вот сообщениями. Ну, соответственно можешь сделать какую-то очередь уведомлений, твои классы - кидают это в очередь, INotifier - переодически достает из очереди - выводит, у него по сути один метод Run с циклом который бесконечно достает из очереди - выводит.
Еще подумал. У тебя 3 интерфейса: INotification, INotifier и INotificationDriver, вот Driver как раз будет заниматься всей хуйней специфичной для OS,уведомелния - то что будет приходить INotifier'у, он уже решает вывести его с помощью драйвера или же запихнуть обратно в очередь и выввести что-то более важное. Вот. Да. Как мне кажется - норм решение.
Ну а кк держать иконку - уже в драйвере сам придумаешь под конкретную платформу.
Виндовых юзеров на хабре видел с лестными отзывами. Лично только маководов знаю, им вроде тоже норм. Под никсами наверное проще VSCode с плагинами использовать. Тем более там норм дебаг появился и локально и удалённо и в контейнере. Анализаторы не пробовал, но тоже должны работать.
Надеюсь что с завозом telemetry и прочих ништяков, которые дотнет по умолчанию эммитит, появятся всякие опен сорс тулзяки для анализа перформанса и многопоточности.
ну и сделал что бы она умела исполнять то для чего создавалась, не рисовать bad apple в консоли, а исполнять брэйнфак
ой, имелось ввиду dotnet counters и monitor
https://devblogs.microsoft.com/dotnet/introducing-dotnet-monitor/
https://docs.microsoft.com/en-us/dotnet/core/diagnostics/dotnet-counters
проще сразу распилить чем потом ебаться. Да и хоть 50. Если они по задачам разбиты то лучше уж 50 чем всё говно в одном проекте держать
>Она под чем, что с глазами?
Увидела зонды.
Да просто глаза широко раскрыла.
Девушка молодая, кожа упругая, жира мало.
Спидами упоролась
>проще сразу распилить чем потом ебаться. Да и хоть 50. Если они по задачам разбиты то лучше уж 50 чем всё говно в одном проекте держать
Это называется ООП головного мозга. Можно разделить на каталоги, модули, файлы, но зачем на проекты? Получаются лишние файлы .csproj и прочая подобная шняга.
Затем что тебе не нужно пересобирать все разом, если поменял только небольшую часть.
Ну, допустим у тебя библиотека для работы с устройствами разными. Там куча логики для работы с этими устройствами. При этом ты не хочешь заставлять пользователей для каждой новой версии качать всю программулину, которая может несколько гигов весить. Ты просто добавил в библиотеку классов поддержку нового устройства, затем при старте сама программулина проверяет есть ли новая версия библиотеки устройств и если есть - скачивает ее, кладет в папочку и все, у тебя новый функционал в приложении, а пользователь не все перекачивал, а только 1 библиотечку, которая и весит-то пару килобайт. Круто же.
Ну, по крайней мере я говорю в контексте того с чем имел дело на работе, у нас вот каждый месяц новые устройства появляются, а ПО - нужно чтобы читать из них данные. И мы как раз так вот делаем: есть проект для БД, который почти не меняется, есть проект с интерфейсами, который тоже почти не меняется, есть библиотека всяких штук для работы с устройствами, есть еще куча всяких наших библиотек, есть основное приложение, которое просто, по сути, берет из других проектов куски, запихивает их в контейнеры и знает как рисовать интерфейс. Если мы добавляем новый канал связи - просто добавляем в библиотеку новый класс, если новое устройство - описываем устройство, какие каналы связи оно использует, все это вот. Приложение само при старте все смотрит на наших серваках, если появилась новая библиотечка - скачивает и все работает как часы. Опять же, проще тестировать, нам не нужно все отдавать тестерам, у них там вообще роль основного приложения на консольной утилите, они положили dll'ку, запустили батник, там красненьким будет светиться если что-то не так, а если в интерфейсе что-то новое, опять же не нужно все библиотеки устройст - одна маленькая фейковая.
https://techcrunch.com/2020/11/12/python-creator-guido-van-rossum-joins-microsoft/
> Python теперь будет разрабатываться Майкрософтом :)
Нет, потому что Гвидо больше не пожизненный диктатор, в Python он теперь не принимает решений. Разве что наравне со всеми.
я так понимаю это как в андроидах генерятся классы биндинга, DI и так далее
но там для этого есть отдельная команда make project, которая только это и делает
а в студии где такое? или нужно билдить, ясень пень с ошибками, и это нормально?
похоже что в шрифте консольки нет какого то символа. попробуй стереть и по новой напечатать. и ещё вместо запятой лучше отдельно 2 переменных объяви, юзай var, в интерполированных строках можно юзать bool?1:2 тобишь
var div = (x+y)%4 == 0;
Console.WriteLine($"bla bla is {div?"not ":""}divisible bla bla")
Переписал, помогло, но так и не понял что с консолькой. При отладке строке result присваивалось нормальное значение без этих вопросов. Мб это как то связано с тем что это "the sum of бла, бла, бла" я копипастил из переводчика?
Как зациклить программу правильно? Если юзать беск. цикл то память сильно засоряется
где связь между бесконечным циклом и памятью?
while(true) это просто цикл и нормальное средство зацикливания
хотя я больше предпочитаю
while(!ct.IsCancellationRequested)
или
while(lifetime)
обычно это не имеет значения, но даже вечные циклы не вечные и умирают при остановке компонента или приложения. И неплохо бы обеспечить "graceful shutdown", а не бросить все "авось все будет ок"
ct это CancellationToken - ну с этим все понятно. Компонент выгружается, CancellationToken переходит в состояние "отменен" и цикл прерывается как надо
lifetime это концепция немного другого рода. Все живет в некотором lifetime и когда он умирает, то диспозится, отменяется, отписывается все, что было связано с этим lifetime
очень схож с CancellationToken, но семантика другая. CancellationToken это токен отмены операции, а lifetime представляет собой время жизни компонента и когда компонент умер - все связанное с ним должно быть очищено
Понял, спасибо
Да. Вместе с обычными симолами скопировались невидимые
Сохраняй в файл, помле чего загружай, очевидно.
Говорю же нуб. Такая по дефолту ставилась, но думаю стоит всё-таки, раз уж я решил стать белым .net господином И съебать с завода где уже зашкварил свою трудовую одной жёлтой программой
Как ты надоел. Сделай скрин. Без него помощи не жди.
asp-route="routename" asp-route-foo="jopa" asp-???="bar"
то я хочу получить
/anus/jopa/#bar
Блять. asp-fragment прямо перед глазами же. Пойду спать.
Допустим у меня есть класс, который запихивается в контейнер как синглтон. Допустим у него одна единственная задача - раз в 10 минут печатать в файлик текущее время и есть два метода: ОстановитьПечать - ЗапуститьПечать. Так вот, если я просто в стартапе пишу что вот этот вот класс - синглтон, то чтобы он начал своей фигней заниматься - я должен хотя бы раз использовать его в другом месте, например я должен в контроллер его передать в конструкторе. Да, я могу при билде хоста - достать его и все будет работать, но я вот такая бака, хочу чтобы метод Main выглядил вот так вот:
await CreateHost(args).RunAsync();
красивей же, чем если бы я после того как создал билдера - доставал из него нужный мне класс просто чтобы он запустился.
Так вот, пока что я вот такой вот костыль придумал - делаю класс ServiceLauncher, который имплементирует IHostedService, и в него пихаю все что должно вот так вот запускаться. Но мне кажется что это какой-то жуткий костыль. Имплементировать интерфейс IHostedService для моих сервисов я не хочу, потому что ну серьезно много лишнего получается в классе.
Есть ли какая-то штуковина в этом самом неткоре, чтобы просто явно указать, что инстанс синглтона вот этого вот класса - должен создаваться сразу, а не ждать пока его вызовут?
services.AddSingleton<MyService>(new MyService());
Всё, твой сервис активирован, инжектить в конструктор для того чтобы делать что-то начал не надо.
О джаве еще кто-то что-то слышал благодаря мобильной разработке. А так это тырпрайзное легаси говно в стадии кобола (какая-то своя атмосфера, которая никому нафиг не нужна и вообще дерьмо динозавра).
Котлин чудо сделанное тяп лям ради маркетинга. Отсюда на поверхности красивая глазурь, но чуть сковырнуть, там толстый слой непродуманного говна.
В итоге мы получаем жабьи проблемы с добавленными котлиновскими (именно поэтому на котлине бэк пишут 1,5 анона)
Го - это звездец, тот случай когда пранк вышел из под контроля.
Если чекнуть графики, то видно что он толком не выстрелил и висит в стагнации спустя 10 лет.
Шарп, конечно, вендор-лок говно, но хоть не выглядит как язык на отъябись.
>Шарп, конечно, вендор-лок говно
Уже .Net 5 вышел, а у тебя всё еще вендор-лок. Майкрософт признали свои ошибки, вложились в опенсорс и нацелились на кроссплатформу.
Только не надо сейчас бежать и нести сомнительные либы с 1,5 разработчиком, которые нехера никто юзает.
>всё в опенсоре, сотни контрибьютеров, можешь лично внести изменения в ядро, если хватает навыков. Каким-то очень популярным, но слабо оптимизированным решениям майки придумывают аналоги, которые разрабатывают за своё счёт (Text.Json как пример)
>Разумеется монополия по либам и решениям.
Ясно. Очередной вскукарек дилетанта.
монополия по либам и решениям
начнём с того что asp это платформа, там куча разных либ, от разных серверов до тонн прослоек. И собственно зачем что то другое если вот оно уже есть, опенсорсное, рабочее, во что вбивают бабки. Можешь форкнуть и пилить
всегда была. ServiceStack например и оно не одно.
и никто не запрещает написать свое
>монополия по либам и решениям
по либам так вообще смешно
в упор не вижу никакой монополии. есть И ЛИБЫ от майков среди многих не майковских. Либ жопой ешь.
Монополия, в ее классическом понимании, мешает тебе получать профит там где занято монополией.
если ты напишешь свой браузер, то ты не получишь профита - никто не будет его использовать ибо есть говнохром.
Но если ты напишешь свой фрейморк/либу то используй ее для своего профита - нет никаких проблем. в том же асп.нет можно заменить (я все это делал) сервер, DI, рендер, роутинг (хоть XMLRPC вместо стандартного)- и что тогда от "монопольного" асп.нет то останется )
ну правда с DI немного приврал. это они сделали немного жопу что вкинули не контракт, а реализацию DI.
Никто не запрещает взять и написать, но мало кому нужно.
Вообще от самих майков есть несколько опций под aspnet - mvc, api, razor pages, blazor, F# aspnet (он малость отличается). Для веб сервака - HTTP.sys https://docs.microsoft.com/en-us/aspnet/core/fundamentals/servers
Ещё есть сторонние веб серверы (не IIS и не Kestrel): https://suave.io
Есть веб фреймворки: https://github.com/giraffe-fsharp/Giraffe
Наверняка ещё есть полно всякого невзлетевшего софта и возможно даже широкоиспользуемого, но оно просто не на слуху.
сори чел но ты шиз, реплаиш те посты в которых тебе же и пишут альтернативы. иди луше фронт попиши может отпустит, ну или нейроночку на питоне потренеруй на распознавание говна, только свою фотку для проверки не скармливай а то боюсь результат тебя расстроит
>Пиши свое
>НИХАЧУНИЧЕГОСЛЫШАТЬ
>(заткнув уши) ла-ла-ла-ла
ясно все с тобой.
монопольную либу не подскажешь? ну которая или только у майков или никак ничем не заменяется
Подскажите ньюфаговский вопрос - как в WPF'e можно прибиндиться к свойству кастомного класса?
Суть: есть один класс, назовем его YobaTimer, в котором есть условный Tick(), который обновляет свойство-строку ElapsedTime. Как его прибиндить к TextBlock на View.xaml ? OnPropertyChanged поставил, вся хуйня - вначале пытался прибиндить к свойству в View.xaml.cs , значение инитится на вьюхе - но понятное дело не обновляется т.к. Tick() в классе таймера, пытался прибиндить дата контекст в xaml'e по разному и пытался в конструкторе View.xaml.cs написать DataContext = YobaTimer, но значения даже не инитится на вью. Причем в выводе отладки иногда выдает ошибку биндинга, а иногда нет(?!), хотя я месседжбоксами чекал и строка точно обновляется (да, свойство).
На MVVM мне похуй, мне лишь бы работало, хотя я бы рад был послушать как это правильнее сделать.
Т. е. существования ASP как-то мешает разработке других ферймворков? Где вендор лок то, долбоебина?
Кококо у нас нет вендер лока, хочешь пиши на ASP, хочешь не пиши вообще, полная свобода.как же я проигрываю с вас аутистов
ой дурак
В JS вообще никаких фреймворков стандартных нет. Значит у них вендор лок на отсутствии фреймворков? Это такой троллинг тупостью или у тебя просто умственная отсталость?
Либо отдельно от всех в Models, либо в DAL. В BLL должны быть DTO которые будут содержать только те данные которые должен получать/отправлять пользователь, если работать напрямую с моделями, то это чревато такими уязвимостями как оверпостинг.
Я так понял перекат может кто угодно сделать, а значит и шапку может кто угодно запилить. Копия с pastebin в самой шапке, можно брать и править.
Всё правильно, бери и делай перекат.
как показала жизнь кто угодно не может
для этого нужно обладать особым навыком "не влом это сделать"
На оф сайте есть ченджлог, прям как в твоей дотке с очередным патчем, можешь прочитать если интересно.
Разрешаю. Исправляй.
ну технически он прав. с асп.нет примерно та же история что и с говно-гитом. Вроде бы альтернативы и есть (и даже лучше чем это говно), но попробуй еще устройся на работу, где используется не гит.
и если не любишь гит и асп.нет (хотя его не любить не за что) - то проблема однака
Блять, так при чём здесь разработчик языка и .Net? Почему вы такие тупые? Почему вы думаете, что разработчика языка и фреймворка должны твои заебы волновать?
При этом это фреймворк не от смузихлебов, которые забьют на его поддержку по воле левой пятки, а от крутой компании, которая тратит свои ресурсы на развитие и поддержку. Наоборот радоваться должны, но долбоебы почему-то горят. При этом горят не из-за отсутствия альтернатив от смузихлебов, примеры которых дали выше, а от того что, внимание, на работу не устроиться зная говно которым смузихлеб накормил!
>так при чём здесь разработчик языка и .Net?
>Почему вы думаете, что разработчика языка и фреймворка
А не причем.
Как я вижу он просто описал текущее положение дел.
А про "клятый мелкософт ууу" - оппоненты сами придумали
Знаю, но это надо сидеть и думать. А на дваче можно задать вопрос и не думая получить ответ
Ну, это совсем долбоёбов деанонят
Извини, братишка, мне впадлу.
биндиг берет за отправную точку объект, что у него в датаконтекст, если не указан source - иначе берет за основу его.
В крайнем случае сделай в code-behind установку свойства вьюхи явно раз уж биндинг никак
Знакомый, зарабатывающий на фрилансе, посоветовал мне выбросить нахрен все учебники и купить курс с Udemy, дескать ему хватило, чтобы начать работать.
Поискал там курсы на русском языке по .Net Core, но практически ниухя нет.
Еще добавлю: в работе фреймоворки куда важнее знать, но с большой долей вероятности на собесе на начальную позицию тебя будут про GC и джойны всякие спрашивать.
Рекорды, init свойства, улучшения паттерн матчинга, новый синтаксис вызова конструктора для самых одарённых и ковариантность возвращаемого типа для реализаций интерфейса.
Всё что находится внутри ссылочного типа хранится в куче, если это значимый тип, то это значение этого типа, если это ссылочный тип, то это ссылка на объект данного типа.
>Instance variables for a value type are stored in the same context as the variable that declares the value type. The memory slot for the instance effectively contains the slots for each field within the instance. That means (given the previous two points) that a struct variable declared within a method will always be on the stack, whereas a struct variable which is an instance field of a class will be on the heap.
https://web.archive.org/web/20160429155135/http://www.yoda.arachsys.com/csharp/memory.html
Сказал бы коротко - " ничего полезного"
Зависит же.
Во всякие гугло-майкрософты только понимание основ и концептов требуют.
В нормальных конторах на джуна спрашивают азы, задают простые задачки и смотрят как ты мыслишь во время их решения, даже пофиг, если ты их не решил или решил неправильно. Главное чтобы логически мыслил и умел полученную от собеседующих информацию применять (они будут подсказывать, если начнёшь плавать). На сеньора будут просить набросать дизайн небольшой системы и потом обсудить уязвимости, пути улучшения и прочее. И могут задачи по коду из существующих проектов подкинуть. Опять же смысл проверить как ты будешь задачу решать, какие вопросы спрашивать, а не выудить из тебя какого-то коня в вакууме. Решение задач на собеседовании в нормальных конторах должно выглядеть так, как будет выглядеть настоящий рабочий процесс. Типа Колян, у нас тут запара, надо сообразить как задачу решить. Собираемся вместе и обсуждаем. Ты их должен в процесс решения вовлекать.
А есть ещё говно конторы. Там будут просить описать параметр, который надо передать в какую-то функцию, чтобы она что-то сделала. Или 10 вариантов написания синглтона. Или в какой версии есть вот такой вот флаг. И прочее зазубривание конкретной версии конкретного фреймворка.
Вообще как только начинают давить на запоминание, а не на мышление - это сразу красный флаг.
Microsoft.Extensions.DependencyInjection
Он самый быстрый по всем недавиним бенчмаркам, которые недавно видел. А это важно, потому что оно по всему проекты практически на каждый вызов используется. И он вшит по умолчанию. Не надо никаких доп библиотек добавлять. Если тебе не хватает его возможностей, то у тебя или очень экзотический проект, или твоя архитектура - говно.
>Поискал там курсы на русском языке по .Net Core, но практически ниухя нет.
Зачем? Есть 2 книги очень хорошие.
https://www.ozon.ru/context/detail/id/145871271/
https://www.ozon.ru/context/detail/id/148161571/
Как найти в сети чтобы скачать надеюсь объяснять не надо. Есть более новые издания, но они на английском. Если понадобится найдешь. Еще у .NET отличная документация, и почти вся на русском.
Но вообще похоже на троллинг, чем на правду. Не верю, что человек может быть настолько тупым и сначала написать такое, а потом еще и выложить на всеобщее обозрение.
Твоё говнокод можно заменить switch конструкцией в которой будут два конкретных кейса и один по умолчанию (default).
Ну так ты свой говнокод выложи не в виде скриншота или ты предлагаешь мне переписывать?
Виноват, вот
Внимание открывайте спойлер только на свой страх и риск, слабонервным смотреть не рекомендуется!
if (file.type == ".png" || file.type == ".jpg" || file.type == ".mp4" || file.type == ".webm")
{
string imageBase64 = "";
try
{
imageBase64 = PagesMethods.Utils.GetBase64Image(file.id);
}
catch (Exception ex)
{
imageBase64 = "i";
}
clientIamge.ID = "clientIamge_" + file.id; clientIamge.CssClass = "client_image"; clientIamge.Attributes.Add("src", "data:image/png;base64," + imageBase64); createDiv.Controls.Add(clientIamge);
}
else if (file.type == ".txt") { clientIamge.ImageUrl = "imgs/" + "txt.svg"; clientIamge.CssClass = "client_image"; createDiv.Controls.Add(clientIamge); }
else if (file.type == ".rar") { clientIamge.ImageUrl = "imgs/" + "rar.svg"; clientIamge.CssClass = "client_image"; createDiv.Controls.Add(clientIamge); }
else if (file.type == ".zip") { clientIamge.ImageUrl = "imgs/" + "zip.svg"; clientIamge.CssClass = "client_image"; createDiv.Controls.Add(clientIamge); }
else if (file.type == ".zip") { clientIamge.ImageUrl = "imgs/" + "zip.svg"; clientIamge.CssClass = "client_image"; createDiv.Controls.Add(clientIamge); }
else if (file.type == ".exe") { clientIamge.ImageUrl = "imgs/" + "exe.svg"; clientIamge.CssClass = "client_image"; createDiv.Controls.Add(clientIamge); }
else if (file.type == ".iso") { clientIamge.ImageUrl = "imgs/" + "iso.svg"; clientIamge.CssClass = "client_image"; createDiv.Controls.Add(clientIamge); }
else if (file.type == ".pdf") { clientIamge.ImageUrl = "imgs/" + "pdf.svg"; clientIamge.CssClass = "client_image"; createDiv.Controls.Add(clientIamge); }
else { clientIamge.ImageUrl = "imgs/" + "other.svg"; clientIamge.CssClass = "client_image"; createDiv.Controls.Add(clientIamge); }
Работает, сохранил, большое спасибо!
>Какой IoC контейнер сейчас стандарт
это исключительно фломастеры. нет тут стандарта
>>859887
>Он самый быстрый по всем недавиним бенчмаркам
одно можно сказать - он самый убогий по фичам и не самый быстрый если чо.
и единственная его "заслуга" - его вшили в асп.нет, что и не заменить на что-то другое.
>>859896
>А для WPF проектов тоже его стоит использовать
фломастеры же.
от майков самый распространённый. у автофака ахуенная дока и оч полезная для меня фича была с именоваными скоупами, за нинджект не скажу но только упомяну что сайт не понравился и даже доку не смог загрузить когда я судорожно искал ioc
>от майков самый распространённый
только потому что встроен в асп.нет
а значит все либоделы вынуждены брать его за основной при своих разработках либ
и многие на этом и останавливаются ибо на зоопарк контейнеров плодить поддержку - еще тот гемор.
как и с гит - не лучший продукт стал основным потому что гитхаб
Благодарствую, правда, добавил в итоге то, что в бд было - utf8mb4
>Я просто работаю бэкэндером и так заебался жисоны гонять.
идеальную работу (бэкенд без фронтенда да без гуистроения) хочешь променять на.... мазохист что ле
так я не ебу чем они занимаются
как по мне, так пилить игровые механики - прикольно
насколько они ебутся в UI - хз даже, вот и спрашиваю
ничего прикольного нет. я пробовал. помимо самого шарпа нужно знать еще кучу всякой посторонней херни по юнити (не игровые механики, а именно выразить уи в юнити) и иметь терпение для ебли со всей этой поеботой (там моно был когда я пробовал, но уверен на 99% что так и осталось)
одно дело если нет других вакансий или огромная разница в зряплате.
но если сидишь в глубоком бэкенде (а я так понял ты пишешь чисто апи) - то лучше там и сидеть
Игрострой сам по себе ещё более перенасыщенный рынок, чем энтерпрайз, так что делать игры есть смысл только в свободное от основной работы время.
Сап.
У меня многопоточка, поэтому есть некоторые проблемы с завершением программы.
У меня есть таймер, после того как вся работа завершена, я хочу чтобы таймер закончился, он у меня в другом потоке. Как мне после завершения последнего метода остановить программу не закрывая консольку, то есть Environment.Exit(0); не подойдёт?
в современных шарпах треды это зло, юзай таски, но это лирическое отступление. По делу тебе нужно юзать CancellationToken.
создаёшь cancellation token source
передаёшь токен из cts в тред/таску
в конце программы вызываешь cancel у cts
в таске/треде иногда чекаешь что токен не IsCancellationRequested, если запрошена отмена то заканчиваешь работу треда/таски
Спс
ну "не иногда чекаешь", а Register своего хендлера, который просто остановит таймер и все.
У меня есть в бд колонка (поле) с шифрованными строками, перед загрузкой в датагрид я дешифрую эту колонку циклом, потом при попытке изменить таблицу и внести сохранения энтитя подхвачивает дешифрованные ячейки (это при том блять что я создаю новый объект ToList()), делает изменения и соответственно пидорасит базу.
Как в датагриде можно пройтись циклом по непосредственно значениям в колонке?
1) Такая большая платформа - не оверкилл?
2) Как много сил занимает изучение платформы и как много - непосредственно ЯП?
3) Бывает ли хайлоад на шарпе + винде? А торчащий наружу ASP?
не зелёный, честно интересуюсь
> зачем он такой огромный нужен
согласись, всегда приятно когда тебе не нужно самому крафтить пули а достаточно сходить в оружейный гипермаркет за углом
>намечается кроссплатформенность
забудь про framework он уже года как 4 умер. Core полностью кроссплатформа. со всеми проектами с какими имел дело что на коре всё хоститься под линью
> помазано виндой и изучением её внутренностей и утилит
это каких если не секрет? я к примеру из виндового только vs юзаю, всё остальное под wsl'ом
>Как много сил занимает изучение платформы
слишком расплывчато. Ты собираешься драйвера не сетевухи писать или json в браузер гонять, а может что то с пиздатым гуем по всем канонам mvvm?
>как много - непосредственно ЯП?
яп как всегда самая лёгкая часть, если в минимальной комплектации то за вечер т.к. большинство языков похожи, если хочешь прям сдохнуть от сахарного диабета то эт на долго.
> забудь про framework он уже года как 4 умер. Core полностью кроссплатформа. со всеми проектами с какими имел дело что на коре всё хоститься под линью
Это похоже на ответ на мой вопрос, я не знал про отличие Core от Framework
>>860303
> слишком расплывчато. Ты собираешься драйвера не сетевухи писать или json в браузер гонять, а может что то с пиздатым гуем по всем канонам mvvm?
Выше написали, я не знал про Core и думал что весь фреймворм надо учить, чтобы hello world на шарпе в докере запустить
Спасибо анон
сам сходи, раз в каждом моем коменте видишь упоминание (которого там нет)
я упомянул только там, где напрашивалась подходящая аналогия
>3) Бывает ли хайлоад на шарпе + винде? А торчащий наружу ASP?
Хайлоад и на петухоне бывает, а он намного медленнее .Net'a
>весь фреймворм надо учить, чтобы hello world на шарпе в докере запустить
Консолька
dotnet new console -o myApp
cd myApp
dotnet run
Веб проект нужно
dotnet new webApp -o myWebApp --no-https
cd myWebApp
dotnet run
http://localhost:5000
Работает и на винде и на маке и на линухе.
Чтобы в докере запустить, на тебе Dockerfile
FROM mcr.microsoft.com/dotnet/sdk
WORKDIR /app
RUN dotnet new webApp --no-https
ENTRYPOINT ["dotnet", "run"]
Потом делаешь
docker build . -t my-app:latest
docker run -p 5000:5000 --name my-app my-app
на вкус и цвет же.
Для чего нужны разные исключения, если можно везде использовать Exception? Или это увеличивает производительность программы?
а как ты их будешь различать?
ну есть у тебя функция ReadDataFromFile и по логике как минимум могут быть 2 типа проблем: невозможно прочитать файл, невалидная инфа в нём. триггернёшь ты 2 исключения Exception() и как ты в коде определишь что пошло не так? просто плюнешь в лицо юзеру "произошла ошибка номер хуй"?
допустим файла нет и в этом случае тебе нужно загрузить дефолт настройки, но если файл есть и он не валидный то нужно сообщить юзеру. что будешь делать?
ну или юзер запрашивает с сайта какие то данные, у тебя сервис который имеет метод GetSecureData он может вызвать исключения по типу не авторизован юзер, не имеет прав, ошибка получения данных. в первом случае нужно редиректнуть на логин страницу, во втором вернуть что не имеет прав, в 3м отправить "непредвиденная ошибка" и отправить мыло админу что на бэке пиздец
Теперь понял. Спасибо.
ты не понял. exe нужен ТОЛЬКО что бы ты мог красиво жмакнуть даблклик по иконке и прога запустилась. dll же нужно запускать через dotnet xxx.dll. то есть ты можешь спокойно удалить exe.
упаковка в один файл нужна когда у тебя ещё другие сборки подключены.
и к примеру при сборке под таргет в виде линухи у тебя будет за место xxx.exe файл xxx который служит для того же. что бы можно было запускать именно файл а не dotnet xxx.dll
ещё вспомнил. если велючиш паковку в один файл то туда поместиться ВЕСЬ рантайм. Ты сожешь принести этот экзешник даже туда где нет кора и запустить, при этом при первом запуске по факту будет распаковка того что внутри во временную папку и запуск уже оттуда
ещё и двач затроллил с *
>il merge
он же только для фреймворка. под кор есть строенная фича dotnet publish -r <target> -p:PublishSingleFile=true
>он же только для фреймворка
с чего вдруг
>dotnet publish -r <target> -p:PublishSingleFile=true
не эквивалент. и вообще другое это
>при этом при первом запуске по факту будет распаковка того что внутри во временную папку и запуск уже оттуда
Так было только в коре, а в .NET 5 уже ничего не распаковывается, сразу запускается экзешник.
Я без понятия как должно быть. Я юзаю тему из студии 2017 а не эту цветастую галиматью из 2019
Понять-то понял. Но у меня задумана консольная утилита:
> helloworld.exe -p 300 -m 500 -f C:\temp\hellofile.txt
И чо мне вместо этого писать
> dotnet helloworld.dll -p 300 -m 500 -f C:\temp\hellofile.txt
???
можешь так, можешь как и хотел запаковать в один экзешник, но если серьёзно то я бы просто забил, ну будет там несколько файлов и будет никто от такого не умирал
> ну будет там несколько файлов и будет никто от такого не умирал
Перфекционизм не даёт спокойно работать. Буду с этим бороться.
да. с перфекционизмом нужно бороться.
будь сильнее его - создай на каждый класс по длл и не мержи их
Нужно сделать курсовую, суть токова: Фотоальбом "типа микро Инстаграма. Авторизация, Лайки, комментарии, личный кабинет, проект в Visual Studio на c# с базой данных MS SQL Server.
Подскажите какие конкретно материалы изучать, чтобы суметь это сделать в кратчайшие сроки?
И можно ли где-то найти подобный опенсурс проект? В гугле ничего толкового найти не могу.
> Подскажите какие конкретно материалы изучать, чтобы суметь это сделать в кратчайшие сроки?
> в кратчайшие сроки
Ну тут очевидно, надо пару вечеров посвятить краткому видеокурсу хача на ютубе.
Затем на мутанит.
Даю ссылку сразу на 3й урок (в первых много воды, потом посмотришь). Ссылка с плейлистом. Открывай в отдельной вкладке и хуячь под печеньки и чаёк.
https://www.youtube.com/watch?v=MZ0og1DNcCg&list=PL05SB3rBbUsraqiEUeS70RKhVAu97nGeb&index=3
По простому так: хостить будешь в облаке используя PaaS с лоадбалансингом, дудос-защитой и т.д., бекенд делаешь на .NET 5 микросервисами, публичный апи на Nancy, запросы посылаешь через gRPC, события через какую очередь (rabbitMQ, можно использовать PUB/SUB специфический для облачного провайдера). Запросы в БД делай через Dapper для скорости, к БД лучше добавить еще что-то масштабируемое-нереляционное (elasticsearch например, если не привязываться к провайдеру). Фронт - vue.js со статическим хостингом. Аутентификацию на Identity Server. Вроде изи должно быть, я бы с тимой на 4 человека твой диплом за пол года сделал бы!
По материалам - пройди курсы облачного провайдера, любую топ книгу по микросервисам на дотнет, документации MSDN для освоения языка и ASP.NET достаточно, все остальные технологии тоже по документации.
Назвать курсач можешь minigram Enterprise Edition
И мертвый
Вот, например (винформсный не юзал, но судя по докам все это может)
https://docs.telerik.com/devtools/winforms/controls/gridview/overview
Мне нужно скрафтить по фасту на колене админскую часть для бд на шинду.
Объясни мне долбаебу нахуя мне нужен впф?
В нем даже это проще
ASP Net проект уже давно можно делать десктопным. Очень удобная штука, рекомендую. Шаблоны для ангуляра там встроенные (хоть и хуевые). Т. е. электрон нахуй не нужен, я забыл что .Net 5 кроссплатформенный.
контроллеры настолько тонкие что ебанёшся. если что то понадобилось на фронте и для этой сущности уже есть Get метод то можно бэк вообще не трогать, и вообще на бэке достаточно в начале просто нагенерить однотипных crud контроллеров по шаблону и не меняя их уже пилить фронт
из обычного списка ГДЕ? что за технология?
Для чего угодно. современные UI-фреймворки позволяют тебе описать абстрактную платформонезависимую view-модель, которая выводится совершенно одинаково хоть в шиндовс, хоть в андроид с иосом, хоть в линуксовый фреймбуфер.
Я просто только вчера о нем узнал, т.к. сеньеры не использовали в своих частях программы и я думал что вот эти вот пляски с передачей контекстов - то как нужно делать. Но чет прочитал и вроде правильнее было бы из пула просто брать. С другой стороны, если класс живет долго, то контекстов-то не хватить может, и тогда получается что либо контекст несколько классов используют, либо какие-то классы не получат свой и будут ждать, пока попользуется другой, а может быть тут пул - создаст новые контесты, когда кончатся эти. С этим вот и вопросы.
На данный момент я просто сделал класс: ContextFactory<TContext>, который создает новый контекст, но я думаю что это не самое оптимальное решение
Всё уже за тебя сделали, не городи велосипеды, а смотри в документацию:
>https://docs.microsoft.com/en-us/ef/core/miscellaneous/context-pooling
Я не городил бы, если бы в коде сеньера, который он сказал мне использовать как пример, не было так вот:
public class MySingleton{
//куча строк со свойствами
string _myConnectionString;
public MySingleton(IConfiguration config, ...)
{
__myConnectionString = config["MyContext"];
...
}
//много-много строк
DbContext GetContext()
{
var builder = new DbContextOptionsBuilder<MyContext>();
var options = builder.UseDbProviderName(_myConnectionString).Options;
return new DbContext(options);
}
Потому я и не стал умничать, все что сделал - декомпозировал этот синглтон на классы поменьше, чтобы он не делал все и сразу.
А вчера таки прочитал про пул контекстов и подумал что может быть вообще не нужен этот DbContextProvider, а правильнее было бы из пула доставать.
}
Переписывать всё с использованием одного из фреймворков - Avalonia/Electron/Xamarin
трафика меньше, отрисовка быстрее, надеемся также на меньшее потребление ресурсов в браузере, особенно после AOT
Жесть. Надо на собеседовании начинать спрашивать на сколько кандидат любит креатифф. И всех крайне креативных лесом.
Это на сколько надо любит выдумывать и ненавидеть читать документацию!
Uno ещё или ждать MAUI.
скачал бота для одной игры, он на шарпе, кинул в дечдот, за секунды получид исходник. И за этот бот просят ежемесячнцю плату))
плиз хакни DevXUnityUnpacker
Кто-нибудь? Пожалуйста?
если ты про винФормы то просто забей и иди на wpf
И что тут запуталось? Код читаемый. Если детдот не взял, то тулзы от codecracker возьмут. Но это если исходник надо, так то код читаем.
А я-то тут при чем? Мне сказали: Смотри, Антоша, у меня есть код, делай как у меня, только под свои задачи. Я вообще С++'ером пришел устраиваться, но для С++'ера задач не было, вот и сказали: Вот тебе сайт майкрософта, вот тебе задачи, вот мой код как у нас принято делать, через неделю посмотрим что ты там сделал. Плотно изучать документацию банально нет времени, сейчас время появилось, я смотрю - вижу что оказывается есть пул соединений, который почему то старшие коллеги не используют ни в одном из проектов. Я и спрашиваю тут, есть ли реальные причины писать как они в коде выше, либо правильнее было бы таки использовать уже в моем коде - пул, а не делать такие вот странные решения.
А вот говорят, есть некая "нативизация" которая компилирует байткод дотнета в нативный код целевой платформы. Якобы игры на юнити так релизятся - собираешь релиз, а он в нативный код собирается.
Есть ли аналогичное в обычном кодинге, не в геймдеве?
> Как правильно делать переход между страницами в небольших приложениях?
Делаешь элемент-хостер для страниц, который должен быть унаследован от любого подходящего элемента-контейнера, способного держать в себе любой другой элемент, например, панель. Страницы загружаешь в коллекцию. При нажатии кнопок перехода, элемент-хостер убирает из потомков предыдущую страницу и достаёт из коллекции следующую.
если не спизжу то в прошлом году уже юзал и всё билдилось без проблем. но то что сам компилер билдится дохуя времени и нет никаких готовых бинарей печально
Вангую, что нативизируются только стандартные библиотеки. При попытке юзать кучу пакетов из нугета эти тулзы покажут известный жест.
нет, всё в натив из-за этого есть некоторые ограничения, к примеру нельзя динамически грузить dll'ки
1. Обфускация.
2. Самые важные функции вызываются через сервер по udp в зашифрованном и сжатом виде для минимизации нагрузки и времени отклика.
Ну дак! Я ж не могу точно знать, не грузят ли дллки те или иные пакеты из нугета. То-то и оно.
на этапе компиляции всё уже известно как бы. только если они динамически подтягивают сборки откуда то что встречается крайне редко. Собственно я и не вижу способа собирать НАТИВНОЕ приложение и при этом иметь возможность исполнять прозрачно НЕ нативный код. Сказать честно я вообще не вижу смысла билдить шарпы в натив при условии что jit иногда бывает даже быстрее
> не вижу смысла билдить шарпы в натив
>>862295
> Кто как код защищает?
> скачал бота для одной игры, он на шарпе, кинул в дечдот, за секунды получид исходник
Вроде как в этом был изначальный смысл и вопрос.
Я себе мышку наебнул только что. Промыл спиртом и теперь колёсико не работает. Неудобно пиздец. Держу в курсе. Ушёл спать.
Какой из них лучше? Почему?
Вопрос не о том что делает код, а скорее о том, как лучше поступать в таких вот случаях, когда мы имеем некий цикл который выпонляется почти одинаково, но какая-то часть того как итерируется цикл - может отличаться. Можете предложить свой вариант для подобных случаев.
Ясен хуй что второй вариант лучше, так как короче и намного читабельнее. Или я не понял вопрос?
а теперь просто задай значениям в enum TimeUnit числа в секундах
public enum TimeUnit
{
Second = 1,
Minute = Second 60,
Hour = Minute 60,
Day = Hour * 24
}
и делай AddSeconds((int)timeUnit)
ебучий двач сожрал звёздочки
Ну ответ "какой лучше" очевиден.
Название для метода подобрано плохо. И очевидно, что код который будет вызывать эту функцию будет проводить проверку if (FindMissingTime.Count() > 0). Поэтому я бы назвал IsCorrectDateTimeSequence/IsCorrectTimeSequence и возвращал бы булево значение и перечисление интервалов которых не хватает для того чтобы перечисление отвечало нужному условию. Соответственно переменные были бы sequence, interval, start, end
Алсо, этого >>862461 двачую.
Ну блин. А что делать если в команде люди, которые не знают что вот так вот можно?
>>862461
>>862465
Я же говорю, что не в этом суть. Хотя мне вот интересно пронумеровав значения в enum мы будем делать в случае если добавятся месяцы, годы. Ну, вот у нас есть теперь Month, он может быть 30 или 31 день или вообще 28, а в високосный - 29. Как ты тут извернешься-то?
А суть вопроса - как избежать копипастного кода, при этом не используя конструкций, которые могут быть непонятны людям из других языков. Вот допустим посадили на проект человека, который всю жизнь на си писал, он привык вообще малым числом штук обходиться и при этом он ну не хочет забивать себе голову шарпом, потому что на шарп его посадили исключительно из необходимости, доделает свою часть и вернется на си, ему второй вариант непонятен, он просит так не делать, конфликтов на пустом месте не хочется, писать вот такой код как на первом - тоже.
>А суть вопроса - как избежать копипастного кода, при этом не используя конструкций, которые могут быть непонятны людям из других языков
Тут у тебя выбор либо деградировать вместе с этими людьми, либо заставлять этих людей развиваться. Ну и если деградируешь, то делай это максимально медленно, используй >>862461 этот вариант, а не объявление делегата с switch выражением. Перечисления то твои сишники знают?
>Ну, вот у нас есть теперь Month, он может быть 30 или 31 день или вообще 28, а в високосный - 29. Как ты тут извернешься-то?
Так какая разница? Месяц как интервал это 30 дней, переводишь 30 дней в секунды и прибавляешь их при помощи AddSeconds, этот метод уже учтет сколько месяцев в феврале.
> ему второй вариант непонятен, он просит так не делать, конфликтов на пустом месте не хочется, писать вот такой код как на первом - тоже.
А что там непонятного? Интуитивно понятно же, что такой код делает. Разве что вместо Func<> я бы написал DateTime addTime(DateTime unit) ...
Локальные функции даже в си есть вроде только в гцц, но есть, а что делает switch expression даже дебил поймет.
Просто вместо делегата и switch expression используй функцию (можно даже локальную) и обычный switch statement в ней, в чём проблема.
Получится говно не лучше if else, лучше тогда if else портянку сложить в один цикл + switch case
java). Помогите определиться и понять почему C# будет плохим выбором?
да блин какие еще енумы или фанки
определяете в своем switch (старого или нового вида) TimeSpan ака "шаг приращения"
и потом только dt.Add(step)
Юзай TryParse
так лучше пусть упадет
во первых он никогда не сработает
во вторых когда подобное срабатывет то ты получаешь "не сработало но нискажу пачиму"
сработает, это во первых.
во вторых - можно потом вывести мессендж, что что-то пошло не так. Правда лучше было это сразу сделать, и отловить - что за эксепшен.
ну если этот Matrix.Parse написан подобным образом то может и сработает
а во вторых ты можешь вывести мессадж что что то пошло не так. но никто никогда не узнает нигде (даже в логах) даже намека на то что не так
вот так же и фильтр сообщение на этом дваче написан
"не прошло и ебись угадывать что ему не так"
ох уж эти староверы. по хорошему list никогда не должен быть быть нулл ибо не помечен как нулабле
но принимается.
но гасить такую ошибку вообще глупо
Учить хочу не для вката в профекссию, а просто для саморазвития.
Как избавиться от этого и наконец-то начать?
Сходи к психологу/психиатру, таблеток попей.
Подожди пока шарп загнется и учи самую современную версию сколько душе угодно. Пока в алгол можешь вкатываться.
но ведь тогда он будет уже очень дряхлым стариком побивший мировой рекод по долгожительству
память то будет уже слаба
Без надежды - что без одежды: и в теплую погоду замерзнешь.
она у тебя выдаст ошибку если ввести пробел и нажеть ентер.
с исключениями вообще все просто
они делятся на 2 вида - те, про которые ты знаешь и те. про которые не знаешь
ловить исключения нужно там, где знаешь как на них реагировать. Ловить на верхнем уровне то, что не ожидал и решать писать ли в лог или вывести юзеру вот так - тоже подходит под это правило.
придерживайся fail fast подхода - если что -то пошло не так как ожидалось, то лучше прервать выполнение текущей операции (или всей софтины)
В итоге ты отловишь все нежданчики и пропишешь на них действия. И это лучше чем catch который глушит ошибку и делает ситуацию неопределенной и ее не починить (нет контекста проблемы)
ctach c return false тоже иногда полезен, но только иногда, когда нужно TryXXX сделать и реально не волнует "почему не вышло"
ну а по хорошему то на скрине неправильно
тебе нужно завести исключение типа InvalidCommandArgs и разбирая все эти command[0/1] и int parse его и кидать
потом его ловить и выводить пользователю
а ниже уже глобальный catch который логирует (пусть хоть прямо в консоль - для консольной утилиты это норм) и говорит что "полный пэ"
Я бы как-то так сделал. Вот. Да. Хуй знает, говнокод или не.
ну семантический говнокод немного есть
например AsEnumerable и AsReadonly
а насчет ошибок тут ведь "зависит"
это ж консольщина и этот Console.Writeline с 3 пика если не должен прервать операцию, а по факту лог операции, то очень даже валиден
С такой вот структурой, я бы, на твоем месте, валидацию вынес до того как добавлять в список матриц. Зачем вообще методу что добавляет матрицу то там знать о том что может возникнуть исключение? Ты просто проводишь валидацию строки, затем, если строка валидна - создаешь матрицу без всяких плясок с исключениями и добавляешь эту матрицу в свой список, если невалидна - выводишь сообщение: "Невалидная строка. Идите нахуй".
Ну и команды бы вынес из простых строчек в отдельные классы, ну да ладно, это наверное для лабы не нужно.
DbContext как правило менеджится рантаймом и передаётся через DI (Dependency Injection). Обычно его делают scoped, т.е. он живёт с момента создания и до самой отправки response клиенту. Но там по ситуации. Dispose тоже вручную делать не рекоммендуется (если конечно всё остальное тоже руками не делается), потому что есть шанс что ты его задиспозишь до того, как система решит что делать с объектом и может накидать ошибок.
Немного сложнее, когда у тебя один контекст к разным БД подцепляется, но там надо по ситуации смотреть. Судя по твоему коду этот класс коннектится всегда к одной и той же БД (если это и правда синглтон), поэтому городить и поддерживать свой собственный велосипед = грабить ресурсы у твоего работодателя. Да и иногда твои собственные, когда оно внезапно начнёт заваливаться и тебе придётся сидеть до поздна в офисе и разгребать этот трэш.
Много чего уже и так близко к этому работает. К .NET 6 обещают ещё ближе:
We've seen a lot of comments on previous preview posts asking about the relationship between single file apps and ahead of time (AOT) compilation. AOT is a spectrum. The ready-to-run code that dotnet publish generates (when you set PublishReadyToRun to true) is an example of AOT. When you publish ready-to-run images, the build generates machine code for you, ahead of time, instead of the JIT doing it at runtime. Most people will likely accept this as a definition of AOT. However, many people mean something more specific when they say AOT.
They want a solution that has the following characteristics: extremely fast startup, no IL present (for size and obfuscation reasons), a JIT is (at most) optional, and binary size is as small as it can be. We use the term 'native AOT' to describe that point on the AOT spectrum. The single file solution we have in .NET 5.0 doesn't satisfy this definition of AOT. It's a big step forward, but it isn't 'native AOT'. We recently published a survey on Native AOT to get more feedback on that modality. We're looking through the results now and will include them in our 6.0 planning effort.
троль?
Делай интерактивное консольное меню:
while (true) {
switch (Console.ReadKey(true).Value) {
...
}
}
При нажатии стрелок вниз/вверх перерисовываешь консоль смещаясь вниз/вверх и запоминаешь текущее положение, при нажатии Enter выполняешь операцию в зависимости от текущего положения.
да какая разница, говнокод или нет главное - что работает. Заказчик не смотрит на говнокод, он в нем вообще ничего не понимает, анон)
Заебался - на работе только ёбаный SQL последние полгода.
Зачем его защищать? На шарпе пишут то что крутится на сервере. Если это одиночная компьютерная игра или утилита, то опять же смысла защищать никакого.
Учи там где уже все давно устоялось. Яву ту же.
enum MyEnum{
Item1 = 15,
Item2 = 31
Item3 = 45
}
Эти индексы в одном месте используются и от этого не уйти сейчас. А ещё у меня есть впфовский combobox, в котором опять-таки лежат названия этих itemов и по индексу элементов comboboxа мне надо опять-таки брать энумовский элемент и использовать, но очевидно, что по индексам 0-2 я уже не возьму нихуя. Как это можно решить?
Напиши веб-морду для сиквел сервера типа SSMS.
>Зачем его защищать?
не надо защищать? То, что продается с абонплатой - не надо защищать?
>На шарпе пишут то что крутится на сервере
а, шарп - это замена php. Понял, принял))
можно без лишнего linq просто приводить к T[], там под капотом создаётся Array
всегда руками формирую список. зато явное управление порядком
Я пишу в коде авторизации комментарии "Жулик, не воруй!" - пока помогает отлично. Правда, я только веб делаю. А для десктопа жду с надеждой AOT компиляцию в .NET 6. Пока дотнет только радует, может и это запилят.
Кстати, аппы под UWP уже вроде давно c AOT собираются. Так что если именно надо AOT под тесктоп, а на всё остальное пофиг, то welcome to уёбищный UWP.
>>861368
>>861350
Сердечно извиняюсь за крайнюю тупость... Порыскал я по интернетам и нашел вот такой проект.
Скачал, а что с ним делать-то? Как его скомпилировать-то? Где приложение-то???
https://github.com/KCeh/raupjc-projekt-InstaPound
Аноны, мне честно просто тройку получить.
если тройку то заплати пару банок пива сокамернику и пусть он тебе поднимет эту фигню.
... поспособствуй деградации отечественного образования.
Ты забыл про юнити и хамарин и ML
Никаких. Аспнет + ангуляр это единственный шанс вкатиться.
Объясните, почему, когда мы перебираем массив, мы можем перебрать его так
string[] b = { "Pidor", "Fago" };
foreach(string c in b)
{
Console.WriteLine(c);
}
Но когда мы читаем файл, то нужно исползовать именно цикл while?
StreamReader a = new StreamReader("/home/netsky/1.txt");
string name = a.ReadLine();
while(name != null)
{
Console.WriteLine(name);
name = a.ReadLine();
}
И почему, когда я хочу использовать foreach, он выдает мне по одной букве
StreamReader a = new StreamReader("/home/netsky/1.txt");
string name = a.ReadLine();
foreach(var o in name)
{
Console.WriteLine(o);
name = a.ReadLine();
}
И как-то можно значения
StreamReader a = new StreamReader("/home/netsky/1.txt");
string name = a.ReadLine();
Записать сначала в массив, а потом методом foreach перебрать строки?
реально хочу понять, как это всё работает, почему так, а не эдак, но в учебниках так не разжевывают
Объясните, почему, когда мы перебираем массив, мы можем перебрать его так
string[] b = { "Pidor", "Fago" };
foreach(string c in b)
{
Console.WriteLine(c);
}
Но когда мы читаем файл, то нужно исползовать именно цикл while?
StreamReader a = new StreamReader("/home/netsky/1.txt");
string name = a.ReadLine();
while(name != null)
{
Console.WriteLine(name);
name = a.ReadLine();
}
И почему, когда я хочу использовать foreach, он выдает мне по одной букве
StreamReader a = new StreamReader("/home/netsky/1.txt");
string name = a.ReadLine();
foreach(var o in name)
{
Console.WriteLine(o);
name = a.ReadLine();
}
И как-то можно значения
StreamReader a = new StreamReader("/home/netsky/1.txt");
string name = a.ReadLine();
Записать сначала в массив, а потом методом foreach перебрать строки?
реально хочу понять, как это всё работает, почему так, а не эдак, но в учебниках так не разжевывают
>Первый это как я понял среда разработки на Си#, а второй просто редактора кода
первый это рантайм где выполняется код. Ну еще и сдк, который может иметь в себе набор утилит для разработки. Но не редактор
а второй ага редактор
редакторить можно хоть в блокноте, а компилить из консоли.
>когда я хочу использовать foreach, он выдает мне по одной букве
потому что фореач перебирает Ienumerable, котоырый выдает по 1 элементу перечисления
для массивов это элемент массива, а для стрингов это буква
и в данном примере ты читаешь стринг, а потом его по букве фореачишь
и да ты можешь прочитать File.ReadAllLines и перебирать фореачем потом
фореач для потока не существует и StringReader тоже не умеет. почему не сделали (вот как в питоняшах) - хз
хотя свое решение типа EnumerateAsLines пишется за 10 минут
> свое решение типа EnumerateAsLines пишется за 10 минут
Потому и не сделали. Не подтирать же слюни за всеми?
Нет кор уже устарел, ставь нет5.
Почитай как устроен шарп. Если грубо и кратко, то неткор/моно/нет5/нетфреймворк это компиляторы+вм+стандартная либа для шарпа, а не иде. Шарпокод без одного из них ты не скомпилишь и даже не запустишь.
Вскод это редактор/иде, кроме него под линукс есть еще платный проприетарный JetBrains Rider.
Алсо, вин формочек и wpf под линукс нет, будь готов к этому.
Немношк не понял тебя. Убожество - это {наличие вышеописанной фичи} или убожество - это {отсутствие фичи, но возможность (и наличие инструментов для того чтобы) написать её за 10 минут}?
убожество это отстуствие
написать за 10 минут можно много чего
и потом у каждого рождается либа типа CommonUtils где ОЧЕВИДНЫЕ велосипедные вещи
у тебя нету? даже у Jon Skeet есть
вот например вышеописанный линечитатель гы гы
https://stackoverflow.com/questions/286533/filestream-streamreader-problem-in-c-sharp/286598#286598
А знаешь ли ты, что в Timer захватывает контекст AsyncLocal и чтобы его не захватывало, то например есть вот такая фигня https://github.com/dotnet/aspnetcore/blob/8c1bf1f1a31f852880c16575bca62507b75112bf/src/Shared/NonCapturingTimer/NonCapturingTimer.cs
которая внезапно (то есть типично) internal, а значит ты не можешь использовать готовое решение, а должен делать велосипед
таймер без побочных эффектов - да не. никому не нужен.
а такого добра навалом.
Делаю консольное приложение, мне нужно чтобы при неверном вводе в консоли программа не вылетала, а ввод повторялся заново.
Я нашел 2 варианта решения данной проблемы: https://pastebin.com/J4pAA50M и https://pastebin.com/z7JRbF2k
Но оба варианта пусть и рабочие, но мне кажутся не очень красивыми, читал что использование while(true) считается дурным тоном, а в другом варианте проверка на null как таковая не нужна, но убрать я ее не могу, мне же нужно что-то проверять в цикле...
Может подскажете более элегантный вариант?
ну всякое разное
шаблоны проектов, рослин тот же, тест утилиты - вся эта хрень на рантайме не нужна и потому она в сдк
Стоило погуглить считается или все-таки нет, нашел вариант с for(;;). Спасибо за помощь!
Я не знаю, но выглядит более элегантно явно! На самом деле сейчас заинтересовало, как оно работает под капотом, пойду сейчас изучать.
выглядит как раз по сишному хаково вместо понятного while(true)
И да, отличие в том, что for(;;) написать быстрее!
>>864540
Разница в семантике, for(;;) принято использовать в местах где выполняется определенный алгоритм состоящий из нескольких стадий, т. е. это обычный for только переменные инициализированы и изменяются непосредственно в теле цикла. while (true) во всех остальных случаях.
Тебе как раз while(true) использовать нужно.
Спасибо за подробный ответ!
вайл ещё удобно использовать, когда итератор в теле цикла.
do
{
//команда1
//команда2
i++;
//команда3
}
while (i < 10);
Буквально вчера с этим сталкивался. Мне надо было вернуть количество итераций по выходу из цикла, а цикл мог брейкнуться в любой момент и мне нужно было, чтобы он брейкался не до, не после, а в середине цикла, причём не в начале и после части операций. Тогда получалось удобно мне, что итератор уже прибавлен, но другие команды остались с предыдущей итерацией. Короче долго обеснять и говнокод не здесь.
>хотя свое решение типа EnumerateAsLines пишется за 10 минут
Я только вкатываюсь, читаю оф доки на майкрософт и всё по порядке на метанит, сижу прям вдумываюсь, реально хочу понять, как работает нормальный язык. Пока за 10 минут не напишу, даже до ООП еще не дошел, на массивах и циклах уже 2 дня завис, чтоб реально понять, а не копипастить
var arr = File.ReadAllLines("file/path");
foreach(var str in arr) {
//работай со строкой
}
Оно читает все строки из файла и складывает их в массив string[]
Я оч люблю шарп, но меня убивает то что нужно неймспейсы и классы прописывать, хотя всеми возможными конвенциями уже порешали, что в одном файле - один класс/интерфейс/структура, а неймспейсы берем из пути.
Так вот, может быть есть какой-нибудь плагин для студии, чтобы что-то подобное можно было написать, а он бы(плагин) потом скомпилировал и сам расставил классы-неймспейсы используя путь и название файла?
Неужели я действительно такой ебанутый и только мне приходит в голову что это какая-то ебота каждый раз писать неймспейс, да даже если не писать, а при создании он сам пропишется, все равно же выходит что просто так 8 символов сожрали на псустом месте, на кой оно надо - непонятно, читать - менее удобно.
>оф доки
>метанит
>хочу реально понять
Проиграл. Чтобы реально понять нужно книги читать, а не краткие выдержки из них. Доки хороши только если ты уже знаешь шарп и нужно освежить что то в памяти.
Этого не слушай. У каждого свой подход к обучению. Мне за всю жизнь только одна книга зашла - https://www.amazon.com/Pragmatic-Programmer-Journeyman-Master/dp/020161622X
мимо архитектор
>>864263
Тебе вроде как ответили, но все равно разъясню
foreach(var it in enumerable), это по сути то же самое что
while(enumerator.MoveNext())
{
var it = enumerator.Current();
...
}
IEnumerator- интерфейс для классического паттерна Итератор. Этот паттерн используется, когда нужно пройтись по элементам некоего множества.
Так вот, когда ты читаешь строку - ты получаешь массив символов, т.е. логично, что у тебя при foreach будет посимвольный перебор.
Если тебе нужно построчно - используй File.ReadLines, он, во-первых, вернет тебе не массив, а как раз IEnumerable<string>, что позволит не читать файл целиком сразу, а получать строки при когда тебе надо, это будет удобно, допустим, если ты читаешь какой-нибудь здоровый csv, опять же Linq можно использовать и ты можешь просто найти получить, например, все строки, которые начинаются с заглавной буквы.
Вот. Да.
Да, если тебе принципиально хочется StreamReader, то можешь прикриплейд намутить
Мне не принципиально. Подскажите, как лучше делать, через вайл и файлопен или как? просто в оф доках именно стримрайдер был
Как тебе удобно и в зависимости от задач.
System.IO.File - просто статичный класс, который под капотом делает штуки типа первого прикриплейд(это для чтения файла целиком). Считай такой вот шорткат, чтобы ты не заморачивался со стримом, когда тебе просто нужно прочитать что-то. Ну, как и Console, например. Она под капотом тоже много всего делает, но ты же не запариваешься когда тебе нужно просто строку вывести со всем этим, ты просто пишешь Console.Write/WriteLine в зависимости от того что тебе нужно. Или Math, ты же сможешь написать то что на втором прикриплейде сам, я думаю, но ты просто не паришься и пишешь Math.Max(a,b), оно и понятнее и проще и не нужно постоянно тернарник писать, хотя не то чтобы сложно.
Зачем ты стараешься, ты что дурак. Тебе за это больше не заплатят.
Если есть время и вкатывание не горит тебе бы в языке аля С повариться полгодика, сильно проще потом будет.
Не посыпится, синтаксис вообще-то одинаковый и там нет ничего лишнего, все что выучишь там пригодится и в С# и в любых других языках. Причем достаточно просто выучить основы С и потренироваться реализовав на нем базовые алгоритмы и структуры данных, это уже тебе буст даст мощный.
Задача: на пикче при нажатии на определенную область разметить прозрачный прямоугольник кастомных размеров, с красной обводкой типа подсветить конкретный предмет на пикче.
Полез я искать как на контрол Image повешать rectangle. Как оказалось (насколько я понял) что image - хуита без задач и нихуя не поддерживает кроме негетеросексуальной его ориентации разработчиков. В тырнетах сказали что для этого нужен canvas. Дрочился я с канвасом и понял что он тоже говно и нихуя мне не подходит потому что я не могу с него выцепить Actual height/width картинки (мне обязательно надо) которая по задумке должна быть на Imagebrush'e. Были еще советы с каким-то классом для байтоебства (типа битмапа), но я их к сожалению проебал.
Сейчас сижу дрочу Bitmap'и, велком ту 2005 нахуй. Я все же верю что это я даун и есть какой-то нормальный способ изподкоробки нормально подсветить rectangle или что-то подобное.
ты же знаешь размер картинки
спроси его у Image если не знаешь
если она автоскейлится то спроси у канваса размер для пересчета
саму картинку как фон канваса и рисуй поверх что хочешь
> ты же знаешь размер картинки
Не совсем, пикчи динамически подгружаются с коллекции байт массивов.
> спроси у канваса размер для пересчета
Как? А если ресайз окна?
Алсо, как фон канваса она очень всрато подгружается в отличии от image.
>>865271
> мне не подходит канвас
> мне похуй что он тебе подходит - канвас
Алсо, я уже сделал все просто битмапом/graphics, правда конечно было бы лучше рисовать поверх картинки.
>Как? А если ресайз окна?
что значит как. у всего есть ActualHeight/ActualWidch
подпишись на ресайз и пересчитай все
это если не хочешь юзать Viewbox
> сего есть ActualHeight/ActualWidch
Толи ты не понял, толи я идиот. Мне нужны размеры конкретно пикчи, а не контрола очевидно. Ни в свойствах бэкграунда, ни имеджбраше я такого не нашел, в отличие от имеджа где ни на что подписываться не нужно.
хз зачем тебе реальные размеры. если ты не скейлишь то они совпадут с размером контрола. А если скейлишь то толку от них ноль.
но если нужно
но вот тебе псевдокод
var bmp = ImageBox.Source as BitmapImage
bmp.PixelHeight
bmp.PixelWidth
К примеру есть
List<string> testList= new List<string>();
и я хочу на каждом
testList.Add("XYZ");
остановиться.
Этих вызовов Add в программе просто куча и я не знаю как мне отловить нужный мне чтобы понять что там в программе происходит.
относительно можешь
если студия может подгрузить symbols то сняв just my code сможешь - вроде так
решарпер вроде позволяет без исходников декомпиля на лету
dnSpy тоже может
степень успешности наблюдения значений переменных конечно "как повезет"
начни с dnSpy
или ты про перехват доступа к элементу? вроде бы ozcode так может. расширеник к студии
>>865339
Я про то чтобы ставить точки основа на том же testList.Add что посмотреть что за строку он хочет добавить.
А затем я смогу используя эти данные уже написать условие в точке основа и посмотреть нужное мне место в программе.
Проблема в том что там не один такой Add, а их тысячи в программе и я не знаю какой именно работает не правильно.
у тебя проблема
ты конечно можешь поставить бряк внутри Add
но он не отличит нужный тебе инстанс от других
хз как тут валидно. если бы очень хотелось то может дикий вариант - получить адресс списка в памяти где ты можешь его достать в коде и потом проставить внутри Add бряку где сделать кондишен на этот адрес для this чтобы ловить только нужные.
>долбоеб с двузначным IQ использует WPF для работы с графикой, а не написания десктопных приложений
>рряяяяя WPF сраку рвёт!!
Проиграл.
захотелось побенчмаркать
Работой с графикой?
количество вариантов можно увеличить если вспомнить про ReferenceEquals и то что "" интернирован
ну и Span<> с MemoryMarshal для космического разума
Ну, допустим, у меня есть товар в магазине, у него есть характеристики, ну, недолго думая, я беру и делаю в БД 3 сущности:
Product(id, name, typeId),
ProducProperty(id, name)
ProductPropertyValue(id, propertyId, productId, valud, dateTime) -- в таком виде, чтобы можно было статистику собирать, смотреть как покупают и какую-то аналитику делать
Так вот, с таким вот видом - получается что нужно кучу DTO'шек, т.к. фронтендеру хочется чтобы ему сразу приходил нормальный JSON'чик, чтобы он просто вставил, ну, оно и понятно, но это же будет куча DTO'шек под каждый тип товара, да, сейчас проще с рекордами, но блин, все равно же получается довольно много dto'шек.
Может быть я что-то не так делаю? Ну и опять же, с таким вот видом мы храним свойства товара в строках, т.е. чтобы больше-меньше делать, придется хардкодить, а эт нехорошо. Зато база получается нормальная.
Короче, наверное не совсем для шарпотреда, но блин, я вот .net'чик, при этом никакого отдельного человека который бы базой занимался - нет, приходится самому придумывать. Возникают вопросы, хз где и у кого спрашивать. Думаю просто что тут тоже многие по долгу службы и базу сами себе пишут.
Ну, я бы вынес в json. С ним же самому тупо удобнее, плюс этот файлик можно хоть на линуксе, хоть на макоси использовать. Короче, я бы вынес.
Ну какое то идиотское разбиение, зачем мне разбивать свойства на отдельные таблицы? Если нужна статистика, то создаешь сущность ProductStatistic и делаегь её зависимой сущностью Product
> зачем мне разбивать свойства на отдельные таблицы
Чтобы у тебя холодильники, телевизоры, пылесосы и т.д. могли храниться в одной таблице же.
У них есть пересекающиеся свойства, есть уникальные, вот, допустим, масса почти у всех наименований есть, а вот диагональ экрана - только у тех товаров, у которых есть экран и он является той характеристикой, что нужно указывать. Конечно, в nosql - это решается на изи, у нас просто есть сущность товара, а свойства - какие хотим хреначим, но в sql, если мы еще и нормальную форму хотим, не хотим дублирования и т.д. - то я не знаю лучшего решения. В даноном случае - мы запонили свойства и не трогаем, потом у нас начали продаваться увеличители членов - мы добавили новое свойство - давление на член - все, мы можем в ту же таблицу что и остальные товары класть увеличители членов и товары все в одной таблице находятся. Как ты предлагаешь решить такую вот ситуацию в рамках SQL?
> Неужели я действительно такой ебанутый и только мне приходит в голову
Воще ящитаю, это какая-та идиотия - считать фаел текстовый классом. Должно быть по другому совсем! Файл - это код на шарпе! Классы - это типы. Вот пусть и обьявляются как типы! Неча мне тут!
Program Sharpoproga
{
class Foo : Form {}
interface IBar {}
string ObychnaPeremenna = "Baz";
void Main(string[] args)
{
new Foo { Title = ObychnaPeremenna }.Show(); //Всё, прога запустилась и работает
}
}
То что ты делаешь это тоже самое что в коде создавать интерфейс вида ISacleValueStorage и имплементировать его у любого класса в котором есть хотя бы одна скалярная величина.
Если общих параметров много, например те же вес, габариты и т. д. то для этого можно создать отдельную зависимую сущность - Measurements и хранить всё в ней. Если для отдельной группы есть специальные величины, то создаешь группа продуктов+Measurments.
Не плохо когда у тебя 1-2 свойства повторяются, либо какое-то из свойств не используется у определенных сущностей. DTO на стороне программы уже отфильтрует всё нужное и не нужно. Но вот твой подход просто раздует бд и превратит её в монстра на которого не захочется смотреть.
Наоборот же. Данные будут консистентны, разве что к таблице ProducProperty добавить еще и таблицу: PropertyType, в которой прописать, инт это на самом деле или строка или дата.
Ну, т.е. да, я понимаю, что неоч удобно со стороны выглядит, но по факту - у нас получается что товар не обладает ничем лишним, при этом если мы удалим из базы какое-то свойство - мы не будем вынуждены удалять весь товар с этим свойством, мы удалим только записи которые товар со свойством связывают, например вот была бы какая-то сертификация определенной группы товара по одной системе, потом вышел указ - все, эта сертификация хуйня, не нужно - мы удалили, но никаких null'ов не осталось, просто исчезло это свойство, а потом мы добавили новое свойство, например новая система сертификации появилась - все просто будет.
Конечно, можно было бы хранить все в виде поля property которое бы имело формат json, но что если мы решим нашу бд в какой-нибудь СУБД где нет json'ов использовать? Короче, я не знаю на самом деле.
Просто опять же, смотри, вот я могу сделать пару джоинов и у меня будет табличка вида:
IDТовара-Название-Размер-Цвет-Производитель-Страна для одного товара
а другим джоином
IDТовара-Название-ОбъемПамяти-РаъемПодключения-КоличествоЦикловПерезаписи
При желании опять же я смог бы сделать вьюшки под категории товаров чтобы уже такой вот вид получать, при большом желании можно захреначить вьюшку где у каждого товара будут все свойства, а пропуски - null'ом
Блин, короче, действительно я чет не понимаю, наверное.
В любом случае спасибо что ответил. Я, наверное, хренью маюсь.
Твоё предложение больше на троллинг похоже.
>нашу бд в какой-нибудь СУБД где нет json'ов использовать
JSON это обычная строка. Что-то я не представляю себе СУБД в которой нет поддержки строковых типов данных.
>я могу сделать пару джоинов
И потом ты начинаешь путаться в этих джойнах и отношениях. Не говоря уже о том как это раздует твой код.
>Что-то я не представляю себе СУБД в которой нет поддержки строковых типов данных.
мимокрок. хранение json строк и поддержка json это разные вещи.
> И потом ты начинаешь путаться в этих джойнах и отношениях.
Вот потому я и спрашиваю нормальное решение. Сам понимаю, что пока это только я пишу на начальном этапе - никакой сложности-то нет, все в голове, а пока этих свойств не так много, но если эта хреновина будет жить какое-то время, а я, банально перекинусь на другой проект - хрен пойми как с этим потом работать.
Но как сделать проще - я не знаю. Вот хоть убей. Особенно учитывая, что задача именно так поставлена: Мы не знаем что будет храниться и какие свойства там будут, потому сделай МАКСИМАЛЬНО ГИБКО.
>И что же это за поддержка json строк такая?
а это когда ты не просто хранить жсон как строку, а база данных знает, что это жсон и ты можешь использовать это в SQL запросах выполняя поиск по какому то полю в жсон (сравни это с полной выгрузкой всей таблицы на клиента, декодированию жсон и фильтрацией на нем), а то и индексы делать
> я и спрашиваю нормальное решение
Там выше тебе анон дал правильное решение. Обрати на него внимание попристальнее:
>>865698
> Если общих параметров много, например те же вес, габариты и т. д. то для этого можно создать отдельную зависимую сущность - Measurements и хранить всё в ней. Если для отдельной группы есть специальные величины, то создаешь группа продуктов+Measurments.
Я тут решил попробовать net 5 и для этого пришлось ставить студию и это же ебаный пиздец, там тормозит абсолютно все, каждое нажатие клавиши с задержкой, подсказки тормозят на секунду, а уж про то чтобы быстро реальный код писать я вообще молчу.
Не тормозит только пустой проект на консольке, я же открыл реальный рабочий проект и хотел попробовать на net 5 перевести его, но это такая боль.
Неужели майки не могут запилить нормальную не лагающую IDE?
Rider, я на нем уже пару лет сижу.
Но он не обновился до net 5, а EAP версия почему-то не качается, выдает старую версию, поэтому пришлось скачать студию.
У тебя студия на говне и досках запущена была. Но да, производительность низкая, потребление памяти высокое, работать в ней не слишком комфортно. А что поделать? В каждом опросе от майков пишу, что производительность низкая, и вас призываю.
ryzen 3700x, 32 gb ram, 970 evo plus.
Если это говно, то я боюсь представить что происходит на мобильных процессорах.
А на память мне насрать, если надо я еще докуплю 32 гб, лишь не лагало. Кстати студия на том проекте сожрала 12 гигов оперативки.
Меня эти лаги дико напрягают, так как тормозят меня, я тут значит 300-400 знаков в минуту со слепой печатью могу, а студия меня тормозит до 50-100.
> А что поделать?
Уходить на альтернативый если возможно. Тот же Rider, правда он не на всех проектах работает, есть некоторые которые тесно завязаны на студии и там даже скомпилировать не выйдет.
Встречал такое с fody, райдер не смог скомпилировать, а студия сожрала, поэтому пришлось писать в райдере, а затем запускать из студии для дебага.
>ryzen 3700x, 32 gb ram, 970 evo plus.
Это странно. Подобные лаги у меня были лишь на 4 ядерном i5 с включенным решарпером - а проект тоже большой. Может баг какой словил?
>Тот же Rider
За него шекели просят - поди убеди ПМа.
838x262, 0:20
>Может баг какой словил?
Это стабильное поведение растущее с временем работы над проектом, уже через час лаги становятся под секунду для подсказок. И это даже еще решарпер не стоит.
Вот первые минут 5-10 еще терпимо работать, тормознуто, но терпимо, а дальше с каждым нажатием все медленнее и медленнее.
Чтобы было понятнее вот видео о том как студия тупит, даже нормально скобочки светить не может, задержка сильная при том каждый раз разная.
>За него шекели просят - поди убеди ПМа.
Для дома можно и бесплатно если очень хочется.
А для организации. Это сильно зависит от организации. Если судить по моим знакомым, то у более чем половина организаций стоит пиратская винда или вообще не активированная. А значит и эту себе взять не проблема.
>Это стабильное поведение растущее с временем работы над проектом
В такой ситуации могу лишь сочувствовать и проклинать майкрософт
>Это сильно зависит от организации
В моей не пройдет такое
Какая сейчас главная технология для этого? WPF? В какую сторону мне смотреть.
Никакого Universal-говна писать не собираюсь. Старое доброе окно со старыми добрыми кнопочками
Ставлю анус хард у тебя говно.
Алсо, студии нужно нормально прогрузить проект пару минут, особенно твой 12 гиговый, можешь посмотреть по диспетчеру и вкладке диск.
>писать оконное приложение под дескто
зависит от того вин десктоп или кросс
если вин то WPF ня
Поддерживаю ставку своим анусом. Оффтоп, но недавно смотрел стрим по какой-то игре, и там стример жаловался, что у него твердотельник тормозит и он его собирается сдать по гарантии, а пока > четырека небудит, смотрити в двака".
>>865997
Так что твердотельник не гарант скорости. Чекай кристалмарком.
Стой, не уходи! ВПФ - говно! Оно прибито гвоздями к венде. Ты сделаешь проект, а потом юзеры запросят билд под макось или убунту - и придётся тебе весь УИ заново переписывать. Юзай Eto.Forms - вотета НЯ!
Скорее всего в процессоре проблема. Интеловские процы лучше подходят для вычислительной деятельности.
Нет
Не, там какой-то бельгиец штоле разраб.
>>866091
Хамарин это другое. Понимать надо. На мобилах eto рисуется через хамарин, на маках через дарвин, на виндах через впф, на линуксах через гтк - и всё это уже заботливо собрано и разложено по нугет пакетам - только подключай.
>>866174
Линуксоиды не любят кут, не знаю почему, я-то сам убунтовод-колясочник и сижу под кедами. Говорят, существующие шарповые бинды плохи. Но я не проверял. Да и зачем, когда есть Eto?
>>866201
Чот погуглил щас, а там в результатах в основном такое: "до свиданья электрон, здравствуй %очередной УИ_тулкит%"
Мне-то что нужно: Программулину написать, чтобы следить за количеством краски в принтерах, чтобы я смотрел, что в таком-то кабинете краска заканчивается - пришел, поставил новый картридж, никто не звонит, красота. У принтеров, как я погуглил, есть этот самый SNMP, ну, я подумал: А че, я и так полдня сижу в потолок плюю, да видяшки смотрю, а тут автоматизирую процесс своей работы, буду заранее видеть, заменять и плевать в потолок на 50% больше, красота же. Но то что нагуглил - какой-то оверхед как мне кажется.
> Но то что нагуглил - какой-то оверхед как мне кажется.
Да похуй. Ты ж не на код смотреть будешь, а на красивую всплывающую табличку в трее.
> и нашел sharpsnmplib
Так, падажжи! Ты нугетом не пользуешься штоле? Я вбил туда snmp и мне выдало десяток вариантов от разных авторов на любой вкус.
1280x720, 0:57
Может через задницу гуглю, но что-то не могу найти.
> Юзай Eto.Forms - вотета НЯ!
все, где внешний вид не отделен от логики, как в WPF - не ня вообще. Так, хуету делать разве что.
Хз че там в ето.формс, но если там не отделено, то дажа авалоания лучша будя
в WPF тоже хватает WTF (нувот их блин стили че так, хотя в авалония уже получше), но сама концепция ня ня
обещает реактивеуи. хорошо для тех кто так мыслит и считает что именно так правильно, а по другому нет. На любителя в общем. Лично я, как мамкин фреймворкописатель (и под авалонию тожа), не нашел достаточных оснований по сравнению с INPC + Fody, чтобы овчинка стоила оверхеда и новой ебли вприсядку
Хотя конечно тут дело привычки восприятия.
Зато от внедрения lifetimes польза была мне очевидна. Гор никто не обещал - они просто оказались
>Отделён, все норм.
ну там бедновато с примерами. мб мб. но если и так, то зачем тогда он если есть авалония (ну кроме проблемы с шрифтами конечно)
> Хз че там в ето.формс
Я месяц назад закатился итт с вопросом
> Посоветуйте кроссплатформенный ЮИ-фреймворк
Мне насоветовали много всякого. В том числе авалонию. Потом я спросил вроде простой вопрос.
> Как мне сделать кроссплатформенную иконку в трей?
И началось. Тут не надо, дам нарушает, здесь ты чо ахуел, и так далее. И только кун, форсяций здесь авалонию (мб это ты?) сказал, что в авалонии иконка в трее реализована через Eto.Forms. Ну я загуглил. и что я вижу?
Охуенный ЮИ-фреймворк, отвечающий всем моим задачам. И никто не посоветовал мне именно его. Ну, напрямую никто, косвенно авалония-кун.
Блять.
> И началось. Тут не надо, там нарушает, здесь ты чо ахуел, и так далее. И только кун, форсящий здесь авалонию (мб это ты?) сказал
Быстрофикс
насколько я помню тебе правильно ответили что делаешь какой нибудь сервис INotiticator который подключит правильный бэкенд рисования иконки под конкретной платформой. А то во всяких линуксах с их страшными гном3 и кучей других DE не напасешься встроенных средств работы с треем.
я хз чем так реализована иконка в трее в авалония, ведь даже в WPF я для этого ставлю нюгет пакет какого то васяна
Не а. Это в этом треде я закидывал удочку на запоминание аноном информации. Реально про иконку в прошлом треде было.
И как выяснилось, анон инфу не усвоил. Вместо того, чтобы посоветовать мне (повторно) Eto.Forms c реализованной кроссплатформенной иконкой, мне насоветовали изобретать велосипеды.
почему обижаю
у меня ведь тоже васян продакшен энтерпрайз
так что никакой пренебрежительной окраски в моих словах
>посоветовать мне (повторно) Eto.Forms c реализованной кроссплатформенной иконкой, мне насоветовали изобретать велосипеды.
целый фремворк ради одной иконки. обычно все наоборот
> целый фремворк ради одной иконки
Если бы я переходил с равного ему MVVM фреймворка - то да, долбоёбство. Я же по факту вкатываюсь в том числе и в шарп в принципе. Много лет кодил исключительно скрипты в батниках и (немножко) шеллах. До этого во времена дельфи кодил на нём.
Такшта сейчас при прочих равных именно нагугленный Eto даёт мне всё, что мне нужно. Авалония не понравилась статусом беты и подходом к ЮИ как ориентированному на темы. Ето наоборот даёт нативный лук и фил на выходе. Моя приложуха не будет навязывать юзеру свой фирменный стиль, а выдавать ему ту тему, которая установлена у него в системе. ReactiveUI можно подключить отдельно и всласть биндить виды к видомоделям. Как он собственно и к авалонии сбоку прикручен.
>>866478
> INPC + Fody, чтобы овчинка стоила оверхеда и новой ебли вприсядку
> Хотя конечно тут дело привычки восприятия.
Как я уже сказал, привычек как таковых ещё нет, начинаю с чистого листа, открыт к новому, итп, посему изучу и эти тайтлы. Всё, ушол.
>Eto даёт мне всё, что мне нужно.
как я вижу это такой кроссплатформенный WinForms. Не вижу чет я там никаких DataTemplate. Видать тебе такая гибкость и не нужна
>подходом к ЮИ как ориентированному на темы
хз о чем ты. просто когда ты сам описываешь визуальщину, то сложновато сделать "как там нативно в платформе выглядит". Это 2 противооположных стула, на которых пытается усидеть хамарин жертвуя гибкостью
Доебутся. Ух, сколько тут возможностей доебаться!
Почему классы сотрудников пустые? Перенеси туда всё, что ты делаешь в Мэйн. Рейты вынеси в текстовый конфиг, который ебани константой в отдельном структе (public struct TipaDB { public const string rates = "{'dev':3000, 'QA':2500, 'BA':3500}"; }) внутри неймспейса. В конструкторы дочерних классов передавай только имя. Позицию и рейт конструктор поставит сам. Причем рейт возьмёт из текстового конфига, который ты симулируешь константой. Когда спросят зачем это? Ответь, типа, если код будет работать в составе более крупного проекта, то там наверняка будет БД и этот структ - её симуляция. (Важно, именно симуляция, не эмуляция.)
И в общем, следуя этим нехитрым советам - тебе перезвонят.
Потом подключи NewtonSoft.JSON и им распарси строку с рейтами. Делов на пять минут, но ты до кучи ещё и продемонстрируешь, что разбираешься в пакетах и не изобретаешь велосипеды.
Большое спасибо, учту все моменты.
и почему все всегда верят что пользователь введет число
вдруг он напишет "пшелнах"
и твоя программа рухнет
https://kazan.hh.ru/vacancy/39860758
https://kazan.hh.ru/vacancy/39860773
Заранее спасибо
Тебе уже тогда сказали. Не помню правда что, но сейчас обсер виден прям в названии.
>middle программист
Какой нахуй программист в сочетании с middle? Выглядит как колхозник который где-то услышал новое слово и вставил его. Пиши Middle .Net Developer. Либо Middle разработчик.
Но вам не просто мидл нужен, вам нужен фуллстек. Не знаю, может для Казани норм, но для ДС/ДС-2 100к для фуллстека-мидла это смешные деньги. Для мидла минимум это 150к. Тоже самое и с сеньором.
В итоге нужно заменить название на:
Middle Fullstack .Net developer или Middle Fullstack .Net разработчик.
Требования тоже смешно составлены, они больше к джуну подходят, чем к мидлу. Поэтому у читающего будет создаваться впечатление что он мидлом идёт на зарплату джуна.
>- Понимание, как работает СУБД и зачем нужны индексы в базе;
Как человек может быть мидлом и не понимать принципов работы СУБД и для чего индексы нужны? При чём тут вообще индексы, блять, это что, какое-то сакральное знание? Видимо автор сам не понимает для чего они нужны и поэтому вставил в требования как что-то страшное по его мнению. Мидл должен понимать уровни изоляции транзакций и конкурентность при работе с БД, для того чтобы понять индексы достаточно прочесть пятиминутную статью.
Ну и да. Учитывая зарплату, никому нахуй ваш Фарт и блокчейн не нужен. Это своего рода зашквар на которой идут только за деньгами.
> Как человек может быть мидлом и не понимать принципов работы СУБД
У нам приходил человек с 15 годами опыта и не еле-еле скрипя составлял простейшие sql-запросы на выборку из бд. Говорил, что раньше все запросы писал на nhibernate
> мидлом идёт на зарплату джуна
может наоборот?
Во-первых, поля не нужны. Во-вторых, игнорируются они только по умолчанию.
Ну вот, у тебя еще и требования непоследовательные. Тебе принципы работы нужны или умение составлять sql-запросы? Типичный представитель компании ФАРТ. В требованиях одно, а на собеседовании тебя посадят составлять sql-запросы, при том что в требованиях невнятная хуйня про индексы и требование работы с ORM.
>то раньше все запросы писал на nhibernate
Ну так и есть, зачем мне блять составлять sql запросы, сука, если для того чтобы этого не делать и создавались ORM? Разбираться нужно не в составлении sql запросов, а в работе ORM фреймворка, его тонкостях, умение просматривать эти самые sql запросы которые составляются фреймворком и определить можно ли улучшить данный sql запрос.
Просили передать: ты понимаешь в программировании, но не понимаешь в работе программистом
>>866756
> умение составлять sql-запросы
> зачем мне блять составлять sql запросы
> Разбираться нужно не в составлении sql запросов
Как человек, работая с БД, может не знать SQL и не уметь составлять запросы? Что будет делать человек, если ему надо будет что-то (на 1000 строк) поправить внутри БД?
>почему не откликаются
>потому что вы у вас требования слишком низкие
Чёт пукнул с этого душнилы. Да, именно поэтому.
> Называет самые дорогие города с самой большой зарплатой по россии
> может для город-нейм норм, но для Москвабад-сити это смешные деньги
>Как человек, работая с БД, может не знать SQL и не уметь составлять запросы?
Для работы с бд есть ORM фреймворки, их предназначение это избавить программистов от необходимости вникать в SQL.
>Что будет делать человек, если ему надо будет что-то (на 1000 строк) поправить внутри БД?
Для этого не нужны какие-то глубокие познания и высокопроизводительные запросы.
И давно ты в других городах был или в ДС/ДС2? Программистам уже давно начали платить +- одинаково, исключением будут разве что всякие ООО Фарт и НИИ МухГу
Во-первых, с каких пор поля, блять, могу быть ридонли, во-вторых, нахуя мне твой ридонли, в-третьих, это не отвечает на мой вопрос
>сделай его readonly свойством
>с каких пор поля
Сожалею, но в твоём случае всё печально, потому что слабоумие не лечится.
>в-третьих, это не отвечает на мой вопрос
Извини, сычуш, писать код исходя из описания умственно отсталых долбоебов, для которых программирование это какая-то магия, пока еще никто не научился.
Ещё раз, НАХУЯ мне твой ридонли, что это изменит. И я не могу ему значения присваивать в конструкторе или при инициализации, мне set нужен
Тогда делай отдельный метод для установления и изменения этого значения.
>что это изменит
Снимет с твоей программы колдовские чары, которые подменяют значение на null в одном из методов.
Но там нигде ничего не подменяется, понимаешь? В set после установления больше ничего на протяжении всей программы не приходит. Я вот буквально беру ставлю точку остановы на set, запускаю программу, при запуске присваивается значение, в set данные пришли. Вызываю один метод и там есть значение, в set ничего не приходит, затем вызываю другой метод и там null, в set так же ничего не приходило. Как это возможно?
40x30, 0:12
Студентик, проснись, ты на лекции, и что-то коричневое стекает по твоим порткам
ОКВЭД 62 (Разработка программного обеспечения)
https://www.audit-it.ru/inform/zarplata/
https://www.audit-it.ru/inform/zarplata/index.php?id_region=184
https://www.audit-it.ru/inform/zarplata/index.php?id_region=123
Москва 142
Татарстан 67
Нижегородская 86
Свердловская область (Ект) 66
Омская область 51
Магаданская область 60
Так что в переводе на ваши, москальские деньги 100 тысяч = 215 тысяч, а 150 тысяч = 323 тысячи.
Обрати, кстати, внимание, что это зарплата в доковидные времени
> Для этого не нужны какие-то глубокие познания и высокопроизводительные запросы
Но всё-таки составить запрос нужно, да? На SQL, да?
> их предназначение это избавить программистов от необходимости вникать в SQL
Если у тебя такое глубокое понимание причины существования ORM, то пожалуйста сиди на фрилансе и пили свое говно за $10/час и никуда оттуда не уходи. Не хочу, чтобы такие как ты захламляли пространство собою
>Но всё-таки составить запрос нужно, да? На SQL, да?
Нет, не нужно, за программиста это делает ORM. Исключением будет либо говнокод, либо долбоеб не разбирающийся в ORM, либо долбоеб вроде тебя который любит пилить велосипеды и верить в то, что они лучше тех которые пилят непосредственные специалисты.
>их предназначение это избавить программистов от необходимости вникать в SQL.
вот только успешность этого - ну разве что на петпроектах
Задача: на впф'е есть один image, я хочу после обновления image.source показать эту картинку на 1 сек, а дальше обновить другой картинкой.
Я написал очевидный Thread.sleep, мало того, спустя после еще нескольких операций после апдейта источника, но ебучий имедж даже не вздумал его обновить и тред фризится со старой картинкой.
+я на .net 4.0 и всяких task.delay у меня нету.
Алсо, все это происходит на клик имедж ивенте, думаю пока сделать что-то с клик дауном.
>я на .net 4.0 и всяких task.delay у меня нету
какой то вкатывальщик некрофил
кто запрещает взять 4.7.2 хотя бы
Некромант, ты должен знать, что есть Task.Run, в нём и заменяй через критическую секцию
Я таких лагов вообще припомнить не могу, даже на старых студиях. Делай перестановку винды, лол.
Скорее всего у тебя в системе глюки и вместо поисках нужных флагов проще чистую установку сделать.
В студию ведь можно миллион плагинов напихать. И не обязательно для этого лишние установщики открывать. В дефолтной установке можно пару лишних флагов поставить, которые миллион зависимостей с собой притащат. А потом можно случайно что-то удалить и студия будет пытаться эти зависимости на каждый клик искать и крашится, не подавая виду. А пользователи (ты в данном случае её пользователь) любят говорить что я не я и лошадь не моя, хотя сами этот бардак и устроили.
Можешь Windows Events глянуть, там может краши есть. И ещё Reliability Monitor.
было такое. решарпер переставил и прошло.
Еще заметно было там решарпер в углу пишет память. Доходило до 500метров и начинало тупить как на видео.
С логикой всё впорядке, можно идти в айти.
когда этот дядюшка сможет WPF адекватно - тогда и приходи. и то осторожно
Доброе пожаловать в мир программирования. Здесь магия будет тебя преследовать первые лет 10. А потом, после фикса миллионов магических ситуаций, до тебя наконец-то доходит что магии вообще не существует и всегда есть причина, и причина очень конкретная.
Тебя пидораса надо окунуть в Иркутск/Сургут/Тюмень/Воркуту/один_из_тысяч_городов. Да даже Владивосток. Платить им блеадь одинаково начали. Ух гнида!
Соискателей как правило больше, чем предложений. Поэтому приходится переезжать или искать удалёнку или фрилансить.
Ты задаешься вопросом какой пет-проект написать.
И все они говно, либо перемудряют. Почему бы просто не сделать как httlListener/Client, чтобы взял и пользуйся: у одних - вообще нихуя нет, у других - собирай какие-то там правайдеры, фактории и прочую залупу. А мне просто нужно: Прописал адрес ресурса, указал IP-принтера и все чтобы работало.
поддержу анона. 10к либ чего либо на нугет еще не значит, что они написаны хорошо или удобны. Часто такое замудрят, что лицо потом болит
https://docs.sharpsnmp.com/tutorials/introduction.html
Тут вроде просто описано. Как ты и хочешь. Запихал айпи и вызвал.
я другой анон но спрошу то что я всегда спрашиваю в подобных вещах
где async?
мудрить костыли с Task.Run это костыли. Конечно может быть достаточно,но как спать по ночам
Я же не автор того проекта. Вообще его в первый раз вижу. Я отвечал на
>Прописал адрес ресурса, указал IP-принтера и все чтобы работало.
Вообще если АПИ синхронное без всяких .Result костылей, то оно должно нормально работать. Тем более что использующая его прога - это десктопная поделка, использующаяся одним юзером для периодических проверок принтера (судя по поставленной аноном задаче). Там вообще пофиг.
Но если прям невмоготу (хрен знает как это слово писать), то возьми да сделай пул реквест в этот проект.
>1с
>программист
>ведущий разработчик
>единственная адекватная на фоне других пыха и та с зарплатой на уровне ДС2
Что сказать то хотела, скотина тупорылая?
Во владе в целом уровень зп выше чем в тысячах других городов по стране, и даже там средняя зп даже во всяких ДНСах и Сименсах будет 40-60. На скрине выше видно что для того чтобы получать 100+ надо быть или тим лидом или идти в бухгалтерию, что вообще не программирование. 200 позиций, которые там имеются, на скрин не влезут.
По пыхе там от 60 и скорее всего столько платить и будут. Верхнюю планку указывают чтобы народ привлечь. А требовать будут соорудить межгалактический летательный аппарат.
Я смотрел как сами майкрософты в своих репках с "архитектурой" делают, так они там вообще никаких HasData не используют, в одном случае - хреначат хардкодом так же, но только делают отдельный здоровый класс Seed, в другом - из CSV читают. Оба варианта мне кажутся сомнительными. CSV - не позволяет нормально сущности связанные заполнять, а хардкод - те же проблемы что и у меня, просто они делают это в отдельном здоровом классе, а я в классе что имплементирует IEntityTypeConfiguration
создай xml и парсь в том же Seed'е
А это потому что используешь идиотский стиль в виде фу_бар_баз и игнорируя регистр енума
ну а не работает потому что енумы не умеют в new - они не классы, то есть никакого new reason быть не может
Сеньор, ты точно код правильно прочитал?
>>867452
Студент, иди учи что такое классы и объекты. Ты пытаешься использовать метод класса. А надо его вызывать у объекта.
Класс - описание сущности, оно нифига делать не умеет, пока из него сущность не создадут.
Объект - собственно то, с чем ты работаешь.
var user = new User();
user.ChangingDataAboutUser(hui);
>Сеньор, ты точно код правильно прочитал?
по сильной диагонали. с таким стилем оформления пусть мазохисты читают.
class Program
{
static void Main(string[] args)
{
Sum(10, 15); // параметры передаются по значению
Console.ReadKey();
}
static int Sum(int x, int y)
{
return x + y;
}
}
то есть x + y
а когда по ссылке, то пишем x += y
static void Main(string[] args)
{
int x = 10;
int y = 15;
Addition(ref x, y); // вызов метода
Console.WriteLine(x); // 25
Console.ReadLine();
}
// параметр x передается по ссылке
static void Addition(ref int x, int y)
{
x += y;
}
почему именно так? почему он не компилируется, если я сделаю, например, x + y
class Program
{
static void Main(string[] args)
{
Sum(10, 15); // параметры передаются по значению
Console.ReadKey();
}
static int Sum(int x, int y)
{
return x + y;
}
}
то есть x + y
а когда по ссылке, то пишем x += y
static void Main(string[] args)
{
int x = 10;
int y = 15;
Addition(ref x, y); // вызов метода
Console.WriteLine(x); // 25
Console.ReadLine();
}
// параметр x передается по ссылке
static void Addition(ref int x, int y)
{
x += y;
}
почему именно так? почему он не компилируется, если я сделаю, например, x + y
Потому что ррезультатом выражения должно быть присваивание либо передача в качестве параметра
Это вообще никак не связано.
x += y это краткая форма записи x = x + y, то есть ты присваиваешь переменной x сумму x + y. А в первом случае твоя функция возвращала (return) сумму x + y.
Чтобы не иметь такой каши в голове, лучше возьми какую-нибудь книгу по языку и читай от корки до корки.
Из шапки какой нибудь ресурс подойдет? Юзаю метанит, но там много каши в голове возникает, приходится спрашивать тупые вопросы
>>867529
Я даже не знаю, из тех книг по шарпу что я видел везде основы программирования поданы очень сжато и быстро переходят к деталям шарпа и .NET платформы, которые тебе сейчас не нужны. Мне было норм так как шарп был не первый язык что я учил (по книге Троелсена, последнее издание сейчас Pro C# 8 with .NET Core 3, но вряд ли она подойдёт для совсем новичка в программировании). Опять же если тебе нужны на русском языке ресурсы то надо смотреть какие книги переведены, но в программировании конечно английский обязателен и его придётся учить в любом случае. А вообще в программирование я вкатывался с C++, там много хороших книг покрывающие самые основы (переменные, функции, if, while, for, классы, и т.п.), поэтому передо мной такой проблемы с шарпом не стояло.
У тебя класс юзер - обыкновенный, а ты пытаешься обращаться к нему как к статичному.
Суть, тебе нужно сначала создать объект.
Ну, а чтобы было понятно я в студенческие годы как придумал. Смотри, объект - это как-бы некая изолированная сущность, он сам по себе, у него есть какое-то состояние и методы все методы что у него есть - это то что он проделывает с собой(по крайней мере так лучше об этом думать на старте). Например, если у тебя есть объект жопа и у нее есть метод "Срать", то вызвав его у обхекта ты как-бы говоришь: Вон та жопа - посрала, а другая жопа в этот момент - говно в себе держет и с ней ничего не произошло, и после этого у тебя могут в приложении быть две жопы: одна - посравшая, другая - несравшая.
Ну, а статические классы и методы это такие вот наджопы, которые тоже могут хранить состояние, тоже что-то делать, но они - одни на все приложение, если у тебя жопа - статична, то посрав - она посрет и больше не будет жопы, что не посрала.
Как-то так.
Ну, а с точки зрения синтаксиса, чтобы создать новую жопу(нестатичную), ты должен написать Ass myAss = new Ass();
Чтобы вызвать у нее метод - myAss.MakeShit(); А если хочешь обратиться к статичной жопе - Ass.Shit, но тогда метод тоже должен быть статичным.
Как-то так.
Вот что удобнее: Класс Document, у которого просто есть метод Print(IPrinter), в котором можно внутри файла с классом все что нужно сделать, либо ебаться с классом DocumentPrinter, который мало того что не имеет доступа к private полям класса документа(а иногда нужно), так еще и будет в другом файле находиться и ты не можешь тупо клацнуть this. и посмотреть что вообще в классе есть, чтобы понять что там и как печатать.
Скажите, в чем я не прав и почему все равно так много людей хотят делать анемичную модель для приложения, плодя всякие Helper, Utils, *Service, вместо того чтобы нормально все в модели прописать, если модель будет меняться - мы будем менять это в одном месте, сразу править то что нужно, а не бегать по всему проекту в котором из-за анемичности будет 100500 классов чтобы все работало. Мне вот последнее время кажется, что это какой-то способ наебать работадателя, типа делаем анимичную модель, потом маленькое изменение в логике работы - неделя времени.
Ты и файлы наверно все в одной папке хранишь. Если что-то нужно, то не нужно бегать по каталогам, всё в одном месте!
1. Найти произведение целых нечётных числел, кратных 7 и от -80 до 80.
2. Дано число n от 1 до 1000 и число m. Вывести результат квадрат разности числа n и m.
3. (Фото)
В том-то и дело, что я к этой мысли пришел после 3 лет работы.
Ну серьезно. Вот как ты поймешь нормально для чего тебе нужен класс User, если в нем одни свойства, а вся логика работы вообще в отдельной сборке лежит и ты тупо не знаешь, можно ли тут что-то трогать, чтобы все к хуям не сломалось нахуй. Как по мне, хорошо спроектированный класс - тот класс, при взгляде на список полей, свойств, и методов у тебя тупо не остается вопросов что это и нахуя оно надо вообще и как оно работает. А тут - это DTO'шка? Может быть это объект для БД, может быть еще что-то? Узнаешь когда пройдешься по всем ссылкам которые используют этот класс, а иначе - соси бибу или играй в Вангу.
это ты пришел работая с анемик. А все познается в сравнении.
а когда сходишь в DDD то количества мороки с организацией "че как" быстро превысит профит от этого и вернет на грешную землю с лозунгом "уж лучше гет сет публичные чем эта ебля"
Это задачи не по C#, а по математике, пиздуй нахуй отсюда, студент.
это как с исключениями
- как вы с ними работаете. хер поймешь какое исключение может вылететь из глубин, непонятно что ловить
- не вопрос. попробуй альтернативу с кодами возврата
....через время....
- да ну нахуй. я люблю исключения
Ну так 3 года говнокодил, вот и пришел. Писать хороший, структурированный код это такой же навык как и другие, он не приходит сам собой, его нужно оттачивать. А на работе ты этому не научишься, потому что на работе полно таких же долбоебов которым "похуй, лишь бы работало" и менеджмент которому "хуяк-хуяк и в продакшн".
>тот класс, при взгляде на список полей, свойств, и методов у тебя тупо не остается вопросов что это и нахуя оно надо вообще и как оно работает.
Ты запутаешься в этой простыне уже на 100+ строке. Когда у тебя разбито всё по классам, то тебе легче запомнить и представить структуру в целом.
>Узнаешь когда пройдешься по всем ссылкам которые используют этот класс
Вот именно - узнаешь. А если лепить простыню, то ты никогда не узнаешь и будешь тыкать наугад.
Ага и еще свитч с паттер матчингом в ChangeData() бы всунул. Зачем новичка expression-bodied пропертями смущаешь, у него и так каша в голове.
class A { ICollection<A1> SomeProp {get;set;}}
class B { IEnumerable<B1> SomeProp {get;set;}}
Можно ли настроить маппинг A->B так, чтобы при маппинге A.SomeProp->b.SomeProp b.SomeProp по факту было массивом, а не листом (не меняя тип B.SomeProp)?
Все вышло.
Рекорды, внезапно, охуенная тема. ДТОшки пишутся в 1 строку, охуенно просто. Теперь, к.м.к. незазорно их прямо в контроллере делать, типа пусть лежат прямо где используются.
Ну а так, в остальном всякая мелочевка.
Да, говнорайдер не может в .net5 пока, ну, как обычно.
Чё-т вы в середине треда про перекат попиздели, а ПЕРЕКАТА ТАК И НЕТ.
Если ты такую хуйню не можешь решить, то нахуй ваще поступил на программиста?
Не стоит стесняться. Ты же не жавист
Потому что ты ничего не меняешь. По принципу работы твой код эквивалентен чему-то типа такого
foreach(double element in array)
...Handle(element);
int Handle(double value)
{
...return value + 0.5;
}
блэт, дабл вместо инта, но сути не меняет
и снова мне придется перекатывать ныть о том, чтобы перекатили
Для неполноценных коммитов есть squash. Эта команда может собрать временные и поломанные коммиты в один нормальный.
В мастере каждый коммит в идеале должен содержать код, который можно сбилдить и прогнать тесты без ошибок.
foreach обычный тоже ничего не возвращает
да даже если и ссылочный, то ничего не заменится. ссылки тоже копируются
Window.xaml:
<Image Source="{Binding Path=ImageQuestion, UpdateSourceTrigger=PropertyChanged}"/>
Window.xaml.cs:
private ImageSource _imageQuestion;
public ImageSource ImageQuestion
{
get=>_imageQuestion;
set
{
_imageQuestion = value
OnPropertyChanged("ImageQuestion");
}
public void OnPropertyChanged(string prop)
{
PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(prop));
}
public Window()
{
DataContext = this;
}
Обновляю свойство, в метод чеджед тригерит. В выводе приложения ошибок с биндингом никаких нету.
`public MyClass GetMyClass(string name) { }`
`
public MyClass GetMyClass(string name) {
var myClass = new MyClass();
return myClass;
}
`
```public MyClass GetMyClass(string name) { }```
> Wpf
Здравствуй, Игорь! Это твой начальник. Помнишь меня? Я попросил тебя портировать наши корпоративные утилиты на линукс, для импортозамещения так сказать. Ты обещал перезвонить, как портируешь. Мы всем отделом уже полгода ждём твоего звонка.
здравствуй начальник. оказалось что никому на линусе мои утилиты не нужны, потому что доля линукса в десктопах да где применима моя утилита - ничтожны. Более того, линуксоиды не любят платить за софт.
Двачую WF господина!
Привет всем. Как быть?
была задача на десериализацию ~3000 страниц.
Сразу сделал через parallel.foreach. Пошло не очень, без async не то, ушло 3:10 минут на все.
Переписал на многотопочность через разбиение n количества страниц на 1 поток и внутри ещё async. Намного лучше ушло 1.30-1.40 на все.
потом через дебри узнал про tpl dataflow. Объединяющий удобства параллелизма, многопоточности и еще ассинхронно. Ушло 1:10-1:1:15 на десериализацию.
пока искал решение ушло больше времени чем на написание, чувствую себя архиологом. Если способы быстрого поиска нужного и актуального инструмента? А то вся информация про tpl dataflow за 2012-2017 год.
и так с каждым инструментом решающий сложную задачу. Нахожу первый попавшийся инструмент, потом ещё больше поисков через дебри ещё лучше инструмент, но все инструкции по нему дремучие ужас. А потом сижу и думаю может есть что-то более современее и лучше?
Сижу гуглю уже ебаный час и НИХУЯ, как будто никто и не знает про эту функцию. Может тут кто-то знает?
Вы видите копию треда, сохраненную 18 апреля 2021 года.
Скачать тред: только с превью, с превью и прикрепленными файлами.
Второй вариант может долго скачиваться. Файлы будут только в живых или недавно утонувших тредах. Подробнее
Если вам полезен архив М.Двача, пожертвуйте на оплату сервера.