Это копия, сохраненная 2 апреля 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
Прошлый тред тонет здесь: >>1724425 (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
>var x = new Main();
>x.GetInformation():
The type or namespace name Main could not be found (are you missing a using directive or an assemble reference?)
>Ты, кстати, хули с маленькой буквы названия метода написал?
Main у меня главный метод, а остальные просто методы.
>>1796765 →
>Добавь модификатор static методу GetInformation
Появилась изначальная ошибка An object reference is required for the nonstatic field, method, or property
>добавил статик
>... for non-static method
Хуево ты добавил значит. Просто говнокод свой в тред скинь и тебе покажут.
>добавил статик
>... for non-static method
Хуево ты добавил значит. Просто говнокод свой в тред скинь и тебе покажут.
кодстайл сишарпа подразумевает именование методоа с большой буквы.
>>797090
using System;
namespace testProject
{
class Program
{
static void Main(string[] args)
{
Console.WriteLine("hello");
var fin = @"C:\text.txt";
Title title = Title.Load(fin);
// var x = new Main();
// x.getInformation(title);
getInformation(title);
}
private static void getInformation(obj title)
{
var titles = thuExtr.Finder(title); // ошибка на thuExtr: An object reference is required for the non-static...
}
private TFinder thuExtr;
}
}
вот так попробуй, а лучше создай отдельный класс, чтобы самому себе голову не ебать
Добра и сотни нефти!
фикс. не Program.GetInformation(). а x.GetInformation()
>var titles = thuExtr.Finder(title); // ошибка на thuExtr: An object reference is required for the non-static...
Т. е. из прошлого опыта ты не смог понять в чём ошибка? Зачем вообще код берешься писать, ты же проф не пригоден.
Я и на шарпе и на жопаскрипте пишу. Проблема твоих галерщиков теперь в том, что обратно на дотнет они не пересядут, чего не скажешь о тех кто пишет на шарпе.
Не представляю каким нужно быть говноедом чтоб добровольно с него перейти на js.
На самом деле они плакали внутри, но продолжали улыбаться, потому что больше их нигде не брали.
Будет почитать
https://github.com/dotnet/maui
Xamarin превращают в MAUI, но он станет доступен только в .NET 6
https://www.dropbox.com/s/k9nncr0abswujed/SimpleGame.zip?dl=0
Что такое SFML? Гугл выдаёт что угодно, кроме того что нужно.
Выкидывай на гитхаю/гилтаб/битбакет. Нафиг зип качать, вдруг там вирусяка.
> Что такое SFML?
https://www.sfml-dev.org/
> Нафиг зип качать, вдруг там вирусяка
Качать необязательно, на дропбоксе есть возможность посмотреть содержимое, а исходники будут с подсветкой синтаксиса.
Фигасе дропбокс прокачался.
Общение происходит по защищённому каналу. TLS ? Посылают друг другу XML-ки.
Какие есть библиотеки/фреймворки чтобы это как можно быстрее нашлёпать особо не вникая в то как это работает?
Да блин. Сокеты это слишком низкоуровнего.
Мне бы что-то такое типа
server = new Server(TLS, portnumber, certificate,
client_connected_callback, client_message_callback);
server.Serve();
client = new Client(TLS, portnumber, certificate, server_connected_callback, server_message_callback);
client.ConnectToServer(serverAddress);
Ну нету у меня много времени чтобы думать над архитектурой и писать всё с уровня сокетов.
Хочу готовую архитектуру клиент/сервера, которую делали люди с мозгом и знаниями, а не на коленке как я.
Нуууу, я как-то писал как раз подобное, но в треде все закидали тапками и сказали чтобы не выебывался .net для веба и вообще если кому приспичет он сам на сокетах напишет.
Могу только это посоветовать, https://github.com/chronoxor/NetCoreServer, там чутка напильником допилить. Можно еще https://github.com/jchristn/WatsonTcp посмотреть, но мне он не подошел.
Если все правильно понял, я бы по такой задаче колотил gRPC. Там и описание транзакций легко сделать, и пользоваться клиентом удобно, и шифрования всякие хорошо поддерживает.
Это все хорошо, когда ты делаешь поверх Http, блин, я не знаю что у чела за задача, но вот мне нужно было так же реализовывать сервер для работы с устройствами, которые по проприетарному протоколу обмениваются информацией, и знаешь что, на джаве для этого есть нормальные готовые решения, а вот на офигенном шарпе - нет. пришлось свой велосипед городить. А я - тот еще архитектор, кек.
Странно. У меня все показывает.
>а вот на офигенном шарпе - нет. пришлось свой велосипед городить
значит никому не нужно было
вот тебе нужно ты сделал
выкладывай в общий доступ
По работе пришлось столкнуться с .NET веб проектом на C#.
Помоги разобраться что это, чем его адекватно открыть и как редактировать?
Отдельно интересуют .dll библиотеки, как их править?
Структура проекта на пике.
> Помоги разобраться что это, чем его адекватно открыть и как редактировать?
Кликни на файлик, откроется окно редактора, еще можешь на треугольничие рядом с файликом кликнуть и увидишь там .cs файлы, в которых шарповский код. Судя по структуре, в данном проекте основные файлы лежат в корне, остальное эт ресурсы и какие-то переиспользуемые штуки.
Да, раз это новый проект, советовал бы поставить хреновину для рисования диаграммы классов и посмотреть какие классы от каких зависят, какие там методы и если что непонятно - посмотреть код.
> Отдельно интересуют .dll библиотеки, как их править?
Взять код этой библиотеки и править его, потом собрать и подсунуть сюда новую dll, ну или лезь в il и там правь, кек.
>можешь на треугольничие рядом с файликом кликнуть и увидишь там .cs файлы
Беда в том что при "открытии папки" в VisualStudio никаких треугольников нет. Впрочем, как и .cs файлов в каталогах проекта.
>основные файлы лежат в корне, остальное эт ресурсы и какие-то переиспользуемые штуки
Похоже что на каждую страничку ресурса есть свой .ascx файл, которые лежат в QA.
>Взять код этой библиотеки и править его, потом собрать и подсунуть сюда новую dll
Декомпилировать, поправить, заново собрать и подсунуть?
Оно всегда так работает, или есть какой-то "правильный" путь редактирования dll-лок? )
>ну или лезь в il и там правь
Что такое il?
В интернетах искал разные варианты создания .NET проектов, веб сайт/веб приложение / итд, и ни один из вариантов не похож на то что есть у меня.
> inetput\wwwroot\Navigator
> Navigator.dll
Это собранный и опубликованный проект. Требуй исходники. Будут тебе и *.cs, и треугольники.
По первой ссылке в гугле. Подойдет?
https://metanit.com/sharp/entityframeworkcore/7.1.php
Но я бы все таки разобрался что не так с SQL Server - работать должно.
>но чтобы БД была postgresql?
А какая разница? как бы задача всяких там ентитифреймворков и состоит в том, чтобы абстрагироваться от реальной бд.
Двачую анона выше, что именно ты хочешь? Степ бай степ пока от монитора не ослеп – так смысл, если еф инкапсулирует от тебя внутренности базы. Конечно, не идеально, и с постгре я имею ебанутые имена для сущностей не уверен, что причина в постгре, так как с ним я использую скаффолд, а с mssql code first, но все же
Просто подними базу, запили коннекшн стринг и дальше работаешь как гречневый программист
по SOLID и других подходах кучу вопросов было практических, т.е. таких, на которые без опыта коммерческой разработки не ответишь толком. Подкапотные детали мультитрединга и linq спрашивали, и по разных парадигмах программирования вопросы были, но более общие. Была практическая часть, надо было алгоритм сортировки сначала написать оптимальный а потом еще и актуализировать под требование определенное.
Ну на все остальные вопросы которые задавали я вроде норм отвечал, но на конкретно те, которые тут перечислил, в лучшем случаем 2/3 ответил + практическое почти что скипнул, просто в конце теоретически свой подход и идею объяснил.
И это на трейни позицию, которая, как оказалось, с шарпом почти не связана, на проекте занимаются какими то приставками под смарт тв, язык там похож на питон, и вообще предлагали чето около 350 в месяц. Впечатления не очень
Не прошу. Достаточно было бы либо коротко объяснить, либо дать ссылки где есть примеры с подобием архитектуры, потому что все что я находил это либо прямо в мейне херачат, либо это видео где чел просто набирает текст ускоренно, а потом говорит что получилось, даже не поясняя зачем он что-то делал.
Единственный вариант - закидывать своё резюме везде куда можно. Сотню в месяц. Только резюме надо вылизать. Не более двух страниц и без вырвиглазного форматирования и всё главное должно быть в самом начале. Причём кидать и в другие города на удалёнку.
Попутно решать задачки на leetcode и проходить туториалы от майкрософта.
За 350 в месяц это даже мало спрашивали.
>по SOLID и других подходах кучу вопросов было практических, т.е. таких, на которые без опыта коммерческой разработки не ответишь толком.
Вполне ответишь, главное придумать подходящий пет-проект и начать его реализацию с применением этих принципов и паттернов проектирования. Я сначала книгу по паттернам прочитал, потом начал делать такой проект. Вообще это намного сложнее чем выучить базовые конструкции и внутреннее устройство языка, над продумыванием архитектуры я сидел несколько недель, написав за это время пару десятков строк кода, а таких строк нужно было несколько тысяч. В итоге я почему-то нарушил самое главное правило - head first. Начал реализацию с конкретизированных классов, а не общих, но когда дошел до общих, то понял насколько было бы легко если бы я с них начал.
Сейчас понимаю, что для полного понимания нужно как минимум 2-3 таких проекта.
>За 350 в месяц это даже мало спрашивали.
мде. а еще говорят айтишники хорошо живут. много лет назад на рубиста брали за 800 джуна от которого даже не требовалось знать руби ибо сами обучали и зарплата росла.
а тут 350
'
Можешь использовать какой-нить дизассемблер:
https://github.com/icsharpcode/ILSpy
https://www.jetbrains.com/decompiler/
Берёшь dll, прогоняешь через тулзяку и получаешь проект с C# файлами. Системные дизассемблировать не надо. Судя по скрину тебе нужны только ChartCreator, DatabaseMgr, Navigator, Utility.
Потом надо будет все эти проекты собрать в один Solution.
У тебя там даже .pdb файлы есть. Можно дебажить и декомпилировать те функции на ходу.
> А в таком виде я с этим хоть как-нибудь работать смогу?
https://www.red-gate.com/products/dotnet-development/reflector/
Рефлектор, декомпилирование *.dll, лазанье в IL, муторное и нудное воссоздание проекта. Новичками не под силу.
Можешь стили да картинки подменить.
Логика скорее всего в Navigator.dll, DatabaseMgr.dll, ChartCreator.dll, Utility.dll. Остальные dll -- сторонние подключаемые библиотеки.
Red Gate платный. Два выше - бесплатные. И лазить в IL вообще не нужно. Декомпилятор может целый проект за тебя воссоздать (код может быть УГ, но читаем).
Время идет. Число желающих растет с неизмеримой скоростью (конечно же благодаря курсам по программированию и байками, что вкатиться очень легко).
А это нихера не легко. Начинаешь читать требования к позиции джуна (вакансии по треййни очень редки). Так что бы во всем этом разобраться, уходит как минимум год.
в ВУЗе преподавали C#. И практически все предметы связанные с программированием, преподавались с его использованием.
ИМХО, по синтаксису C# приятней того же Python и JavaScript. Хотя, TypeScript мне понравился.
и это ведь даже не прикол, мидловский стек за зарплату джуна постоянно натыкаюсь
На шарпе можно под мобилки писать.
Шарп самый универсальный в плане легкости и качества. Да, ты можешь на плюсах писать под любую платформу, но это сложно. Да, ты можешь на жопаскрипте писать под любую платформу, но это не качественно.
У тебя какое-то разделение неясное. Винформы есть как на неткоре, так и на нетфреймворке.
будто на шарпах легко
хочешь под линь - WPF идет лесом. Привет авалония XAML
хочешь мобилки - да еб...й xamarin XAML
будущий мауи тоже будет xamarin XAML
И? Если какой-то дегрод не осилил XAML, то это не значит, что XAML хуевый. И WPF это тоже XAML, если ты не знал.
>это не значит, что XAML хуевый
О чем ты вообще товарищ?
Я говорю что это РАЗНЫЙ xaml
при этом xamarin xaml говно по сравнению с UWF и тем более WPF xaml
и для "будет 1 хамл для всех" выбран самый уебищный из них
Что за бред ты несёшь? Какой смысл делать РАЗНЫЙ xaml если есть уже наработки из wpf, понятно, что есть отличия, но называть это совершенно разными xaml'aми слишком громко. Любой кто писал на WPF, сможет с легкостью писать на xamarin.
>Какой смысл делать РАЗНЫЙ xaml
это вопрос к мелкософту
>понятно, что есть отличия, но называть это совершенно разными xaml'aми слишком громко.Любой кто писал на WPF, сможет с легкостью писать на xamarin.
вот тебе вопрос на засыпку "А портировать WPF на мауи так же с легкостью сможет? "
зы: А сейчас нет никакого мауи (и долго не будет) и если желание на линукс запустить то где кушать эту универсальность? авалония? опять же попробуйте портировать ))
Вот мне уже тоже интересно, а то мне тут в треде доказывают что на позицию трейни в SOLID надо ахуенно разбираться, и в concurrency и вообще уже быть готовым опытным
специалистом.
зыс
Палю годноту https://kontur.ru/education/programs/intern/backend
Реальный вариант джуну любого возраста получить работу.
Так-то оно так, но кому нужен будет ученик? Работника же ищут, полагаю что-то базовое знать нужно
Я когда интернов собеседовал давал всякие задачки на графы решать. Но по тонкостям языка особо не гонял, интерны обычно языки плохо знают.
> предлагали чето около 350 в месяц
> Впечатления не очень
Да говно какое-то, я 350 в секунду получаю на фрилансе.
он имеет ввиду 350 баксов, джунам щас не платят нихуя, а если он хохол то это ему доплачивать предлагали
Ну, это. Были плюсы и си в вузе, я паралельно пробовал джаву, а на втором курсе препод показал Шарп и я просто пиздец влюбился. Настолько охуенная стандартная библиотек, тут тебе и с сетью удобно работать, и асинхронность, и многопоточность удобные, и можно писать было графические приложения как человек, а не всеми этими вызовами винапи, в общем, у меня шишка встала, я охуел как это классно. И сахарок, куча хуйни можно сделать очень коротко и лаконично. А потом я еще начал познавать ООП, сначала плевался, но потом, пиздец охуел как оно удобно, если научиться готовить. Сейчас переодически приходится писать еще на плюсах, и я каждый раз ловлю себя на мысли, что да, я и на нем мог бы, но на шарпе я сделаю это быстрее, красивее и еще мне не нужно искать какую-то приблуду, все почти есть из коробки, а то чего нет - давно стандарт индустриальный и ты это быстро найдешь.
В противовес фронтенд, там тоже типа писать можно сейчас наплохо, но там каждый нагородил своих велосипедов, которые ты костылями между собой объединяешь и получается кряхтящий-пердящий франкинштейн. Выбрали бы что-то одно и использовали, например решили, все у нас будет Ангулар для интерпрайза и ECMA какая-нибудь одна + jquery для мелких проектов. Нет, блядь, у нас будет 100500 фреймворков, которые делают одно и то же, у нас будет 100500 стандартво, зависящих от хуй пойми чего, а сверху ебанае бабелем, чтобы хуй кто въехал, в то что мы там понаписали. Короче, как по мне - эта анархия нахуй не нужна. Когда стандартизуют нормально, тогда можно будет думать о фронтенде, но сейчас, это какой-то цирк с конями, а судя по коду фронтендеров, даже люди с опытом, там просто копипастят код со стэковерфлоу, потому что блядь, вот ушел на карантин фронтендер из комманды, где я тусую, ну, подумал, доделаю его таски, все равно делать нехуй, открываю, сначала нихуя не понимаю, потом чуть разобрался, гуглю и вижу что его же код это первая строчку в гугле. Блядь, решил пробежаться, а там на 90% код состоит из ответов со стэковерфлоу, пиздец же. И это человек с 8 летнем стажем работы. Просто ctrl+c ctrl+v. И я даже не в упрек ему, типа вот настолько охуенно программировать фронтенд, когда человек который этим почти 10 лет занимается большую часть кода просто копипастит, меняя переменные.
Ну, это. Были плюсы и си в вузе, я паралельно пробовал джаву, а на втором курсе препод показал Шарп и я просто пиздец влюбился. Настолько охуенная стандартная библиотек, тут тебе и с сетью удобно работать, и асинхронность, и многопоточность удобные, и можно писать было графические приложения как человек, а не всеми этими вызовами винапи, в общем, у меня шишка встала, я охуел как это классно. И сахарок, куча хуйни можно сделать очень коротко и лаконично. А потом я еще начал познавать ООП, сначала плевался, но потом, пиздец охуел как оно удобно, если научиться готовить. Сейчас переодически приходится писать еще на плюсах, и я каждый раз ловлю себя на мысли, что да, я и на нем мог бы, но на шарпе я сделаю это быстрее, красивее и еще мне не нужно искать какую-то приблуду, все почти есть из коробки, а то чего нет - давно стандарт индустриальный и ты это быстро найдешь.
В противовес фронтенд, там тоже типа писать можно сейчас наплохо, но там каждый нагородил своих велосипедов, которые ты костылями между собой объединяешь и получается кряхтящий-пердящий франкинштейн. Выбрали бы что-то одно и использовали, например решили, все у нас будет Ангулар для интерпрайза и ECMA какая-нибудь одна + jquery для мелких проектов. Нет, блядь, у нас будет 100500 фреймворков, которые делают одно и то же, у нас будет 100500 стандартво, зависящих от хуй пойми чего, а сверху ебанае бабелем, чтобы хуй кто въехал, в то что мы там понаписали. Короче, как по мне - эта анархия нахуй не нужна. Когда стандартизуют нормально, тогда можно будет думать о фронтенде, но сейчас, это какой-то цирк с конями, а судя по коду фронтендеров, даже люди с опытом, там просто копипастят код со стэковерфлоу, потому что блядь, вот ушел на карантин фронтендер из комманды, где я тусую, ну, подумал, доделаю его таски, все равно делать нехуй, открываю, сначала нихуя не понимаю, потом чуть разобрался, гуглю и вижу что его же код это первая строчку в гугле. Блядь, решил пробежаться, а там на 90% код состоит из ответов со стэковерфлоу, пиздец же. И это человек с 8 летнем стажем работы. Просто ctrl+c ctrl+v. И я даже не в упрек ему, типа вот настолько охуенно программировать фронтенд, когда человек который этим почти 10 лет занимается большую часть кода просто копипастит, меняя переменные.
некоторого промежутка времени в часах и минутах (в пределах одних суток). Найти
продолжительность этого промежутка в тех же единицах измерения.
Берешь и прописываешь в файлике солюшна все версии фреймворка, какие нужно поддерживать и пишешь с использованием директив препроцессора в местах где код отличаться должен будет. Все. Что сложного-то?
Где заданы, куда заданы, в чём заданы, блять. Харкни в ебало тому кто тебе эту задачу дал и пошли его нахуй.
var start = TimeSpan.FromHours(2) + TimeSpan.FromMinutes(10);
var end = TimeSpan.FromHours(5) + TimeSpan.FromMinutes(26);
var duration = end - start;
Есть вариант написать библиотеку таргетируя .net standart - по идее должен работать с проектом и на фреймворке, и на коре.
Таблица совместимости тут:
https://docs.microsoft.com/en-us/dotnet/standard/net-standard
Но лучшим решением было бы перенести формы на кор или .net 5, если это возможно.
Блин, хотел выпендрется, но подумал, лучше нормально сделаю.
В общем, вот. Статический метод GetInterval вернет тебе как раз разницу, а у нее уже можно хоть часы, хоть минуты смотреть.
Да хосподи, что мешает вам делать вот так вот? 99.9% кода, если это действительно какой-то общий код, будет совместимо, тем более если не выеживаться и не использовать повсеместно сахарок. В 2,5 местах на весь проект пропишет проверку на версию фреймворка и пойдет дальше.
>GetInterval с тернаркой для подсчёта разницы
Говнокод. Используй Math.Abs, если тебе нужно всегда положительное число.
а хули ты хотел? Галера на тебе деньгу должна зарабатывать, а ты батрачить должен, как раб. Тебе задачки-задрочки, а барину мертвый американский президент. Все по чесноку.
>>799650
>чето около 350 в месяц
в шепутиарий. Тупо с подачки РАБотать. Порадовал перед сном
>>801075
>джунам щас не платят нихуя
смотря о каком языке речь. Даже ссаный пыхер джун в фул стэке 800 минимум зарабатывает
ссаный сеньор пыхер так и застрянет на 1-2к, а шарпист может и 4+ делать.
джуну надо не выёбываться, а брать что угодно, впахивать пару лет и потому начинать выбирать нормальную работу.
Тут, тебя покроют хуями, назовут ретардом, но помогут.
https://github.com/jellyfin/jellyfin/issues/2959
Недавно начал учить гитхаб, на этот issue стоит good first issue, но чет совсем не понимаю что конкретно делать.
>Remove the logic to auto-launch the web browser from the server (StartupWizard.cs BrowserLauncher.cs, etc)
Посмотрел на код там, непонятно где логика чтобы браузер запускался именно с сервера, или они хотят чтобы вообще нахуй удалили это?
Думаю, я еще далеко не джуниор, может быть даже не trainee.
> пыхер так и застрянет на 1-2к
>а шарпист может
Маня, проснись, ты дрыщешь. Никому нахуй сейчас этот шарп не нужен. Исключение - мамонты, которые случайно вступили в это чудо.
>>801343
хммм, выбор между 3 либами, которые дрочат сотни тысяч людей и высер мелкософтов с аудиторией 10 аутистов-разработчиков... Что же выбрать...
так про любую технологию можно сказать, когда она только вышла.
>Никому нахуй сейчас этот шарп не нужен.
судишь по говноконторкам из рф. ну да да. такой то обхват )))
Быстрый поиск по репо выдал вот это внутри jellyfin/Emby.Server.Implementations/EntryPoints/StartupWizard.cs
Там ещё много чего, что они просят. Один из пунктов обновить вот этот файл (возможно там ещё такие файлы есть), чтобы при запуске дебага браузер авто открывался - jellyfin/Jellyfin.Server/Properties/launchSettings.json
Почему ты решил обратить внимание на этот ишью?
Next желательно чтобы был read-only.
CancellationToken надо в следующий вызов передавать.
А в остальном - обычный LinkedList. Код как код, лишь бы с гайдлайнами по стилям внутри компании совпадал и не делал чего-то неествественного в существующей архитектуре приложения.
Если это библиотека, то надо к асихнронному вызову в конце добавить ConfigureAwait(false), потому что библиотека откуда угодно вызываться может.
Ну, про CanellationToken я просто тупанул. Да, понимаю что надо передавать дальше.
А если я это делаю чтобы разгрузить класс который разросся? Просто неудобно стало в файле на ориентироваться, приходилось по полминуты скроллить чтобы до нужного куска добраться, либо поиском пользоваться, ну я и думал о двух стульях - сделать partial или вот так вот. И теперь вот думаю, а не зря ли сделал так. Хрен знает короче.
Ну и как тогда?
Мне нужно сконфигурировать большую задачу, внутри нее подзадачи, которые как раз конфигурируются и в этих подзадачах могут быть await'ы, порядок их выполнения не важен, эти подзадачи не связанны друг с другом, так же после того как задача сконфигурирована, я должен дождаться ее выполнения внутри какого-то метода, потом, если нужно - извлечь нужную мне информацию, которая была получена в ходе выполнения. Задачи могут меняться от настроек сверху, но не во время выполнения задачи, какие-то могут быть отключены, какие-то новые - добавлены пользователем. Вот и как это сделать правильно?
Не слушай этого проигравшего, который в линкдлисте какой-то лукап углядел. Тут всё зависит от задачи и конкретной архитектуры системы. Где-то это вполне нормальный подход, а где-то у виска пальцем покрутят.
Если рассматривать только код с твоего пика, то там ничего вырвиглазного нет.
Вообще для прогона разнородных задач можно использовать Hangfire - http://https://www.hangfire.io.
Ты, вроде, как монаду вычислений пытаешься переизобрести.
И зачем тогда тебе ждать выполнения задачи перед запуском другой? Сделай статичный контейнер для задач, при вызове экзекутАсунк задачи запускаются и добавляются в контейнер, при добавлении последней задачи пишешь await Task.WhenAll(taskContainer);
листы List<Task> и Task.WhenAll и всего делов
Очевидно, что нужно учить более новое, так как если тебя посадят на новый проект, то сроки будут гореть и времени переучиваться с старого на новое у тебя не будет, а если тебя посадят на легаси парашу, то у тебя будет уйма времени и простор для эксперементов, потому что единственный плюс легаси говна это то что оно есть и работает. Внёс нужное изменение, а потом вникаешь в старое легаси и рефакторишь потихоньку.
Если писал на плюсах профессионально, то прочитай про то как сборка мусора работает, как работают таски с асинк-эвейтами, ну и наверное чутка про события будет полезно, хотя их сейчас стараются не использовать, ну и про те моменты что отличаются, типа как наследование тут работает, что ссылки, что значение это вот.
А, ну и про LINQ, оно довольно просто, опять же если на плюсах что-то серьезное писал, то разберешься быстро, но помогает сильно упростить жизнь.
Да, последнее, про кодстайл не забуть. За кодстайл на самом деле больше всего вломить могут.
Есть задача - программно прочитать файл из директории, которая синхронизирована с дропбоксом. Файл локально на устройстве есть, виндой открывается без проблема. Но когда пытаюсь что-либо с ним сделать - сосу бибу, файла словно не существует. Даже copy в консоли выдаёт ошибку. Че делать? Хули оно выёбывается?
Если тредом ошибся, пните в нужную сторону.
телепаты говорят что хоть они и телепаты но без знания ЧО ЗА ОШИБКА БЛ... ничего сказать не могут
В 2016-2017 в рамках стажировки чё-то да учил, прочитал "C# для школьников" да "Библию C#" (до "С# Программирование на языке высокого уровня" Павловской так и не дошёл, написал пару простейших приложений, но на тот момент склонялся к вебу и вёрстке больше - сейчас с ужасом понимаю свою ошибку.
Какой мой план действий? Перечитываю вышеперечисленное, а так же в оп-посте, заполняю гитхаб старыми и новыми проектами, курю алгоритмы?
Файл не найден.
Советую тебе осознать, что не существует работы за еду в бэке, да и во фронте она редко случается. Никто не будет нанимать человека который будет отнимать время у опытных сотрудников, приносить 0 пользы и при этом еще денег на еду просить.
В остальном всё от тебя зависит, читай книги, осваивай алгоритмы, озеленяй гитхаб и может удастся втиснуться на вакансию джуна.
дропбокс, onedrive, и прочие обычно делают вид что есть файл, когда его щёлкаешь дважды, он скачивается в бэкграунде и юзеру кажется что файл реально существует локально. Читай доку к дропбоксу.
Гитхаб с туду листами нахуй никому не впился на собесе. Тестовое главное сделать.
учить новое. В общих чертах они схожи.
Анон, поясни вкатывальщику, чем шарписты на работе занимаются?
дрочат друг другу
>Пример?
Любой проект который написан с использованием требуемого от кандидата стека. Главное чтобы это было что-то отличное от туду листа и не копипаст чужого кода.
На предложение решить тестовое пишешь: "У меня есть проект написанный с использованием необходимого стека технологий, прощу зачесть его в качестве выполнения тестового, либо оплатить выполнение тестового."
Так ты сразу даешь понять, что достаточно квалифицирован для того чтобы просить деньги за тестовое + экономишь время не тратя его на решение тестового.
Копипастят код со стэковерфлоу, потом оборачивают это в паттерны и типа вот охуенно все сделал.
Сейчас у шарпа оч разросся стек, зависит сильно от того куда пойдешь. Скорее всего будешь делать микросервисы, либо поддерживать легаси.
Чтоб в случае передачи аргументом null у тебя не возникло исключение при вызове .ToString() - метод тогда вернет false просто.
Спасибо, теперь понял
> .ToString() - метод тогда вернет false просто.
ToString возвращает string или null, а не bool. А Equals возвращает в данном случае результат сравнения двух вызовов ToString т. е. будет сравнение между null и тем что вернёт this.ToString().
К примеру, можно перезаписать this.ToString() таким образом чтобы он null возвращал, тогда при Equals(null) мы получим true, а по твоим словам ""метод вернёт false просто"
смотря что делать. но в общем то да.
для меня там со шрифтами проблема (под виндой)
и был трабл с канвас по макосью
obj?.ToString() == ToString()
Это короткая запись вот этого
obj != null && obj.ToString() == this.ToString()
Всякие Скалы/Котлины тоже так делают.
Советую освоить https://docs.microsoft.com/en-us/dotnet/csharp/language-reference/operators/
С ними жизнь станет в принципе легче. Там и твой ?. и ?[] имеются. И мой любимый ??, про который вечно все забывают.
С геймдевом в РФ наверное никак. В Минске и Киеве может ещё как-то. За рубежом норм. Иногда удалёнка проскакивает.
Ебать ты Джокер
Потому что никому не нужен ваш всратый клон джавы, кроме анальных корпораций, которые не знают как запустить сервер на nginx
сам понял что сказал?
Шарп уже занял свою нишу в бюджетных организациях и энтерпрайзах с виндовыми серверами (коих полторы штуки). В остальном тобой перечисленном есть варианты куда лучше и современнее - дарт, реакт нейтив, котлин, го.
Можно ли сделать как-то так,
чтобы на вход одного метода подавался
либо FileStream, либо MemoryStream,
и возвращался соответственно либо FS, либо MS?
Или надо обязательно два метода запиливать?
Нормально, главное память не засри.
>дарт
смотри "реакт нейтив"
>реакт нейтив
Как там дела с потоками обстоят? С нормальной то есть. А ну да. Для приложений формочек оно же не нужно.
>котлин
неплоха неплоха. Но, как обычно, в бочке меда захерачили пару половников говна в виде синтаксиса и мозголомательных вещей. Чет не видно чтобы все жависты ломанулись в котлин
>го.
распиареное говно. годится для разной мелочи только
В итоге получаем кучу языков, где все не слава богу. Из которых только котлин куда ни шло, но займет место жавы(не жс) в гуишных приложухах, то есть "андроид онли"
У меня особо нет времени чтобы пощупать и то и другое, да и любовь к языку весьма расплывчатое понятие и приходит где то спустя пол года владения оным.
Если сравнивать по скорости входа что будет попроще дотнет или джанго?
А если в плане качества и вариативности проектов?
> брать фронтенд-макаке для своих поделок в перспективе хочу фуллстечить и перекатиться на апворк
Тогда бери очевидный PHP, на шарпе и петухоне фриланса нет, исключением будет только реальный опыт работы.
тогда смотри на перспективу. У нас ты на шарпе не найдешь работы, а на питоне море конкуренции.
пхп всегда в цене )))
А можно ли сделать как-то так,
чтобы вообще нихуя не надо было запиливать,
и чтобы оно всё уже было запилено,
и допиливалось по мере появленадобности,
своевременно, высококачественно, безошибочно,
актуально, и ещё и быстро, и ещё и с трепетом?
Я те чё, бля, печатный станок?
Его, этот станок, самозапиливать надо автоматизированно, тогда и бабло будет с него высераться, бесплатно и без смс.
Тогда учи что хочешь, долбоеб.
Ну, т.е. я прочитал про него, вроде как понял что эта фигня нужна чтобы вернуть IEnumerable<T> лениво. Вроде прикольно. А вот как это использовать-то в чем-то реальном не понял. Просто вот я придумал такую вот фигню, допустим я делаю запрос, в ответе мне приходит длинный json, я его десерелизую там как раз IEnumerable<IResponse>, я хочу теперь по всем респонсам пройтись и что-то в зависимости от респонса сделать, но не могу понять могу ли я использовать yield, а если могу, то как и когда? Для примера, вот код, с абстрактным апи, которое возвращает абстрактные фотки https://ideone.com/q5abi5 . Где где тут можно использовать этот yield и как?
>реальный пример использования yield return?
Когда нужно возвращать из метода IEnumerable и тебе лень/неэффективно/нечитабельно писать свой IEnumerator.
Как пример:
public IEnumerable<HttpResponseMessage> ExecuteRequest(HttpRequestMessage request)
{
yeild return ExecuteRequestWithMainProvider(request);
yeild return ExecuteRequestWithReserveProvider(request);
yeild return HttpResponseMessage.Empty;
}
var response = ExecuteRequestAsync(request).First(resp=>resp != null);
В итоге ты получишь либо ответ на запрос от одного из провайдеров, либо пустой ответ, который будет означать, что ни один из провайдеров не смог выполнить запрос.
Хм. Вроде понял. Спасибо.
Именно, тем же вопросом уже пару лет задаюсь.
Когда работаешь с жабой, то складывается впечатление, что это продукт для студентов. Обеднён синтаксисом, инструментарием, какие-то выдуманные школьником наименования. Под каждую платформу надо плясать с бубном по два дня. И потом оно всё равно падает, и сеньоры/архитекторы объясняют, что ты забыл прочитать какой-то доп документ на 1000 страниц или потому что ты забыл поставить какой-то магический флаг о котором знают 2,5 анона или надо версию очередного супер JVM форка установить.
Котлин появился, потому что разработчиков страшно стошнило от работы с жабой. Стал жив благодаря Гуглу с его Андроидом. Теперь его пытаются натянуть куда только можно.
Го/Скала - прикольно, если уж пришлось завязаться на JVM, то можно и окунуться.
React и прочие смузи поделия - это вообще клоунада. Калькулятор, крестики-нолики и сайты визитки вполне пойдёт клепать. Эти программизды считают что выполнение простых миллисекундах операций за 1-10 сек - это норма.
С/C++/Rust - своя ниша, они будут ещё долго нужны.
Ну не надо на жаву гнать. Шарп хоть мне и больше нравится, но некоторых фишек жавы мне не хватает в нем.
А можно сделать что-то вроде public static void Method(var param1),
где param1 - (string)"путь к файлу" для создания FileStream из него,
или же byte[] для создания MemoryStream,
а var - это нечто вроде - похуй на тип param1, это может быть как string, так и byte[]?
Как выразить это не знаю, но сдаётся мне, что надо букву T куда-то приписать, и вот этот от where, ещё, в довесок.
Хз, я как-то уже будучи сеньором переключился на жава проекты на пару лет внутри большой корпорации. Там было достаточно архитекторов и жава сеньоров, у которых можно было спрашивать как делать правильно. Мой код всегда проходил через их код ревью без проблем. Но я продолжал материться на протяжении всех двух лет. В итоге не выдержал и вернулся назад в дотнет.
Просто делаешь перегрузки вида
public static void Method(string filePath)
{
HandleStream(File.Open(filePath);
}
и
public static void Method(byte[] buffer)
{
HandleStream(new MemoryStream(buffer));
}
А HandleStream уже будет:
private static void HandleStream<T> (T stream)
where T : Stream
{
}
Ну, например возможности нормально пометить что может бросить метод. В шарпе ты либо будешь пилить атрибуты свои, либо в коментах писать, а коменты многие не пишут, либо забывают в них написать что метод может кинуть исключение.
Возможность в одном блоке несколько типов исключений ловить.
Свич в последних версиях удобный, хотя в шарпе тоже стал получше.
Перечисления который без всяких методов расширения позволяет дополнительные штуки из себя получать. В шарпе вот енамы по дефолту - чисто для хранения констант, а иногда нужно все равно логику какую-то от этих констант иметь, допустим у тебя в перечислении цвета.
enum Color{
RED,
GREEN,
BLUE,
PRIMARY,
SECONDARY
}
И вот ты передаешь это по коду, и хотелось бы код цвета получить из этого перечисления. Ну вот так вот, хочется и все тут. В шарпе ты будешь вынужден прибегать к расширениям, а т.к. люди не совсем привыкли к тому что у енамов есть какие-то методы, они не сразу будут въезжать в код. В Джаве же никаких проблем с этим нет, у тебя Enum может и данные хранить и вообще, по сути, каждое значение перечисления это инстанс неизменяемый. Это смешной, наверное пример, но на самом деле бывает часто полезно иметь эту возможность. Опять же, в шарпе достигнуть этого можно, но оно там не на своем месте смотрится, потому что, по сути, enum в шарпе - эо набор именованных констант
Это первое что вспомнилось, и чего мне таки не хватает в шарпе немного.
А какой смысл "новые" писать на шарпе и не на нет кор?!
Вопрос должен быть другой "многие ли переводят на кор свои ентерпрайзы"
я вот знаю один такой - антиплагиат
про SO можно и не говорить - они само собой
>возможности нормально пометить что может бросить метод.
Но ведь checked exceptions нынче считаются антифичей
>возможности нормально пометить что может бросить метод
>Возможность в одном блоке несколько типов исключений ловить.
Меня это в жаве сильно бесило. Код надо стараться писать так, чтобы исключения в принципе не бросались. Всех возможных исключений (особенно когда с чем-то внешним работаешь) невозможно перечислить.
В шарпе очень нравится when для фильтра исключений (пик рилэйтед).
switch with pattern matching = awesome! (пик рилэйтед)
>Перечисления который без всяких методов расширения позволяет дополнительные штуки из себя получать.
>Using enums for control flow or more robust abstractions can be a code smell. This type of usage leads to fragile code with many control flow statements checking values of the enum.
SOLID все дела. Не стремитесь создавать швейцарский нож из всего подряд! Single Responsibility - делай одну вещь и делай её хорошо.
Enum позволяет
- упростить читаемость кода;
- повысить производительность;
- помогает избегать всяких магических значений по всей системе;
- предоставляет контракт для взаимодействия между разными частями системы.
>без всяких методов расширения
>логику какую-то
Open–Closed principle - вместо добавления кучи магии для весьма сомнительных бенефитов делай расширения, если нужно добавить особую логику. Шарп всё правильно делает.
Для твоего примера с кодом цвета добавь какой-нибудь HashMap (Dictionary<Color, ColorCode>). У тебя будет разделение логики по смыслу и не надо будет тащить одного монстра везде подряд, даже если он там нафиг не сдался. Особенно (!) если ты enum для поля в БД используешь.
Для особых случаев с enum можно вот сюда посмотреть
https://docs.microsoft.com/en-us/dotnet/architecture/microservices/microservice-ddd-cqrs-patterns/enumeration-classes-over-enum-types
Type-Safe enum
https://www.meziantou.net/smart-enums-type-safe-enums-in-dotnet.htm
>возможности нормально пометить что может бросить метод
>Возможность в одном блоке несколько типов исключений ловить.
Меня это в жаве сильно бесило. Код надо стараться писать так, чтобы исключения в принципе не бросались. Всех возможных исключений (особенно когда с чем-то внешним работаешь) невозможно перечислить.
В шарпе очень нравится when для фильтра исключений (пик рилэйтед).
switch with pattern matching = awesome! (пик рилэйтед)
>Перечисления который без всяких методов расширения позволяет дополнительные штуки из себя получать.
>Using enums for control flow or more robust abstractions can be a code smell. This type of usage leads to fragile code with many control flow statements checking values of the enum.
SOLID все дела. Не стремитесь создавать швейцарский нож из всего подряд! Single Responsibility - делай одну вещь и делай её хорошо.
Enum позволяет
- упростить читаемость кода;
- повысить производительность;
- помогает избегать всяких магических значений по всей системе;
- предоставляет контракт для взаимодействия между разными частями системы.
>без всяких методов расширения
>логику какую-то
Open–Closed principle - вместо добавления кучи магии для весьма сомнительных бенефитов делай расширения, если нужно добавить особую логику. Шарп всё правильно делает.
Для твоего примера с кодом цвета добавь какой-нибудь HashMap (Dictionary<Color, ColorCode>). У тебя будет разделение логики по смыслу и не надо будет тащить одного монстра везде подряд, даже если он там нафиг не сдался. Особенно (!) если ты enum для поля в БД используешь.
Для особых случаев с enum можно вот сюда посмотреть
https://docs.microsoft.com/en-us/dotnet/architecture/microservices/microservice-ddd-cqrs-patterns/enumeration-classes-over-enum-types
Type-Safe enum
https://www.meziantou.net/smart-enums-type-safe-enums-in-dotnet.htm
а можно узнать, как этот NET 5 защитить от хакеров, не от взлома, а от декомпиляции. Ведь байт код net - это по сути опенсоурс.
Только запутыванием логики, т.е ты пишешь программу которая будет переписывать твою программу так чтобы ахуели все, даже ты в конечном итоге.
Обфускация как вариант, но так себе работает если ты не сам ее писал. Еще есть варианты писать критичный код на С или С++ и через pinvoke вызывать.
Ну или обрабатывать критичные вещи на своем сервере отдавай только ответ.
>modelBuilder.Entity<User>().HasOne(p => p.Company).WithMany(t => t.Users).HasForeignKey(p => p.CompanyInfoKey);
И собственно вопрос в том, что правильно же я понимаю, что строчки в методе OnModelCreating будут выполнятся только один раз, а потом их из кода можно удалить, потому что они уже привели базу данных к нужному мне виду?
Все языки которые не компилируются в нативный код такие.
Но что ты такое хочешь спрятать если боишься что у тебя сопрут?
Просто по факту если захотят спереть и нативный код сопрут, так что защита чего угодно сейчас на компе дело условное.
говнокод мой увидят))
ты пишешь десктоп приложение, защищаешь его крутым мега-протектором за 300$, а любой школоло качает de4dot, и декомпилит за 2 сек. твою прогу, меняет авторство на свое, и вуаля - клон твоей программы бродит по сети, со смешным ценником в 100 руб.)
И зачем ты говоришь о том чего не знаешь, долбоебина? Бесплатный обфускатор + аутентификация по сети и твоё приложение в безопасности. У моего знакомого коммерческий проект, он в нём использует такую схему, единственный раз когда его программу перепродавали был в тот момент когда кто-то купил лицензию, установил её на виртуалку а потом образ этой виртуалки перепродавал. Но он это быстро вычислил и аннулировал лицензию, в следующий раз они уже такое проворачивать не стали.
>аутентификация по сети и твоё приложение в безопасности
аутентификация по сети вообще ни на что не влияет. А обфускация повышает "да чет лень ковырять ломать"
компиляция в натив которую обещают еще больше повысит этот порог
>аутентификация по сети вообще ни на что не влияет.
Обновления сам делать будешь?
При её помощи можно добавлять дополнительные слои вида:
При закрытии программы можно шифровать ключевые файлы, а ключ к их расшифровке хранить на сервере и получать его при следующем запуске программы.
В общем, очевидно, что ты один из тех кукаретиков, которые не разбираются в вопросе, а говорят так как чувствуют.
>Обновления сам делать будешь?
хрякер перепродает текующую версию. он влзломал продал и забыл. зачем ему возня с обновами. Если нужны будут обновы то ему снова бабла занесут и все.
>При закрытии программы можно шифровать ключевые файлы
и чо. я сниму дамп с открытой проги. делов то.
Конечно разные там SecureString, но если я работаю не только с памятью, а могу (а я же могу да) править бинарники, то это уже не защита от получения твоих криптоданных
зы: вот если бы ты сказал что буду получать по сети сам исполняемый байткод, впрочем даже это не защита
>я всё взламать магу!!!
>RDR2 до сих пор не взломан
>ему снова бабла занесут и все.
Конечно занесут, а потом еще, им ведь взломанная версия нужна не для того чтобы денег сэкономить, а просто чтобы великого хакира кормить. Всё так, сычуш, всё так.
>им ведь взломанная версия нужна не для того чтобы денег сэкономить,
ну то есть все упирается в "неуловимый джо" и "стоит ли ломать или да ну нах"
ну это как и везде. Но в случае байткода ломать намного легче и сетевая аутентификация не сильно усложняет задачу
>>RDR2 до сих пор не взломан
он скомпилирован в байткод? или все же в натив? зачем ты это сюда принес
В моем окружении все новое пишется на нет кор (и всем очень нравиться), старое тоже все пытаются перевести, если не слишком много трудозатрат.
>им ведь взломанная версия нужна не для того чтобы денег сэкономить,
тут вопрос кому им
я покупаю софт который привязан к моей машине (учетке) и отвязываю его.
Далее продаю его куда дешевле, но многим и мои вложения окупаются
а народ экономит
зызызы:
и в тот же рдр2 можно "купить" за сколько там рублей было. 450 вроде. лень смотреть.
Я бордерлендс3 "купил" за 100 руб, правда игра говно, но это уже другой разговор
Проверять я конечно не буду, но рискну предположить, что этот код может использоваться при миграциях и валидации соответствия мапинга базе данных. Но смысла удалять не вижу - вдруг захочется еще одну такую же БД сгенерировать для другой среды.
Джун .нета в треде. Скажите, .net/asp.net сильно отличается от .net core/asp.net core? Писал учебный проект на коре, реальный предлагают на обычном. Много там переучиваться?
Отличия не принципиальны. Если проект уже существующий - почти не заметишь разницы поначалу, если новый - немного нужно почитать как намутить ASP.NET Core апликацию с ее IoC, стартапом и конфигурацией.
Проебался в глаза.
Проект уже существующий, по всей видимости, трудностей быть не должно. Сам так начинал карьеру.
serverSocket.SendTo(file, clientEndPoint);
Как я понял, дело в ограничении размера транспортного сегмента/датаграма, он не может быть больше 64 кб (а часто даже не больше 1 кб).
Но почему тогда при использовании протокола TCP и метода
clientSocket.Send(file);
такого ограничения нет и мне позволяют хоть 20 мб переслать за раз?
У меня есть веб приложение на асп.нет с айдентити.
Я хочу добавить в это приложение веб сервис, который будет возвращать какие-то значения, которые привязаны к пользователю. Не могу понять, как это вместе связать. Апи-контроллер и Авторизацию.
Подскажите, плес, господа программисты!
да какая разница. мне просто нужен пользователь авторизованный. как это вместе объединить-то?
у хакера твой код. Что ты там собрался шифровать, лолка? Трудно твой метод шифровки заккоментить, чтобы вообще ничего не шифровалось?
блядь, ничего я не собрался шифровать, мне похую. чтобы самому не писать авторизацию, я использовал то, че уже есть. че ты доебался-то до меня, пидрила обоссаный?
ты тугодум, посмотри, на какие я посты отвечал
по http протоколу можно запилить, возврат в json, на клиенте уже распарсишь и все.
можно поподробнее описать
Когда ты авторизируешься, тебе дают токен, который прикладывается к каждому запросу. В этом токене хранятся данные о текущем пользователе. В коре я это делал так -
return User.FindFirstValue(ClaimTypes.NameIdentifier);
Если ты в обычном .NET то хз, ищи что-то подобное.
>при закрытии программы можно шифровать ключевые файлы, а ключ к их расшифровке хранить на сервере и получать его при следующем запуске программы.
>В общем, очевидно, что ты один из тех кукаретиков, которые не разбираются в вопросе, а говорят так как чувствуют.
разбирается он в вопросе блядь, трололо.
ДО:
string auth(){
httprequest
.......
return {auth : "ok", key: "qwertyuiop"}
}
ПОСЛЕ:
string auth(){
// httprequest заккоментили просто, и вернули что надо.
// .......
return {auth : "ok", key: "qwertyuiop"}
}
Что ты тут своей аутентификацией сделаешь долбоебушка?
Почему нет откликов? Зарплата не устраивает? У нас в требованиях нет ничего сверхсложного или отталкивающего. Что не так?
По мне норм вообще и стек очень узкий - сходил бы на собеседование если бы сидел без работы и жил рядом.
>Что ты тут своей аутентификацией сделаешь долбоебушка?
ну вообще то он предлагал присылать ключ для расшифровки зашифрованных рабочих файлов на время работы, что не дает взломать без подписки.
Этим можно усложнить хак, но без инета работать не будет.
И этот ключ можно выцарапать, что довольно муторно если нет доступа к софту, но коли он есть то просто на уровне байткода прописывается доставание ключа
Конечно можно проверять бинарник на модификацию, запрещать отладчик и так далее. но это уже не "простая обфускация"
1 8??? часовой график работы с 9 до 20 это как? выбирай 8 часов из этого промежутка?
2 Непонятно про рост зарплаты. Вроде бы хотя фуллстек, но 100к это так и останется?
3 я как дотнетчик терпеть не могу фронт. Впрочем я и не зову себя фулл стек.
> выбирай 8 часов из этого промежутка?
Да
> 100к это так и останется
Переиндексация имеется. И причем здесь фуллстек-не фуллстек?
>ну вообще то он предлагал присылать ключ для расшифровки зашифрованных рабочих файлов на время работы, что не дает взломать без подписки.
достаточно одной лицензии, чтобы отломать такую защиту
>Переиндексация имеется. И причем здесь фуллстек-не фуллстек?
да не причем в общем то. Проще проехать чем развивать тему.
Ну а так я предпочитаю видеть зарплатную вилку. И понимать, что "я джун и 100к это хорошо" или "я не джун и 100к это как то не то"
ну и тому подобное
> я предпочитаю видеть зарплатную вилку
> от 100 000 руб. на руки
Верхнего предела нет. Если ты стоишь 250 000, то мы и предлагаем столько
Человек видит цифру 100к и сразу считает, что это и есть цена, которую вы готовы платить. Поставьте потолок тоже, те же 250к. Хот лучше две вакансии в таком случае сделать: миддл и сеньвор, с двумя вилками.
Если очень хочется, то тоже можно. Но анон говорил про добавлении логики и данных в простой enum в принципе.
обфускаторы есть
И щас можно, только извратно:
catch (Exception e) when (e is ArgumentException || e is InvalidOperationException)
Обфускаторы. Но нахуя? Проще сорцы тоже выложить.
Что блин конкретно попало в него в итоге?
А то рекордсы и в 8 обещали
Из мяса - паттерн матчинг импрувменты и рекорды.
https://github.com/dotnet/csharplang/tree/master/proposals/csharp-9.0
>компиляция в натив которую обещают еще больше повысит этот порог
а когда эта компиляция в натив будет?
Потому что это разные протоколы и работают они по разному. Что за тупые вопросы?
Зато тут кукарекуют что работы нет, лол.
Да. Я же всё по коду размазал и ему половину программы придётся менять чтобы эту шифровку убрать.
Создай блин проект с авторизацией и посмотри, кек. Посмтри какая структура у идентити и как он привязывает что-то к себе.
Если коротко, то добавляешь пару табличек в БД, у которых внешним ключом будет id пользователя из identity, потом в контроллере достаешь этого пользователя, соответственно и его id, и возвращаешь какие-то данные которые с этим id связаны. Все. Не понимаю что сложного
Да, популярная. В чем костыльность и странность ощущается?
1. Название поменяйте на .Net разработчик, либо .Net developer, программист ассоциируется с бюджетным дерьмом и нормальный разраб даже дальше читать не будет.
2. Требований слишком много, тут тебе и крипта, тут тебе и бэк с ОРМ, тут тебе и JS с TS, Ангуляром и даже CSS препроцессорами, тут тебе и оптимизация SQL запросов и работа с базами данных. И за всё это 100к. Зачем вы нужны, если джун-фронтендер со знаниями того же React/Angular/CSS с препроцессорами, зарабатывает всего на 30к меньше? А бэкендер может и столько же зарабатывать, а если в ДС/ДС-2 то больше.
3. У вас там в требованиях мидл/сеньор. На них всегда дефицит, и они не пойдут к вам с такими требованиями и такой зарплатой. За такое минимум 150к нужно предлагать, да и то вряд ли вы найдёте человека который удовлетворит ваши запросы, так как уж слишком большой охват технологий, такое просто физически помнить невозможно.
Так они хотят жнеца, плавца и на дуде игреца. А если не игрец, то обещают научить. Но да, денег мало на такого фуллстека.
>какой же ты тупой, я хуею. Там только возврат от твоего сервера фиксится, и возвращается нужное значение
Хуею с дегенерата. У меня при шифровке генерируется массив байт, этот массив байт отправляется серверу для получения ключа расшифровки. Как думаешь, сколько времени у тебя уйдет на расшифровку алгоритма шифрования?
сложно имея одну лицензию - получить твой ключ и вписать статично в возвращаемое значение? Хотя так никто не делает, ведь ты ключ заанишь. Делают по другому - где ты расшифровываешь все - подставляется нужное значение, и комментится твое шифрование.
слышишь знающий - а ну давай сюда твой файл, супер защищенный)
>>806008
>>806197
>>806447
Абсолютно все защиты сходятся на паре маленьких if, твое шифрование, авторизация по сети, ключи все это ломается на изи если защиту делали не сотня людей которые наклепали тысячи таких if в различных местах от разных параметров и в ключевых местах работы программы. Так игры и защищают в основном, тупо потому что затем взломщику надо найти эти тысячи if и исправить их, а это ой как не просто может быть, особенно когда такой триггер срабатывает на редких событиях.
И опять же это защита через логику работы когда ты делаешь взлом крайне и крайне дорогим и трудоемким.
В идеале ключ используется каким-то образом в работе программы и без правильного ключа она тупо работает не правильно, но это надо на этапе архитектуры закладывать и крайне тяжело поддерживать.
троль поверил, что его защита с бесплатным обфускатором, и его ключем, который приходит с сервера - не ломаемая)) Одно дело - когда продал 20 копий, и твоя прога нах никому не нужна, другое - если счет идет на тысячи.
>>806495
Да-да, вот только программа довольно популярна, приносит хороший доход и уже пережила несколько попыток взлома. Я понимаю, что школьникам, которые качают игры с торрентов, хочется мнить себя охуительными хакерами и фантазировать о том как они взламывают мир за секунду, но это никак на реальность не влияет, над этим можно только смеяться.
ссылки на супер защищенную прогу, с помощью бесплатного обфускатора, я так понял - не будет? Горе-защитник)
Я вот разработчик одного бота для ММО который тоже приносит доход и единственная эффективная защита это вычисление логики на сервере, т.е я передаю сырые данные на сервер, там произвожу вычисления и результат даю пользователю, естественно у меня там авторизация, конфузер и прочее дерьмо типа partial классов чтобы при декомпиляции был 1 файл на 100500 строк, но и это не особо помогает, есть те кто его крякает и дописывают логику.
Поэтому я каждые полгода что-то серьезно меняю и логику защиты в том числе и им приходится снова искать способы взлома т.е мы играем в кошки мышки где я чутка впереди так как минимум неделя у них на взлом уходит.
Но мне это не особо вредит так как люди сами хотят платить.
Так кидай ссылку на бота в тред, сейчас этот зумерок обосранный его взломает за пару минут.
Я это уже сделал, но оно крайне плохо работает на больших объектах потому что рефлексия медленная штука и я знаю что можно сделать ее быстрее если перевести на делегаты, но вот проблема я не совсем понимаю как мне сделать делегат из объекта тип которого только в рантайме узнаю, т.е на вход к инспектору идет object, может кто подскажет что делать в этом случае, как сделать делегат если узнаешь тип только в рантайме через gettype
Не выйдет я его через приват форума продаю где только проверенные, суть в том что на ботов идёт охота и это своего рода защита от бана пользователей
ничего не понял
получаешь на вход объект, узнаешь его тип и далее рефлексей достаешь что тебе там надо
если нужно читать значения и рефлексия не устраивает, то генеришь всякие propertyReader
на каком этапе то затык?
игра хотя бы какая? 3д?
Getvalue работает в 10-20 раз медленнее чем вызов того же метода через делегат.
https://mattwarren.org/2016/12/14/Why-is-Reflection-slow/
Вот хочу получать get свойства через делегат, но при этом никакого хард кода Типа(type) потому что на входе может быть один объект из которого я затем делать дерево буду. Но как делать такое без хардкода хз.
>Но как делать такое без хардкода хз.
еще менее понятно стало
есть обьект, есть свойства. генеришь геттеры читалки для них
либо сам через экспрешены/ilгенерацию, либо берешь одну из множества либ на эту тему, что за тебя сгенерят. Хранишь эти ридеры в словаре <имя свойства, ридер>и используешь для получения значений.
готовых либ много если поискать
вот первые попавшаяся
https://github.com/mgravell/fast-member
https://github.com/buunguyen/fasterflect
https://github.com/KeRNeLith/ImmediateReflection
576x1024, 0:17
>дык исправь его
Это окно рекламы("купите полную версию всего за 599$"), сомневаюсь, что это так просто.
исправить просто
сложно найти 599$ а исправить просто
а еще есть один иранский сайт
и наконец никто не запрещает подправить байткод
540x960, 0:16
>сложно найти 599$ а исправить просто
Через это что ли https://www.jetbrains.com/ru-ru/decompiler/ ?
>а еще есть один иранский сайт
Что еще за Иранский сайт?
>Через это что ли https://www.jetbrains.com/ru-ru/decompiler/ ?
ну тоже неплохо, но тебе нужно править байткод же
https://github.com/0xd4d/dnSpy
>Что еще за Иранский сайт?
downloadly.ir
слайсы*
> За такое минимум 150к нужно предлагать
Да мы предлагаем. У меня самого з/п не меньше. В вакансии же написано "от 100"
Ладно, в общем сегодня предложу руководству сделать две вакансии
Ну если это твой пет-проект, то конечно не нужны, но реальность такова, что большая часть кода это код под .Net 4.5 без поддержки новых фитчей языка.
Да ладно? Никогда бы не подумал, что если какая-то фича не доступна, то придётся пользоваться тем, что есть. Я спрашиваю, у слайса есть какое-то своё применение, или range operator его полностью заменяет? И нужен ли вообще тип Span в таком случае? Просто в том примере применения типа Span, что я видел, приводится как раз слайс массива на несколько частей, чтобы не выделять память на новые массивы, в которые бы пришлось копировать элементы старого.
>Span
Служит для оптимизации работы с памятью, а не для того чтобы заменить цикл for var i = 2; i < 10; i ++
А ренж оператор это обычный сахарок, который сделан по типу петухоновского.
Сходил бы к вам. А, нет, не сходил – у вас опыт от трех лет, а у меня только год и я из другого города
1. Удаляешь nuget пакет EntityFrameworkCore.SqlServer
2. Устанавливаешь nuget пакет Npgsql.EntityFrameworkCore
3. Меняешь в Startup.cs UseSqlServer на UseNpgsql
всё
https://kazan.hh.ru/vacancy/39244462
https://kazan.hh.ru/vacancy/39244069
Обновили вакансии. Названия поправим, чтобы было единообразие, старую вакансию удалим и скорее всего поставим зарплатные вилки, а не "от...".
Резюме потекли.
Большое всем спасибо. Вы реально помогли
576x1024, 0:18
если ты про "дотпик экспортит в проект, а оно не собирается", то это потому что у тебя нет оригинального проекта *.csproj с как оно там собирается
Ну и баги декомпиляции, когда оно декомпилится в лабуду
Нет, я про dnSpy, но я так понимаю причина та же, ок.
Попробовал проверить эти либы на скорость и результат мягко говоря так себе.
На 10 лямов вышло вот так.
Classic: 30,6128 ms.
Reflection: 1287,4855 ms.
Delegate: 56,0964 ms.
Fasterflect not cached: 1167,4195 ms.
Fasterflect cached: 1255,3272 ms.
ImmediateReflection: 1396,9336 ms.
fast-member: 1771,6747 ms.
Вот код на 1 лям итераций без fast-member так как его сам компилировал
https://dotnetfiddle.net/4QwGjL
Я же хотел найти способ как в случае Delegate, но чтобы без хардкода типа.
>но чтобы без хардкода типа.
да блин без какого хардкода? раскрой тему что есть хардкод блин
В остальном же
1 кто же меряет стопвотчем
2 да еще онлайн
3 да еще забывая сделать реста
4 и при этом еще считая в тесте время генерации гетера.
Пиздец ты тупорылое животное, очевидно, что без вот такого хардкода:
var delegateMethod = (DelegateMethodName) Delegate.CreateDelegate( ...
Для своих проектов есть Node.JS, если хочешь статическую типизацию, то есть Typescript, ебаться с .Net для своих проектов не имеет смысла.
то есть без кодогенерации. с помощью магии?
Я гуглил и все что нашел это страшные штуки с kernel32, маршалингом и передачей IntPtr. А я в шапр-то убежал из-за того что как увидел это в с++ подумал - ну его нахуй.
В общем, неужели нет более удобных способов заставить окошко консольной программы быть всегда сверху других окон?
Зачем надо? Я сделал простенький таймер рабочего времени в виде консольного приложения, ну чтобы не забывать выйти покурить, если зарабатываюсь, ну и именно такой простенький таймерок в консольке мне норм, но хочется чтобы он всегда висел сверху, чтоб не забывать про него.
У меня на работе линукс просто и я слышал что там вроде были формы, но вроде их только под винду же завезли.
>>807642
Ну блин, проблема на самом деле не в кернеле, а в том что на деле я на линухах сижу и думал что может быть с переходом на core MS завезли какой-то общий апи для работы с консолькой, чтобы такие вот штуки можно было просто делать. Грустненько.
Так я для последующего перекачеввния на фриланс/развития как фуллстек собираюсь учить
Хочу сделать себе скриптовый язык на шарпе в своем мини движке на с++ (не спрашивайте зачем, мне просто интересно и для скилла).
Я так понимаю, во всяких юнити юзают для этого mono - а что почитать по данной теме?
Второй вопрос - и это можно только через mono? А например .net core нельзя?
само юнити или игры?
Но ведь .net core как раз же развивают в сторону мультиплатформы и отвязки от винды
сам движок юнити это моно
>Но ведь .net core как раз же развивают
но это же не значит, что все на него перешли. легаси оно такое
нет. У меня есть украденные китайцами исходники юнити - там С++ код, над которым уже сделана шарп оболочка для скриптинга
То что выкладывается на шарпе - это не исходники юнити, это исходники оболочки надстроенной поверх ядра юнити.
Но речь не об юнити, а о том как сделать у себя скриптинг С#. Как например сделано в годоте, bsf и т.д.
>над которым уже сделана шарп оболочка для скриптинга
а шарп в чем выполняется? ему нужен рантайм. и этот рантайм есть юнити.
но вообще в теории я бы
1 притащил бы рантайм и юзал бы этот рантайм для ваших шарп скриптов
2 редоставил либу на дотнет, чтобы ее можно было вызвать из шарпа и она прокладка для доступа к моему софту
ну или заранее подгрузил ее в исполнение, чтобы о ней даже не думали
то есть ты как рантайм можешь взять что угодно
для тебя без разницы. разница будет для скриптующего если он захочет либу какую то подключить, а ее нет под выбранный рантайм. но уже почти дотнет5 так что все уже есть
проблема таких "задач" в том что они на дрочку математики, а не программирования.
Я эту задачу тоже не решу, потому что не ебу как там считается этот треугольник Паскаля на бумажке.
На гугление я потрачу 10-20 минут
На попытку вникнуть в формулы - 20-30 минут
На программирование - 1-2 минуты.
И это реально разочаровывает в таких задачах (и сайтах-задачниках - расстраиваюсь, когда захожу на кодевар, чтобы порешать задачу по программированию, а вместо этого надо решать математическую задачу). Ведь программирование давно уже не про математику - я например на своей работе работаю над серьезным и дорогим софтом . Вообще нихуя математического нет. Все нужные формулы бухгалтерии описаны в тз и постановлениях.
В программировании нужно математическое мышление, а не задрачивание мат формул построения треугольника Паскаля.
Меня вон даже числа Фибоначи бесят - нахуя рекурсию на них показывают? Есть более простые способы показать рекурсию. Я вообще программирование начал изучать в 10 лет - какой блядь Фибоначи, какой матан? Спокойно на нормальных примерах разобрался и с рекурсией и со многим другим.
Так в том то и дело, что суть треугольника и откуда берутся цифры эти я понял за пол минуты, а вот запрограммировать не смог. Т.е. опыта жонглировать данными в массивах еще нет, а они такое задают....
Там по сути то берутся 2 вышестоящих числа, складываются и получается нижнее под ними. И если человеку это легко объяснить, то машине капец тяжело, т.к. для неё понятий "ну там возьми 2 числа сверх" она не знает что такое сверху, сбоку и т.д... нужно думать в цифрах индексов массивов...
Фриланса на .Net тоже нет, исключением будет только если у тебя уже есть как минимум 2 года коммерческой разработки, но это тогда не фриланс уже будет, а обычная удаленная работа. Если тебе фриланс нужен, то учи PHP.
Конечно норма, потому что все эти курсы дерьмо, всю информацию ты сам будешь гуглить и учить, а твои преподы/менторы просто запустят твой говнокод, скажут "ну да, это треугольник" и пойдут дальше. В общем, можно тебя поздравить с проебанными деньгами.
>Конечно норма
Фух, я уже испугался что я бездарное существо и в программировании карьеры мне не светит. Дальше задания идут всякие манипуляции с матрицами, не знаю еще как там справлюсь или нет..
>В общем, можно тебя поздравить с проебанными деньгами.
Ты думаешь я реально записался к ним на курс? они же просят 4 258 рублей в месяц и дают еще кредит на 36 месяцев. Т.е. их курс по Unity стоит 153к рублей. Я что больной столько платить? Просто скачал на торренте курс.
Ну тогда ничего необычного нет. Очевидно, что по началу тебе придётся гуглить и искать ответ, у тебя ведь нет практического опыта. Тупость определяется со временем, путём возвращения к задачам которые ты уже решал, либо к похожим на те которые ты уже решал. Вот если в таком случае у тебя сложность возникает, значит ты тупой и программирование это не твоё.
>Ну тогда ничего необычного нет. Очевидно, что по началу тебе придётся гуглить и искать ответ, у тебя ведь нет практического опыта.
Понял, значит пока не опускаю руки и долблю дальше. А то этот треугольник сильно меня задизморалил.
>Тупость определяется со временем, путём возвращения к задачам которые ты уже решал, либо к похожим на те которые ты уже решал. Вот если в таком случае у тебя сложность возникает, значит ты тупой и программирование это не твоё.
В жизни еще не слышал такого точной формулировки как определить тупость. Теперь в реал-тайме смогу оценивать тупой или нет. Уже было что возвращался к старым задачам и без проблем их снова решал.
А когда было ДЗ - написать игру в числа с любым кол-вом участников так я вообще недовольный своим кодом стёр его и написал заново красиво и лаконично.
>Фух, я уже испугался что я бездарное существо и в программировании карьеры мне не светит
Знаешь, я скажу так - многие программисты не столкнутся с реально сложными задачами.
По сути большинство современных программистов, они как... эникейщики. Эникейщик знает как из всего готового собрать нужный функционал. Ему не нужно вникать в детали, он может не уметь пользоваться этим функционалом. Он может не знать всю работу какого-нибудь бухгалтера, но спокойно может собрать ему рабочий компьютер, полностью решающий все задачи бухгалтера. Он просто знает где что взять и как это объединить.
Также и современное программирование - сейчас большинство решений есть в готовом виде, все алгоритмы давно уже написаны, все компоненты давно созданы, все статьи написаны. Если ты не Дональд Кнут, то вряд ли ты что-то новое придумаешь. Да и если придумаешь - не факт что оно кому-то нужно. Вон boost из мира с++ - там сидят крутые боги программирования - а много кому их решения нужны? На шарпе, жабе, расте, и т.д. даже близко ничего такого нет - но это никак не мешает
Задача большинства программистов сводится к простому - взять готовое, и собрать из этого нужное.
Но и как с эникейщиком - чем больше он вникает в работу бухгалтера, тем лучше он может настроить ему рабочее место. Также и с программистом - чем лучше ты понимаешь работу готовых решений, тем лучше ты ими можешь воспользоваться - поэтому всеже разбираться в этом стоит. Но если что-то не получается, это не не поставит крест на твоей карьере - так или иначе задачу ты решишь
Геймдев наиболее близок к этому (именно поэтому в нем самый низкий уровень программирования). Также как и веб. В продакшене в большинстве случаев тоже. Поэтому больше всего побеждают индусы и китайцы - которым насрать на философию, культуру и науку программирования, они просто решают поставленную задачу путем наименьшего сопротивления.
Другое дело что все что я описал - это всеже вредный совет, если долго придерживаться этой философии - ты так и останешься низкоклалифицированным говнокодером. Но на старте это хороший совет - не стоит тонуть в деталях, они сложны и могут тебя утопить.
Так к чему же я это написал? А к тому что сейчас не забивай себе голову - просто пиши код как можешь. Понимание, опыт, навыки - они постепенно придут сами.
Способ стать хорошим программистом всего один - писать код и только писать код. Ну и размышлять и анализировать написанный код - где можно лучше, где получилось криво. Конечно же еще читать умные книжки, смотреть чужой код. Никакие говнокурсы не сделают из тебя сеньора.
>Фух, я уже испугался что я бездарное существо и в программировании карьеры мне не светит
Знаешь, я скажу так - многие программисты не столкнутся с реально сложными задачами.
По сути большинство современных программистов, они как... эникейщики. Эникейщик знает как из всего готового собрать нужный функционал. Ему не нужно вникать в детали, он может не уметь пользоваться этим функционалом. Он может не знать всю работу какого-нибудь бухгалтера, но спокойно может собрать ему рабочий компьютер, полностью решающий все задачи бухгалтера. Он просто знает где что взять и как это объединить.
Также и современное программирование - сейчас большинство решений есть в готовом виде, все алгоритмы давно уже написаны, все компоненты давно созданы, все статьи написаны. Если ты не Дональд Кнут, то вряд ли ты что-то новое придумаешь. Да и если придумаешь - не факт что оно кому-то нужно. Вон boost из мира с++ - там сидят крутые боги программирования - а много кому их решения нужны? На шарпе, жабе, расте, и т.д. даже близко ничего такого нет - но это никак не мешает
Задача большинства программистов сводится к простому - взять готовое, и собрать из этого нужное.
Но и как с эникейщиком - чем больше он вникает в работу бухгалтера, тем лучше он может настроить ему рабочее место. Также и с программистом - чем лучше ты понимаешь работу готовых решений, тем лучше ты ими можешь воспользоваться - поэтому всеже разбираться в этом стоит. Но если что-то не получается, это не не поставит крест на твоей карьере - так или иначе задачу ты решишь
Геймдев наиболее близок к этому (именно поэтому в нем самый низкий уровень программирования). Также как и веб. В продакшене в большинстве случаев тоже. Поэтому больше всего побеждают индусы и китайцы - которым насрать на философию, культуру и науку программирования, они просто решают поставленную задачу путем наименьшего сопротивления.
Другое дело что все что я описал - это всеже вредный совет, если долго придерживаться этой философии - ты так и останешься низкоклалифицированным говнокодером. Но на старте это хороший совет - не стоит тонуть в деталях, они сложны и могут тебя утопить.
Так к чему же я это написал? А к тому что сейчас не забивай себе голову - просто пиши код как можешь. Понимание, опыт, навыки - они постепенно придут сами.
Способ стать хорошим программистом всего один - писать код и только писать код. Ну и размышлять и анализировать написанный код - где можно лучше, где получилось криво. Конечно же еще читать умные книжки, смотреть чужой код. Никакие говнокурсы не сделают из тебя сеньора.
У шарпа синтаксис приятней за счёт удобства и лаконичности, в остальном различий мало.
ай малаца!
>Interope требует наличия на клиентской машине офиса, например.
Отправляешь на сервер целевой ворд документ и шаблон, в ответ получаешь заполненный ворд документ.
>Знаешь, я скажу так - многие программисты не столкнутся с реально сложными задачами. По сути большинство современных программистов, они как... эникейщики.
Знаешь, я скажу даже больше - это вообще в любой професси. Даже у учёных и докторов (но у них хотя бы порог вхождения выше). Есть реальные специалисты, на которых потом все равняются и цитируют. Их мало. Остальные туда влезли потому что "родители заставили, от армии сбежал, да хз". Зато потом все жалуются на тупизм докторов, на внезапно сломанные устройства, и вообще на криворукость всего и вся. В каждой профессии занимаются "копи-пастой".
Мир заселён тупыми и ленивыми людьми чуть более чем на половину. И вместо того чтобы повышать общий интеллект всей цивилизации мы просто пытаемся выдать всем по рабочему месту (для галочки в администрации, чтобы потом красивые отчёты показывать).
Ну тогда устанавливай офис на клиентских машинах.
Если можешь работать с новыми версиями (docx), то можно посмотреть в сторону OpenOffice/LibreOffice. Берёшь их либу, клепаешь док и этот док потом в вёрде запросто откроется.
Есть как официальные либы под дотнет, так и куча сторонних - https://github.com/oldrev/maltreport
leetcode.com - там все нужные задачки есть, причём не только алгоритмические.
MMO для программистов
деньги на ветер.
Мог бесплатно на сайте Microsoft пройти курс по C# (правда там ООП нет). Прочитать Metanit, а задачи порешать на Code Wars.
Куча бесплатных ресурсов по изучению программирования, но люди так и продолжают платить за воздух.
Ты когда нибудь видел ситуацию в которой ты ввел имя русскими буквами, вместо английских и у тебя крашился браузер? Вот ты предлагаешь делать такое же поведенин. Очевидно, что лучше либо предупреждать о неправильном вводе, либо не продолжать выполнение программы и ждать правильного ввода.
Судя по твоему описанию у тебя не дойдет до передачи в конструктор, так как ты не смог сформировать свойство которое передаешь оно же выбросило исключение.
Так делать можно, но исключения из любой дырки это плохо, выброс исключения дорогая операция и не всегда имеет смысл быть. Поэтому для обхода исключения выдумывают всякие штуки из функциональных языков типа Option, OperationResult, Either и еще куча различных мини типов которые хранят как ошибку, так и положительный результат.
Если ты делаешь либу то пользоваться надо исключениями так как их все ожидают, а если для себя можешь попробовать иную концепцию.
Вопрос по Visual Studio.
Я во многие папки (неймспейсы) кидаю docx файл с рабочей документацией.
VS мне этот файл автоматически добавляет в проект, чем замусоривает рабочую область. Как указать, чтобы файлы с такими то расширениями не добавлялись?
system.data.sqlclient это легаси, Microsoft.Data.SqlClient это обновленная версия. Какую использовать зависит от проекта.
Хотелось бы решение на совсем, а не каждый раз кликать мышкой, как макака.
С такими вопросами, боюсь, что для тебя это единственный вариант.
<None Remove="\*.docx" />
но лучше не используй. Лучше пкм как макака, потому что тот, кто кидает доки не в папку доков должен страдать
Спасибо.
>>809075
По поводу формата и места хранения доков. У меня пет-проект для основной работы. Доки - в основном это всякие формулы и их вывод, т.к. в коде потом хуй поймёшь, откуда это взято, скрины из учебников, графики и т.п. Удобней ворда для этого нет.
Хранить в отдельной папке доков пробовал, но не канает, т.к. теряется, надежней в папке рядом с исходным кодом.
я надюсь ты используешь новый формат csproj, а именно
<Project Sdk="Microsoft.NET.Sdk">
и поместил <None Remove="\*.docx" /> в одну из <ItemGroup>
Разобрался, работает, спасибо.
Почему нет обобщённого интерфейса ICloneable<T>?
Есть только ICloneable, который возвращает object.
Если мне нужно производительное клонирование, стоит ли самому определить интерфейс ICloneable<T> и использовать его?
он проблемный.
Если он наследник ICloneable - плохо, а если не наследник тоже плохо
Нельзя повесить ограничение на T (этим страдает и ICloneable) и проблемы с наследованием
в итоге забросили как есть
>стоит ли самому определить интерфейс ICloneable<T> и использовать его?
если он нужен то конечно.
В LINQ есть .LastOrDefault, я думал он начинает проход с конца коллекции, а он просто переназначает переменную result, нахуй такой оверхед нужен? Может быть есть другой LINQ метод который начинает обход с конца коллекции?
Какой еще оверхед. Он выдает последний элемент если коллекция не пуста или дефолтное значение если пуста.
LINQ основан на IEnumerable, а у него как бы нет конца
абстракция же об которую много копий сломано
можешь покопать либу MoreLinq но это вряд ли там есть ибо у IEnumerable нет конца
потрать 10 минут и напиши реализацию
Хмм, что-то не очень понятно. Может есть пример какой?
Обобщённый интерфейс же в любом случае реализуется программистом, т.е. в любом случае будет возвращать инстанс типа T, каким бы T ни был, даже если при этом будет ковариантность, всё равно всё будет работать. Если он не реализован нормально, то код просто не скомпилируется. А если реализован, то программист знает, что делает.
У IEnumerable есть метод Count() и есть метод ElementAt(), откуда следует, что конец у него есть, как и начало.
нет. это всего лишь методы которые предлагают пробежав по итерабле добраться до нужного места
просто в случае бесконечной коллекции он будет очень долго считать, но свою работу будет делать )
тут абстракция протекает. Ничего не поделать - таков мир абстракций. они часто протекают.
Вероятно, в этом случае нужен интерфейс IIndexable, который будет иметь Lenght() и this[int i] для тех коллекций, которые это допускают.
Коллекции, которые так не могут, или могут, но плохо (связные списки, например), не будут его реализовывать.
>Какой еще оверхед.
Коллекция из 10 элементов, если последний удовлетворяет условию, то LINQ пробежит всю коллекцию, потому что начинает пробег с начала коллекции. Но если начинать с конца, то можно сразу получить результат, т. е. это -9 операций.
Просто как раз возникла ситуации в которой нужный элемент будет ближе к концу коллекции, а в большинстве случаев именно последним, сначала написал с линковским .Last, но потом решил заглянуть в сорсы этого .Last и увидел, что лучше написать обычный цикл for var i = arr.Length - 1 ...
Я то думал, что в LINQ такое учитывается, а теперь придётся каждый раз сорсы смотреть...
в LINQ есть оптимизации на тему "если это коллекция то неча по ней бегать а возьмем Count"
но в корне лежит именно IEnumerable как что-то по чему можно пробежать.
и есть велосипеды которые делают как раз то что ты хочешь, то есть при их наличии и правильно подключенном неймспейсе будет подставлен более оптимальный вариант
но лучше другие имена давать таким методам
тут нет идеального решения. слишком общая абстракция.
Я новичок в шарпе, и у меня вопрос: зачем вообще нужны свойства? Чем function(object.Property) object.Property = value лучше, чем function(object.Property()) и object.setProperty(value)? Это при том, что недостатки очевидны: теперь безобидно выглядящий код может делать любую херню и работать сколь угодно долго.
Притом, например, в Котлине вообще убрали поля и оставили только свойства. Что в них вообще хорошего?
ну вот навскидку
у нас есть класс
Foo : ICloneable<Foo> и вот мы делаем наследника
Bar : Foo
и тут если мы захотим клонировать только Bar то нам придется так
public new Bar Clone() => new Bar();
и мы сможем использовать Clone везде где у нас Bar (пофиг нам на клонируемость Foo допустим она нам не нужна)
но если вдруг стала нужна и где то принимают Foo и делают его клон, то получают в результате не Bar и значит у нас только один вариант в Bar
Foo ICloneable<Foo>.Clone() => new Foo();
Bar ICloneable<Bar>.Clone() => new Bar();
разом ломается использование Clone без каста к интерфейсу.
то есть у ICloneable<T> есть побочные эффекты, которые не способствуют его введения в общую библиотеку
тем и лучше, что не нужно писать гет сет руками (привет жава) и свойство это самостоятельный объект который можно юзать в рефлексии
Возможность не писать гет/сет руками появилась намного позже самих свойств. И с учетом expression-bodied statements это всего две лишних строчки на свойство, стоит ли игра свеч?
Поля нельзя юзать в рефлексии?
Потому что некоторые данные класса нужно не только получать, но и устанавливать. Установка (изменение) некоторых данных класса иногда требует проведения проверки или вызова события, например, на отрисовку нового значения в форме.
Это можно легко решить написанием двух методов типа Get_some_value() и Set_some_value(). Но это выглядит уродливо, и глазу приятнее просто написать Point.X = 100500, чем Point.Set_X(100500). В обоих случаях при выходе Point за пределы рабочей области, например, предусмотрена дополнительная логика.
>не писать гет/сет руками появилась намного позже самих свойс
я про гетпроперти() сетпроперти() МЕТОДЫ как они в жаве
где это тупо методы по конвенции
и появилось же. то есть очевидно же что свойство тупо удобнее методов в своем определении
конечно в шарпе это вылилось в необходимость все таки писать {get;set;} чтобы отличалось от поля, но шарп когда появился
котлину было проще оглядываться (и даже при этом они нах*ртили там с конструкторами и теми же полями)
>Поля нельзя юзать в рефлексии?
Понял, это тупой вопрос. Но всё равно, можно было сделать свойства как самостоятельные объекты и при этом оставить синтаксис методов, которыми они фактически и являются, а не полей.
"Приятно глазу" - это вкусовщина, мне приятнее вариант с методом, потому что присваивания переменной - это операция занимающая всегда плюс-минус одно и то же время и вообще, самая простая и привычная программисту операция. А установка свойства может делать любую херню.
Слово get в названии геттера использовать необязательно, так что фактически имеем разницу между obj.Prop() и obj.Prop.
>1809351
>Поля нельзя юзать в рефлексии?
ты можешь найти свойство по тому что оно свойство. и взять у него гет сет метод. ты можешь передать PropertyInfo куда то
в жаве ты будешь искать методы по конвенции (и не дай бог обфускатор какой по ним прошелся) и поскольку это просто методы то не факт что эти методы есть нужные тебе свойства
нужно навешивать аннотации чтобы не ошибаться и тому подобный огород
> как самостоятельные объекты и при этом оставить синтаксис методов
а кому нужен этот синтаксис методов. свойства не запрещают тебя писать в старом стиле. но чет никто не хочет загромождать методами при наличии свойств. сахар он вкусный
Я имел в виду, что когда Хейлсберг придумывал (заимствовал?) свойства, возможности не писать геттер и сеттер руками еще не было, значит он руководствовался чем-то другим, когда их вводил в язык.
>сахар он вкусный
Ты просто говоришь так, как будто синтаксис полей очевидно лучше синтаксиса методов, хотя количество символов, например, практически одинаковое.
Я имел в виду, что можно было оставить преимущество для рефлексии и мешать поля со свойствами синтаксически.
Нет причин, требующих использовать свойства. Делай как нравится. В C++ времён моего универа, вроде бы свойств и не было, и все так и делали, писали геттеры и сеттеры.
>Я имел в виду, что можно было оставить преимущество для рефлексии
ты щас про какой язык то говоришь. в шарпе поля и свойства синтаксически равны только для клиента - так клиенту и не нужно знать к чему он обращается. Аж никогда.
это классу нужно свойство чтобы можно было влепить туда сеттер и геттер который что то делает
тут вопрос "а зачем нужны поля, ну оставили бы одни свойства" - ну поля это все таки поля. к ним вызов другой, а не как к методам со всеми вытекающими
Спасибо, познавательно.
В глаза ебусь.
позволяет унифицировать работу с набором байт где бы они не находились реально - в массиве, на стеке, в анманагед не опускаясь в ансейф
В основном сахар.
Часто используются для сериализации всяких JSON строк. Забабахал дефлотный { get; set; } и забудь про этот DTO объект.
Ещё очень удобно использовать для read-only данных. Через функцию можно напихать любого кода, который может переписать значение переменной. Но если у тебя у свойства только { get; } то записать тебе туда после инициализации класса ничего не получится.
И есть еще всякие { get; private set; }
В общем удобно. Тошнило от написания такого же функционала в Жаве.
в WPF есть биндинги на свойства. Например тут мы биндимся на свойство и привязка работает в обе стороны
...Text={Binding PropertyName, Mode=TwoWay}
А в случае методов что?
...Text={Binding getPropertyName, Mode=TwoWay}
стоп стоп. какой гет. это двухсторонняя связь. семантика в жопе
Завяжемся на имя бэкендфилд? так оно приватное и его вообще может не быть.
ну ладно пусть будет конвенция типа PropertyName это значит искать 2 метода компилятору гетPropertyName и сетPropertyName
компилятор же можно научить? можно.
А если захотим методы вида сетPropertyName но с перегрузками, это ж методы почему бы не иметь такую необходимость - а вот нечего хотеть
ишь ты хотят они
далее есть Fody который в свойства вписывает вызов INotifyPropertyChanged ну чтобы ручками не писать. Он то знает где свойства чтобы в них вписывать
а с методами он должен угадывать что метод вида сетФу(бла, бар) это именно сеттер, а не просто метод в который лезть нельзя
ну можно аннотацию добавить да
А можно просто использовать настоящее свойство, как точка где собрано в куче имя и геттер и сеттер и сущность свойство для рефлексии, чтобы не гадать, ну и писать коротко, когда сеттеры и геттеры еще не нужны
Больше кода - меньше кислорода.
Все перевел на DateTimeOffset
Что делать с таймзонами оффсетами в следующих случаях?:
1. Приходат дейттам с оффсетом/таймзоной - все гуд, сохраняем как есть.
2. Приходит дейттайм БЕЗ оффсета/зоны - шо робить? По умолчанию сериализатор ставит оффсет рантайма. Это норм? Можно ли настроить, чтоб ставил конкретную зону в разных случаях,
>Это норм?
Зависит от приложения.
>Можно ли настроить, чтоб ставил конкретную зону в разных случаях,
Можно. Указав в настройках десериализации, либо написав свой конвертер для свойства с временем.
@if (File.Exists(System.IO.Path.Combine(env.WebRootPath, "images", Model.ImageName)))
{
<img src="/images/@Model.ImageName" />
}
Очевидный словарь вида string,bool если файл есть, то ключ будет возвращать правду, если нет то ложь
Но надо будет поддерживать валидность тогда.
Что-то типа https://stackoverflow.com/questions/23459715/use-filesystemwatcher-in-asp-net
Или через IFileProvider, если кор.
А вообще - и так неплохо, разве что вынести логику в контроллер и использовать IFileProvider
>Можно. Указав в настройках десериализации
Как? Не нашел такого кейса. Такое ощущение, что никто вообще не парится о дейтаймах без тамзоны и всегда ожидают с...
var settings = new JsonSerializerSettings()
{
DateParseHandling = DateParseHandling.DateTimeOffset,
DateFormatHandling = DateFormatHandling.IsoDateFormat,
DateTimeZoneHandling = DateTimeZoneHandling.Utc
};
Вот так, например.
Суть в том чтобы убрать лишнее обращение к жесткому диску, так как это дорогостоящая операция, дешевле читать из памяти.
У IFileProvider есть вотчер. И походу он кеширует, надо уточнить.
Потому что есть кодстайл, по которому у тебя в принципе не должно быть полей торчащих наружу, и ты вызывая Point.X=abcd понимаешь что вызываешь метод Point.Set_X(abcd).
Зачем оно нужно, затем чтобы не заставлять программистов кучу копипастного кода писать, т.к. в 95% случаев у тебя свойство будет prop{get;set;} и миллион строчек с Get/Set_Prop просто забивают кодовую базу. Посмотри проект на джаве какой-нибудь, для сравнения, очень весело продираться через 500 строчек геттеров-сеттеров, к логике особенно если долбоеб их никак не группировал, а херачил как попало по мере необходимости.
Ну и да, тебя почему-то не удивляет то что в C++ у тебя оператор битового сдвига используется для манипуляции с потоками, как-то живут и ничего. Иди в С++ тред поплачь о том, что ты вот ожидаешь что будет битовый сдвиг, а там пидоры писавшие стандартную библиотеку переопределили его и теперь ты вот не можешь хелловорлд написать.
Смотрите, я делаю консольное приложение. Хочу чтобы там можно было использовать комбинации клавишь, типа Shist+Ctrl+C - скопировать строчку целиком в позиции курсора, alt+стрелочка - передвинуть строчку в направлении стрелочки ну и т.д. Так вот, я чет не понимаю, есть ли способ это реализовать стандартными средствами работы с консолью в .net или таки придется пилить свою абстрактную клавиатуру и в ней реализовывать все это? Не очень сложно, но просто я опасаюсь что оно будет конфликтовать с тем что в стандартной либе есть. Может быть проще в данном случае отказаться от шарпа и херачить на чем-то другом, например плюсах?
Конечно не робит, потому что offset в JSON строке не указан. Читай документацию и разбирайся, мне лень тебе разжевывать.
Ты совсем тупенький? Как по твоему программа должна узнавать какой часовой пояс тебе нужен, если в JSON строке он не указан? Если тебе нужен всегда один offset то ты либо можешь написать свой конвертер для данного свойства, парся строку с использованием конструкции вида: DateTimeOffset.Parse(reader).ToOffset(TimeSpan.FromHours(нужное тебе смещение));
Либо использовать перечисление DateParseHandling.None и парсить дату из строки уже после десериализации. Можно отдельное свойство сделать которое будет возвращать тебе DateTimeOffset дату из строки-свойства.
>Ты совсем тупенький?
Почему обижаешь? Неужели я так неясно сформулировал вопрос?
>Как по твоему программа должна узнавать какой часовой пояс тебе нужен, если в JSON строке он не указан?
> Можно ли настроить, чтоб ставил конкретную зону в разных случаях
Возможно, тут было не понятно в каких случаях, имел ввиду явно указать офсет при десериализации, да.
Значит тебе конвертер нужен и аттрибут JsonConverter(typeof(тип твоего конвертера))
>Неужели я так неясно сформулировал вопрос?
Я тебе изначально решение в первом же ответе дал, но ты даже не хочешь пробовать, ты будто ждёшь что тебе готовое решение выкатят.
Ты посоветовал сеттинги и конвертер. Сеттинги я и сам дрочил до этого - ничего не получилось. Я и уточнил.
А конвертер да, не хотелось так заморачиваться.
Ок, пасиба в общем.
В принципе, я могу просто надеяться на рантайм, что он в ЮТС будет и все будет чикипуки...
Нормально же спросил, чего ты такой злой.
Есть где-то ".cs"-файл, который позволяет шифровать-дешифровать данные,
а также подписывать - эти данные (а не только их хэш),
и данные произвольной длины,
при помощи RSA-ключей (одного ключа - приватного, а другого ключа - публичного)?
Мимо глянувший на описания дефолтных методов работы с RSA, и безуспешно пытавшийся что-то с этим сделать.
Я совершенно не ньюфаня, просто предоставляется возможность полностью погрузиться в одну из платформ, но внятной и глубокой информации по этому выбору нет (везде что-то поверхностное).
Есть у кого интересные мысли по поводу той или иной технологии, любое мнение будет полезно.
Так и не понял чего ты хочешь. Исходники библиотеки стандартной открыты.
Вот можешь смотреть сколько хочешь.
https://referencesource.microsoft.com/#mscorlib/system/security/cryptography/rsa.cs
Если там нет чего тебе надо - допили.
Ну, я вот ньюфаня.
Так вот, мое мнение.
Зависит от того где стек применяться будет.
Если это мобилки, то я бы все равно выбрал Java+kotlin, потому что при всех историях о том что net.core+Xamarin пригоден для реальной разработки, оно не совсем так, потому что комьюнити для мобилки на .net милипиздрическое -> ответов на тупые вопросы и нормальной поддержки от тех кто сторонние библиотеки пилит - хуй няйдешь. Банально, я 2 года назад вынужден был на xamarin.forms пилить приложение, так вот, заказчик хотел treeView, и этой простой хуйни нет из коробки, чтобы запилить ее так чтобы она и на андроидах и на ios выглядело нормально, потребовалось в разы больше усилий, чем если бы просто 2 проекта паралельных делалось, просто потому что хуй найдешь готовые решения(тогда даже ебучий синкфьюжн не сделал еще этого). Вооооот. И там такой хуйни навалом было. Еще и баги самого Xamarin, о, а как заставить это одинаково на андроиде и IOS выглядеть - да хуй знает, будет смотреться как говно инородное. А если не формы, то это фактически не особо отличалось бы от нативной разработки, только работало бы все хуже и единственный плюс это язык. В общем, для мобилок - 2 года назад Xamarin был хуетой, ХЗ как сейчас, с того времени не работал с ним. А вот с Java на мобилках покодил и блядь, ну серьезно, я чувствую себя ебанатом из-за того что изначально согласился на Xamarin, надо было продавливать нативную разработку, но это была первая работа и я не знал что можно так.
Веб - тут примерно одинаково. Выбирай по принципу что больше нравится. Как по мне для веба asp.net (core) охуенная хуйня. Все есть из коробки, то чего нет ставится парой нугетов, на любой вопрос ответ за 2 секунду гуглится, кестрел охуенен, ненси тоже, примеров - жопой ешь, майки еще и за эти годы исправились и теперь у них более-менее нормальная документация и примеры, а не как раньше: Console.WriteLine - печатает строку в консоль.
Декстоп. Если онли винда, то .net(core) будет получше(все есть, xaml - охуенно, все новые фишечки тебе завозят, короче ляпота). Если предполагается что гуй будет еще и на линуксах-хуинуксах, то тут как с замарином, оно вроде как есть, а по факту хуйня и больше боли вызывает и, наверное, Java окажется опять лучше, хотя я кроссплатформу на Java на писал, потому хуй знает, может быть и у джавы там не все так хорошо.
Если какие-то служебные утилиты, типа сервисов и консольных штук, то тут как с вебом, и там и тут все есть. Тут выбирай сердцем, кек.
Что еще может такой нуб как я сказать-то? А хуй знает. Юнити я в расчет не взял, юнити позволяет решать проблемы что есть у замарина, но это оверкилл по мнению многих, однако, как по мне, это единственный нормальный способ без лишних телодвижений заставить приложение выглядеть более-менее одинаково на всех платформах, не тратя кучу времени.
Воооот. Но я нуб, который всего 3 года опыта работы имеет, можно не брать мое мнение в расчет.
Ну, я вот ньюфаня.
Так вот, мое мнение.
Зависит от того где стек применяться будет.
Если это мобилки, то я бы все равно выбрал Java+kotlin, потому что при всех историях о том что net.core+Xamarin пригоден для реальной разработки, оно не совсем так, потому что комьюнити для мобилки на .net милипиздрическое -> ответов на тупые вопросы и нормальной поддержки от тех кто сторонние библиотеки пилит - хуй няйдешь. Банально, я 2 года назад вынужден был на xamarin.forms пилить приложение, так вот, заказчик хотел treeView, и этой простой хуйни нет из коробки, чтобы запилить ее так чтобы она и на андроидах и на ios выглядело нормально, потребовалось в разы больше усилий, чем если бы просто 2 проекта паралельных делалось, просто потому что хуй найдешь готовые решения(тогда даже ебучий синкфьюжн не сделал еще этого). Вооооот. И там такой хуйни навалом было. Еще и баги самого Xamarin, о, а как заставить это одинаково на андроиде и IOS выглядеть - да хуй знает, будет смотреться как говно инородное. А если не формы, то это фактически не особо отличалось бы от нативной разработки, только работало бы все хуже и единственный плюс это язык. В общем, для мобилок - 2 года назад Xamarin был хуетой, ХЗ как сейчас, с того времени не работал с ним. А вот с Java на мобилках покодил и блядь, ну серьезно, я чувствую себя ебанатом из-за того что изначально согласился на Xamarin, надо было продавливать нативную разработку, но это была первая работа и я не знал что можно так.
Веб - тут примерно одинаково. Выбирай по принципу что больше нравится. Как по мне для веба asp.net (core) охуенная хуйня. Все есть из коробки, то чего нет ставится парой нугетов, на любой вопрос ответ за 2 секунду гуглится, кестрел охуенен, ненси тоже, примеров - жопой ешь, майки еще и за эти годы исправились и теперь у них более-менее нормальная документация и примеры, а не как раньше: Console.WriteLine - печатает строку в консоль.
Декстоп. Если онли винда, то .net(core) будет получше(все есть, xaml - охуенно, все новые фишечки тебе завозят, короче ляпота). Если предполагается что гуй будет еще и на линуксах-хуинуксах, то тут как с замарином, оно вроде как есть, а по факту хуйня и больше боли вызывает и, наверное, Java окажется опять лучше, хотя я кроссплатформу на Java на писал, потому хуй знает, может быть и у джавы там не все так хорошо.
Если какие-то служебные утилиты, типа сервисов и консольных штук, то тут как с вебом, и там и тут все есть. Тут выбирай сердцем, кек.
Что еще может такой нуб как я сказать-то? А хуй знает. Юнити я в расчет не взял, юнити позволяет решать проблемы что есть у замарина, но это оверкилл по мнению многих, однако, как по мне, это единственный нормальный способ без лишних телодвижений заставить приложение выглядеть более-менее одинаково на всех платформах, не тратя кучу времени.
Воооот. Но я нуб, который всего 3 года опыта работы имеет, можно не брать мое мнение в расчет.
>...можно не брать мое мнение в расчет
Зря, хорошее мнение и опыт, мне было интересно. Благодарю.
интересно как ты с жавакотлином собрался под иос кодить )
А про "выглядеть одинаково" тем более. Одинаково выглядят только вебприложухи. А хамарин он же нативные контролы под капотом юзает.
>>811330
В плане удобства хамл на голову выше стоит того пиздеца что городишь в андроид (а то и на 3 головы). но хамарин сыроват. там еще много багов которые нужно править. В андроид только с их aac (архитетуре компонентс которые) и котлином стало удобоваримо. Товарища выше от жавы почему то не тошнит, стойкий товарищ )
для веба асп.нет (коре) имхо удобнее
ну а для десктопа - божественный хамл
но да. с линуксом только авалония, а оно не родное.
лично я под андроид предпочитаю котлин, в остальном шарп
Если хочешь мобилки или энтерпрайз, то джава.
В последнем можешь встретиться с жутким легаси и анальными ограничениями на работах. Если банк, то могут попросить пройти полиграф, будут строго следить за тем, что ты делаешь, могут ограничивать интернеты и не давать самому ставить нужный софт. Слышал, что где-то даже заставляли сотрудников соблюдать дресс-код. Но платят неплохо.
Но это не так важно. Если хочешь вкатиться на работу, то смотри, что популярнее в твоем городе. Там, где я сейчас живу, вакансий джавы в 1.5-2 раза больше шарпа.
А в родном мухосранске наоборот, примерно 1-2 на джаве и 10-15 на шарпе.
1.Эндрю Троелсен, Филипп Джепикс - Язык программирования C# 7 и платформы .NET и .NET Core.
2.Джозеф Албахари - C# 7.0. Справочник. Полное описание языка.
3.Роберт Мартин - Принципы, паттерны и методики гибкой разработки на языке C#.
4.C# 8.0 and .NET Core 3.0 – Modern Cross-Platform Development Fourth Edition.
5.Бен Уотсон - Высокопроизводительный код на платформе .NET.
6.Роберт Мартин - Чистый код.
7.Что-то по работе с базами данных.
8.Что-то по алгоритмам и структурам данных.
9.Что-то по работе с git.
10.Стив Макконнелл - Совершенный код.
11. Роберт Мартин – Идеальный программист.
Советую почитать какой-нибудь максимально короткий гайд по языку, за пару вечеров, типа метанита.
А дальше ставить себе задачи и решать их, изучая по ходу официальную документацию, стековерфлоу и т.п.
Практика - 80%, теория - 20%.
Толсто
>советую как можно меньше читать, и находить ad hoc решения на stackoverflow
Отличный совет. Макака готова.
>чистый код, что-то по базам данных, алгоритмам, git
>6+ язык
Вытекаешь. Никто и не говорит что для 6 языка нужно заново изучать информатику. Видно же что он только вкатывается.
NET 5 - новая версия кора, из Framework туда особо ничего нового не переносили напрямую. Все дальнейшие усилия по разработке будут направлены на NET 5. Назвали его так - чтоб оказать, что он уже может примерно все, что мог Framework, чтоб избежать путаницы с .NET Core 4 vs .NET Framework 4, чтоб избавится от дополнительного слова в названии (Core), поскольку это единственный актуальный фрейморк.
Скажем, вот я работаю с EF, правильно ли я понимаю, что если я объявлю модель рекордом, то ничего там менять не смогу и чтобы внутри контекста было изменение я должен буду явно вызвать апдейт в который передам новое значение? Просто если так, то там же куча всего должно поломаться, т.к. на текущий момент будет кинуто исключение что объект с этим ID захвачен контестом и ссылки не совпадают.
Ладно, не для EF, наверное для каких-то общих ДТОшек получается, типа запрос регистрации с данными для регистрации? Я правильно понял? Но ведь опять же, а в чем смысл? Ну да, я не изменю свойств пришедшего объекта, но если у меня регистрация это сервис, который просто принимает данные для регистрации в виде простых типов и отдает результатом составной объект с данными для клиента, то я все равно могу, в теории попортить то что пришло, просто достав строку из рекорда и что-то с ней нехорошее сделав, а переписывать сервисы на рекорды ну, тоже зачем, эти сервисы кочуют их проекта в проект и логика там не меняется кучу лет уже как.
В общем, я не против этой фишки, но не совсем понимаю область ее применения, может быть кто-то объяснит тупому, зачем оно надо вообще?
Если да, то приблизительно как это делают?
Создаешь проект типа netstandard и пилишь свою либу.
Сравнивал, тесты по производительности делал, в проде в огромных приложениях использовал. Заявляю: "Лучше пока не придумали" - это вкусовщина.
Нет, они выкинули framework, выкатили следующий релиз кора, назвали его просто дотнетом и сказали: готов!
Всё это уже и так есть в .NET Core 3. Ещё одно отличие .NET 5 в том, что туда добавят Xamarin (сейчас он отдельно от Кора).
>запустить
тебе точно либу, а не исполняемый файл?
dotnet new classlib -n mylib
cd mylib
dotnet build
Можно сделать self-contained сборку, чтобы дотнет устанавливать не пришлось.
dotnet publish --self-contained true --runtime ubuntu.18.04-x64
Селфконтейнер сборка - хуйня. В некоторых случаях она все ломает нахуй. Например, если тебе нужно запилить демона, который на винде будет как виндовый сервис работать. Винда это время распаковки считает будто сервис не отвечает вовремя на запрос и вырубает к хуям. Такие вот дела.
С чем сравнивал то?
Вот тебе сравнение:
https://docs.microsoft.com/en-us/dotnet/standard/serialization/system-text-json-migrate-from-newtonsoft-how-to
Больше половины функционала не поддерживается и предлагаются использовать костыли, а для чего-то даже костылей нет.
Newtonsoft самая популярная библиотека, использовать что-то другое будет человек, который хочет показать всем "смотрите, я не самое популярное решение использую, я не такой как все!".
Читаю тред, не понял что такое Net 5, Net 4, фраемворк. Это типо расширения для языка? Или что? Можете объяснить незнающему.
Это набор стандартных библиотек разных версий.
Не правильно сказал, именно либы имел ввиду. Но спасибо за пример, интересный вариант тоже.
В общем, достижимо ли создать на шарпе встроенный веб сервер (portable)?
Сам сервер нужен для скачивание статических файлов по http, с какими-то предварительными настройками (запустил файл, дал ссылку человеку, потом закрыл). Можно ли с какой-нибудь сборкой kestrel или другим сервером сделать подобное, с "--self-contained"?
Веб и консольные приложения нормально запускались.
А почему демон во время запроса распаковывается? Процесс же уже запущен должен быть.
Популярное не всегда значит "самое лучшее". То что там в списке помечено как "не поддерживается" или "имеется свой вариант" либо очень редко используется, либо в дефолтной библиотеке просто используется по другому.
Aspnetcore и куча библиотек к нему по умолчанию System.Text.Json используют, и чтобы подключить Newtonsoft иногда приходится кучу телодвижений сделать. Но по большей части это дело вкуса. У нас в команде много кто новой библиотеки вообще ещё не видел и тащат Newtonsoft просто потому, что не вкурсе альтернатив.
Newtonsoft проигрывает в производительности, особенно на больших объектах и на хайлоаде.
Двачую, практика — лучший учитель.
А маняпаттерны всякие, это знание из разряда изобразить 10 типов сортировок, которые нужны в основном чтобы проходить собеседования.
Точно, забыл про него совсем
>либо очень редко используется, либо в дефолтной библиотеке просто используется по другому.
Вот тебе два примера:
>Newtonsoft.Json can serialize or deserialize numbers represented by JSON strings (surrounded by quotes).
В Text.Json тебе к каждому такому свойству нужно будет прикручивать отдельный конвертер и указывать его в атрибутах.
>Newtonsoft.Json accepts non-string values, such as a number or the literals true and false, for deserialization to properties of type string.
Тоже самое - отдельный конвертер. Хотя довольно часто встречаются ситуации когда тебе вместо строки приходит false или свойство может быть либо числом, либо строкой.
>Newtonsoft проигрывает в производительности, особенно на больших объектах и на хайлоаде.
Нет ни одного нормального бенчмарк. Все они используют самый примитивный функционал, даже не удосужившись прочитать вот этот раздел:
https://www.newtonsoft.com/json/help/html/Performance.htm
+ Text.Json не поддерживает поля, т. е. даже для простейшего DTO тебе нужно будет создавать объект с свойствами, что скажется на дальнейшем его использовании так как вместо быстрого считывания поля ты получишь вызов метода.
В итоге и здесь стандартное решение сосёт, а всего лишь нужно прочитать документацию и оптимизировать самые нагруженные участки кода.
>Нет ни одного нормального бенчмарк. Все они используют самый примитивный функционал
вернее базовый. И ньютонсофт ясен пень хуже в скорости работы и в аллокациях, но лучше по фичам.
Кому что важно, тот нужное и выбирает. System.Text.Json тоже не самый шустрый. Он просто искаропки и там есть документ модел
System.Text.Json создавался как "меньше фич, зато быстрее + блазор". Потому там даже аттрибуты свои
>DTO тебе нужно будет создавать объект с свойствами, что скажется на дальнейшем его использовании
ну это уже экономия на спичках серьезно. В dto то экономить ))) это нихера не hot path
> вместо быстрого считывания поля ты получишь вызов метода.
> В итоге и здесь стандартное решение сосёт
Плюсую. У меня на работе есть один евангелист Text.Json, который чмырит Newtonsoft и старается отовсюду его убрать доубирался настолько что поломал код, потому что в некоторых классах были поля, а не свойства. Хорошо, что проект был нерабочий, и мы его только пилим перед запуском. Пообещал выкинуть отсюда, если он додумается сделать тоже самое на другом проекте, который отвечает за огромнейшие деньги
правильно делает. понапривыкли делать софт который жрет тонны памяти и еле ползает
Что не так? Самый главный язык для разработчика - английский. Его в любом случае на практике надо осваивать. Хоть даже и на стековерфлоу
В этом то и суть. Первый язык программирования практически ни на что не влияет в среднесрочной перспективе. В качестве первого языка программирования можно учить все что угодно, как угодно.
В шепутиарий
> хуже в скорости работы и в аллокациях
В том и дело, что не хуже, если писать столько же кода, сколько ты пишешь в Text.Json, просто в случае с ньютоном это будет код для оптимальной работы, а в случае с Text.Json это будут конвертеры и другие воркэраунды для функционала который в нём отсутствует.
>ну это уже экономия на спичках серьезно
Также можно и назвать твой базовый функционал и использование Text.Json, да и вообще любую оптимизацию.
>если писать столько же кода
одинаково пишу. При переходе разницы не заметил.
>использование Text.Json, да и вообще любую оптимизацию
не стоит утрировать и сравнивать реально полезную оптимизацию и экономию на спичках
Сколько можно сэкономить сменив жсон либу? Можно очень сильно разгрузить GC и это очень заметно при нагрузке. Да и памяти поменьше в несколько раз
А экономия замены свойств на поля в дто (задача которых переносить инфу, а не быть основными деталями жестких алгоритмов) - 0.000001%?
>Сколько можно сэкономить сменив жсон либу?
Тебе же уже сказали - нисколько.
Достаточно выполнять рекомендации стандартной документации:
https://www.newtonsoft.com/json/help/html/Performance.htm
>Тебе же уже сказали - нисколько.
это фантазеры сказали. Реальность говорит иное
>Достаточно выполнять рекомендации стандартной документации:
Ну вообще то там написано очевидное (про раздел "разбирайте руками" я вообще промолчу)
и с этими рекомендациями либа грузит GC больше чем аналоги (а почему бы не грузить если эти рекомендации вообще GC не касаются, а рекомендация "не грузите жсон строку в память" вообще не считается за мусор который делает либа)
А вообще что говорить. Берем первый попавшийся бенч и сравниваем ньютон и мою любимую в плане скорости SpanJson (System.Text.Json похуже будет, а SpanJson побогаче по фичам и быстрее всех)
первый прогон
Newtonsoft: скорость 1 аллоцировано 34.16 MB
спанжсон: скорость 0,24 аллоцировано 5.46 MB
разницу в памяти и скорости видишь?
читаем те рекомендации. ручной разбор, не хранить жсон в стринге, конвертеры это не к нам. но вот контрактрезолверы да
у нас var serialized = JsonConvert.SerializeObject(element);
что непорядок судя по советам
делаю в тесте контракт резолвер (прямо из советов) и пропихиваю его
var serialized = JsonConvert.SerializeObject(element, _jsonSerializerSettings);
и запускаю.
я тут ожидал что будет лучше но стало хуже
Newtonsoft: скорость 1 аллоцировано 49,72 MB
спанжсон: скорость 0,20 аллоцировано 5.46 MB
>Тебе же уже сказали - нисколько.
это фантазеры сказали. Реальность говорит иное
>Достаточно выполнять рекомендации стандартной документации:
Ну вообще то там написано очевидное (про раздел "разбирайте руками" я вообще промолчу)
и с этими рекомендациями либа грузит GC больше чем аналоги (а почему бы не грузить если эти рекомендации вообще GC не касаются, а рекомендация "не грузите жсон строку в память" вообще не считается за мусор который делает либа)
А вообще что говорить. Берем первый попавшийся бенч и сравниваем ньютон и мою любимую в плане скорости SpanJson (System.Text.Json похуже будет, а SpanJson побогаче по фичам и быстрее всех)
первый прогон
Newtonsoft: скорость 1 аллоцировано 34.16 MB
спанжсон: скорость 0,24 аллоцировано 5.46 MB
разницу в памяти и скорости видишь?
читаем те рекомендации. ручной разбор, не хранить жсон в стринге, конвертеры это не к нам. но вот контрактрезолверы да
у нас var serialized = JsonConvert.SerializeObject(element);
что непорядок судя по советам
делаю в тесте контракт резолвер (прямо из советов) и пропихиваю его
var serialized = JsonConvert.SerializeObject(element, _jsonSerializerSettings);
и запускаю.
я тут ожидал что будет лучше но стало хуже
Newtonsoft: скорость 1 аллоцировано 49,72 MB
спанжсон: скорость 0,20 аллоцировано 5.46 MB
Ты можешь использовать HttpListener если совсем по-простому. Можешь сделать и на Nancy или Asp.Net - гугли self-hosted Nancy/ self-hosted Asp.Net. Первая и использует HttpListener под капотом, на счет второго - не знаю.
Я с упаковкой дела не имел, но оно наверняка должно работать и упаковано.
Так ты бы сразу и сказал, что речь о бенчмарках, а не о рабочем коде. Потом такие клоуны пишут продакшн код, пилят костыли к своим "в бенчмарках результат лудше!!" и на выходе получают результат в разы хуже, как по читаемости кода так и по его производительности.
Ты точно с ответом не промахнулся?
Пиздабол. Только недавно делал сервис под винду на основе worker. Добавляешь nuget пакет, windows service или как-то так, и все работает
Но я сам могу спиздеть, так как запускал на той тачке, где уже стоял рантайм. А так – служба была сингл-файлом из-за чего пришлось подпердолить конфигурацию, так как appsettings.json я хотел иметь в корне с программой, а не в недрах temp, куда по-настоящему распаковывается этот сингл-файл. Служба устанавливается командой в консоли, потом все работает в штатном режиме
>Так ты бы сразу и сказал, что речь о бенчмарках, а не о рабочем коде
ааа ясно. ЭТА ДРУГОЕ (С)
заменить свойства на поля - оптимизация. А заменить либу жсон которая при большой нагрузке СИЛЬНО ЗАМЕТНО экономит память и GC меньше дергается - да какая то это оптиизация )))
ясно все с тобой
кестрел это просто либа, а именно простенький сервер. как и хттплистенер, только более оптимизирован
ты можешь просто их запустить без обвязки асп.нет
а асп.нет даст тебе роутинг, чтобы ты сам не разбирал урлы, биндинг чтобы ты не парсил тело запроса и так далее
то есть ты можешь использовать хоть хттплистенер но получишь ты просто обьект реквест и дальше сам разбирай что тебе с ним делать.
хочешь удобно чтобы метод написал, аттрибут навесил сверху и оно зароутит и забиндит - бери либо асп.нет либо любые другие велосипеды
я вот как то тупанул глядя на то что асп.нет такой тяжелый в оперативе, подкинул туда хттплистенер и ничего
и тогда написал полноценный роутинг для хттплистенер по типу асп.нет коре
но тебе рекомендую взять асп.нет коре и хостить как локальный сервер и не парить мозг
Ну дык я так же делал и как раз на основе воркера. Нужно было маленький Http-сервер в виде виндового сервиса замутить. Так вот, самому хотелось в виде одного файлика, потому что ну красивше же, чем эти миллиард dll, а вот хуй, одним файликом сервис в винде не отзывался на запрос и постоянно стопался типа сервис не ответил, я даже лайвтайм и прочее сделал чтобы оно максимально на классическую службу было похоже. Почти два дня бился, а потом забил и оставил с кучей dll'ок и работало нормально. Я ХЗ что я упустить мог, но просто обидно, потому что сам хотел чтобы сервис был одним экзеншником + настройки.
>СИЛЬНО ЗАМЕТНО экономит память и GC меньше дергается
Так ты показывай проект с newtonsoft и этот же проект с аналогом, а потом сравнение работы с JSON'ом, а не твои тесты высосанные из пальца.
>заменить свойства на поля - оптимизация.
Это обычный пример того, что не всё так очевидно как тебе кажется. Функционала у newtonsoft больше, очевидно что если использовать все настройки по умолчанию, то и работать он будет не так быстро как аналоги с необходимостью пилить свои велосипеды. При этом в данном случае этот функционал даже велосипедами не добавляется, т. е. вызов метода вместо считывания поля у тебя будет в любом случае, хочешь ты того или нет, вот и спрашивай себя потом, сколько раз ты наступишь на подобные грабли прежде чем поймешь, что лучше бы ты проверенное временем решение использовал, а не вёлся на бенчмарки для даунов.
>Так ты показывай проект с newtonsoft и этот же проект с аналогом.
идиотская просьба. где я тебе в опенсорсе найду один и тот же проект под 2 разные либы
такие проекте в опенсорсе называются разве что бенчмарк
а приватные я тебе показывать не буду, а на слово ты мне и не поверишь. тебе и бенчи не доказательство. Ты уперся "у меня все хватает". так блин сделай нагрузку побольше чтобы уперлось в GC и тогда уже можешь толкать тезисы, или они будут о том что "насяльника давай памяти добавим, да и вообще проц мощнее нужен"
>Функционала у newtonsoft больше
я выше четко писал что кому то фишки, другим скорость.
и лично мне никакие особые фишки не нужны. Я даже не в курсе че там может быть такого особенного, что очень нужно и нигде нету. У меня задача преобразоывать жсон в структуры и обратно. Я хз че как вы там изголяетесь еще.
>т. е. вызов метода вместо считывания поля у тебя будет в любом случае
ты вообще о чем? ты все про свойство против поля в дто? спанжсон умеет в поля
но я в очередной раз повторюсь что выгода от этого просто минимальна потому что дто которые приходят из жсон или уходят в жсон в 99.99999% случаев не учавствуют в hot path, где эта замена была заметна даже под электронным микроскопом.
>>812758
смотря что ты понимаешь как ембедед. если у тебя десктоп прила и ты такой "хочу чтобы открыть порт и там вебсервис еще и вот можно ли асп.нет коре сделать чтобы он не был в центре всего приложения, а просто как сервис внутри моей прилы". то да можно
>где я тебе в опенсорсе найду один и тот же проект под 2 разные либы
Представь себе, люди переписывают код под другие либы с целью оптимизации. Почему ты не можешь найти примеров с ньютонсофт и аналогами? Правильно, потому что при правильном использовании ньютонсофт оказывается либо таким же, либо лучше по скорости чем аналоги.
Ембеддед обычно говорят когда веб-сервер встроен в приложение (микросервис). Ты запускаешь, поработал, выключил.
Такое достижимо с asp.net?
>Представь себе, люди переписывают код под другие либы с целью оптимизации
в опенсорсе? нахера им это. опенсорс это всего лишь код
это просто код просто код. просто код который код.
никто и никогда в опенсорсе ничего подобного не перепишет ибо у авторов нет таких проблем которые есть у хайлоада. это пробелмы хайлоада и вот они и переписывают у себя.
разве пхп переписали под фейсбук и вк? или это фейсбук и вк переписали под себя пхп? Разве кто то переписывает гитлаб с руби на что то более шустрое?
Те, кого это коснулось, в нашем мире просто докупают железо. Ибо железо дешевле программистов. А те, у которых железо уже дороже чем "переписать" - вот те и переписывают.
ньютонсофт может быть "не оказывает весомую нагрузку чтобы оно стоило того чтобы тратить время деньги на его замену"
но говорить что он быстрее....
>>812792
>Такое достижимо с asp.net?
да. его можно запустить как тот же хттплистенер и погасить без var host = new WebHostBuilder() который заблочит поток.
Точно можно. Я даже видел как. Я даже сам запускал. Я даже записал. но блин найти не могу ааааааа
Мне практически ни для чего не надо, я просто любопытный.
А в инете хрен найдешь. А так кто то из этих знатоков то ли toub то ли еще кто то вроде на гитхабе показал как
я случайно нашел
а щас не могу найти даже в инете
А я его уже попробовал.
>PE file does not contain any managed metadata.
Оно и логично, ведь это не библиотека, а тупо ряд объектов с внутренностями. Может, нужно попердолить заголовок чтобы он походил на PE?
Как уже сказали и сам Kestrel (web server for dotnet) и Aspnetcore - это просто либы.
Если у тебя есть веб проект
dotnet new web --name WebApp
Компилишь его под что угодно и добавляешь сам дотнет в сборку
dotnet publish --self-contained true --runtime ubuntu.18.04-x64
Запускаешь приложение на Debian-like линуксовом дистрибутиве
./WebApp
У тебя запустился веб сервак на машине, на которой дотнет может быть даже не установлен, и готов принимать запросы.
Вторая пикча почему-то отклеилась.
У нас есть тесты нагрузки, когда реальную систему бомбят 2-5к виртуальных юзеров (открывают браузеры на куче машин, щёлкают по кнопочкам, вводят текст в формочки). Перевели с Newtonsoft на System Json и нагрузка упала (не в разы, но заметно). Никакой старшной логики не было. Стандартные serialize/deserialize.
dotnet publish -c Release -r win-x64 -p:PublishSingleFile=true --self-contained true
Он куда-то распаковывает при старте, куда непонятно, но второй запуск быстрее
>Пeревели с Newtonsoft на System Json
А дoстaточно было сделать сeриализацию/дeсeриализацию напрямую из потока + в самых нагруженных местах добавить ручную дeсeриализацию/сeриализацию. Вот я про это и говорю, мaкaки смотрят на говнобeнчмарки и бегут всё скорее переписывать, вместо того чтобы почитать документацию к инструменту который они уже используют.
>сeриализацию/дeсeриализацию напрямую из потока
а если оно УЖЕ из потока в поток то куда поточить еще?
Хватит держать всех вокруг за идиотов, особенно тех, у которых реальная нагрузка
>в самых нагруженных местах добавить ручную дeсeриализацию/сeриализацию
то есть в итоге ВЕЗДЕ
норм ага.
нормальная такая оптимизация - парсить вручную ))))
>нормальная такая оптимизация - парсить вручную ))))
Нет, лучше переписать всё на новую либу, потратив в 10 раз больше времени)))
>Нет, лучше переписать всё на новую либу, потратив в 10 раз больше времени)))
Ну если у тебя безумные жсоны с которыми ты работаешь в полуручном режиме из-за их безумия то да
проссал проблему, там просто куча объектов на друг друге, а поток обрабатывает только первый.
Вот только с последним намечается проблема
Ты наверняка какой-то старый хуй, который командует какой-то тимой в своей конторе, у которого все приложения висят по 1-10 сек на любой чих и считает что это норма.
Хотя не, эту проблему решил
Любой опытный программист сначала изучает уже используемый инструмент, ищет пути его оптимизации, оценивает трудозатраты на оптимизацию и на переход к использованию другого инструмента и только после этого делает выбор между оптимизацией текущего решения и новой библиотекой.
Переписка заняла буквально 4 часа одним девом. Переезд с фреймворка на кор тоже упрощается, если используется системная либа. Но опять же - дело вкуса. Кому что больше нравится или подходит под конкретную ситуацию.
Вот эти вот вскукареки вылазят из каких то мухосрансков периодически и глобально разом за всю планету делают такие заявления. MS, GM, Amazon, Fidelity, Stackoverflow - у этих дотнет в хайлоаде используется, никто не жалуется.
Видимо для тебя это не 2+2 = 4, раз вместо того чтобы переписать код на ньютонсофте ты пишешь новый с использованием другой библиотеки.
Сказал чувак не знавший ни ситуации, ни задачи, ни условий, в которых весь проект крутился. Но который незамедлительно принёс своих осуждений. Ещё и тонко так вставил что в конторе, где крутятся сотни приложений, обрабатывающих тыщи запросов в минуту, имеется огромный состав всяких видов архитекторов, нет опытных программистов.
Человеку только дай волю, он всех вокруг заплюёт и засмеёт.
У него все норм или "ему все норм" и он думает, что у всех так и все идиоты, которые не умеют готовить ньютонсофт
Впрочем, он в итоге свел все к рекомендации "перепиши в ручной код".
Более того, если уже споткнулся о камень хайлоада и начинаешь новый проект то по его мнению "нужно все равно брать ньютонсофт, ведь потом же можно будет переписать в ручной код" )
Л - логика
>свел все к рекомендации "перепиши в ручной код"
Ты о чём?? Тут анонов 5-6 разных в дискуссии участвовало. Я не понял, на какой именно коммент ты ссылаешься.
>то по его мнению "нужно все равно брать ньютонсофт..."
Я тот чувак, которые 2+2 написал и который в новом проекте как раз ньютонсофт не взял, а использовал системную либу, потому что телодвижений меньше и всё завелось с пары пинков и не доставляет никому головной боли (ручного ничего нет).
Ты наверное в комментах запутался и начал мимо отвечать.
не не запутался. Это не ответ тебе, а дополнение к твоему коменту про чувака. я ж написал "он в итоге свел", "у него" и т.д.
я тот чувак, который основной его оппонент, который бенчи выкладывал.
Он не обязательно должен сам себя возвращать. Без возвращения делегата никак не добьешься.
dynamic test = new ExpandoObject();
test.Prop1 = 1;
test.Prop2 = 2;
Можно динамический объект как словарь определить
var test = new ExpandoObject() as IDictionary<string, Object>;
Вот ещё https://stackoverflow.com/questions/15819720/dynamically-add-c-sharp-properties-at-runtime
Написал метод для события одного из контролов. Тк метод единый, но его нужно использовать в разных формах - запихнул его отдельную библиотеку. Да, все ок работает, если вручную присваиваю(+=) свой метод к событию. Но можно как-то сделать так, чтобы мой метод из dll отображался и выбирался в конструкторе? Так было бы красиво и удобно(сразу и в одном месте видно как и какие события обрабатываются).
Ну это оптимистичная оценка. Всего 3 года плюсов. Ущерб мозгу нанесен сильный, но если постараться, то поправимо за такое время.
Ни разу в жизни не использовал (даже не знаю, как использовать) делегаты, синхронизацию, сериализацию, рефлексию и прочую хрень, о которой только и пишут на форумах.
Не написал ни одного интерфейса.
Спасает знание некоторых базовых вещей и владение SQL. Понимаю, что если контора накроется, то сосну на рынке, но пока в зоне комфорта.
> делегаты
Мне понадобились только в винформах, чтобы интерфейс дергать. Делегат использовал для события. Хотя есть EventHandler и EventArgs, но ими я не пользовался так что тоже каминаут сделал
> синхронизацию
Что имеешь ввиду? Многопоточку и асинхронность вообще?
> сериализацию
Ну данные же ты куда-то сохраняешь, с хмл поди да работал хоть на полфедора
> рефлексия
Тоже не понимал, зачем она нужна, пока не решил написать динамический фронтенд, который генерируется по ответу бекенда
До этого момента думал, что это какая-то чёрная магия, которая нахуй не нужна
Зато потом в js, где нет рефлексии, долго плевался
Может, копнуть в сторону UWP
Может, сделать свой собственный диалог. У тебя везде такие кнопки? Кажется, ты какой-то системный диалог вызываешь
А, не, обычные Button нормальные, а это MessageBox. А там никак такие же не сделать что ли?
Бамп
Единственное что это значит, что тебе учиться не у кого. Также первые 5 лет работал. Баги были нормой, запросы к БД и файловой системе по несколько секунд тоже. Но потом попал в компанию, где были настоящий архитектор и сеньоры. И у них был местный хайлоад, куча проектов с миллионом строк кода, БД с миллиардами записей в таблицах.
И оказалось что норма - это
- писать код без багов по пол года а то и больше
- полностью загружать и отрисовывать страницу с запросами ко всяким огромным БД и сторонним сервисам за <1сек
- иметь полное покрытие системы юнит и интеграционными тестами, которые на лету создают нужные сервисы и БД в памяти или на специально выделенном сервере
- выдавать несколько рабочих фич в прод за спринт
- не возвращаться к закрытым таскам
- автоматизировать the crap out of всего подряд, чтобы нажал кнопку и всё работало, а программист только тратил время на написание кода.
Учись в общем.
Я за чуть больше чем год всё это в одном пет-проекте использовал, даже страшно представить тот говнокод с которым ты работаешь.
Подруга фигачила с++ 8 лет, потом за неделю пересела на шарп. Правда она в МС работала.
Вообще такие вопросы не имеют смысла. Можно 15 лет сиплюсплюсить и быть дегенератом, который не понимает ни как ЦПУ, ни как РАМ работают, иметь постоянные утечки и хвастаться криптокодом, который он сам через неделю перестаёт понимать. Такой и в шарп 10 лет запросто въезжать будет.
Если у тебя есть хорошая база и понимание того, как компы в принципе работают, то за 2 месяца в любом языке станет комфортно.
Хотя обычные Button тоже не выглядят как стандартные. Сраный Qt выглядит нативно а виндовый WPF не выглядит.
Так с жаваскриптом было бы проще, современный язык, как и шарп. Это тебе не std::говно_говна<МоёГовно> простоЧтобыПамятьНеУтекла = std::make_говно<МоегоГовна>();
Ей богу, дали бы эти пидоры возможность к своей БД подключиться, один маленький селект и все, но нет, хуй там, мы дали открытое апи - пользуйся.
Ну да, вопрос таки касается шарпа. Может быть есть какой-то способ как-то сделать это все дело так чтобы не выходила такого пиздеца, потому что на обработку одного такого объекта может до нескольких секунд уходить, ведь все равно в том что пришло нужно еще и искать всякое и потом приводить к нужному нам виду. В общем, я хз.
>что делать
Донести до них, что они долбоебы
Так им и передай, что даже мимокрок анон с двача так считает
а так локальная база кеш, которую время от времени пополнять и с нее делать запросы. но мне кажется что ты и так пополняешь свою базу новыми данными и со своей базой потом работаешь
а значит остается одно - донести до этих долбоебов что они долбоебы
У них в АПИ никаких фильтров вообще не предусмотрено?
Для того чтобы сильно свою систему не грузить, можно свой JSON конвертер сделать, который вытащит только нужный блок из стрима.
Ну и кэшить их ответы естественно.
Нынче всё скриптуют и кодогенерируют. Руками через drag-n-drop софт разве что для демонстрации или для пет проекта делают.
Ну и вообще десктоп приложение делать в 2020 странно. Для чего-то простого есть CLI приложухи. Смысл для десктопа только если у тебя игры, работа со звуком/графикой, всякие IDE, пет проекты или древняя версия ОС.
Тем более что веб приложения сейчас двойным щелчком по исполняемому файлу могут запускаться и даже выглядеть как десктоп. Но зато сразу из коробки куча вшитого функционала и безопасность.
>Руками через drag-n-drop софт разве что для демонстрации или для пет проекта делают.
>Смысл для десктопа только если у тебя игры, работа со звуком/графикой, всякие IDE, пет проекты или древняя версия
>пет проект
Ну так как я пишу первый серьезный проект для себя - значит я все таки все правильно делаю?
Для себя можно хоть на чём учиться. Лишь бы учился. Но конкретно по твоему вопросу ничего сказать не могу, т.к. свойства объектов через UI в студии уже больше 10 лет не трогал.
Да уж лучше блять говножс, чем мегасупердуперговноxaml или упаси господь QML с его псевдожс
хамл кстати шикарен
а жс сразу идет лесом когда нужны потоки
ах да. они же не нужны
всем нужны говнокалькуляторы )
Хамл шикарен только среди остальных инструментов для десктопного гуи, потому что из конкурентов у него только винформс, qtForms, gtk++ и прости господи чистый WinAPI. есть еще электрон вроде, но он тоже на js)))) Как человек, пиливший ГУЙ на всем вышеперечисленном и на вебовских технологоиях, ящитаю, что впизду и нахуй делать UI на десктопе, просто боже упаси. Веб в разы удобнее и профессиональных живых инструментов с активным коммьюнити гораздо больше.
Каждый кулик свое болото хвалит
К нам в проект пришел опытный прогер и переписал запросы к БД, работающие секунд 15-20 так, что они стали работать за 4-5 секунд и это считалось невероятным успехом.
1644x894, 0:10
> хамл кстати шикарен
Да ну нахуй. В чем этот хамл шикарен? Бойлерплейт нечитаемый
Все думал, как в вебе такие шикарные вещи делают, пока не попробовал сам. Потом дошло, что это не веб сложный, а просто декстоп говна в жопу заливает
ты просто не вник основательно в хамл. а в веб вник, вот потому так и говоришь
открою тебе тайну - хамл это хмл и хтмл это хмл
так в чем разница в читабельности
Разница лишь в том, что они описывают. хтмл только элементы, а хамл это выражение кода в хмл
И все что не выражено в хмл выражается в коде на языке программирования. И лучше когда все находится в одном месте (хамл с нулевым code-behind) чем хтмл+лютый code-behind
ну так 2 основные концепции
EF это полноценный орм, который абстрагирует от конкретной бд и дает разные плюшки, но взамен получаешь оверхед и необходимость понимать "как бл.. выразить запрос в этом орм"
dapper же просто маппер который позволяет смапить результат SQL запроса на обьекты и потому очень быстр, но уже sql юзаешь - для тех кому не влом писать больше кода, но полный контроль над происходящим
актив рекордс в дотнете не прижился
Ну и что то среднее это Linq2Db c его linq вместо sql, ну и куча разных либ которые каждая по своему видят как должно быть.
Другой ответ хороший, но я пьян и хочу дополнить джуновьей мудростью. EF нормальная штука, если ты сам хозяин базы данных - ты ее формируешь под свои требования, потому запросы у тебя почти всегда будут тривиальны. Но если база данных уже существует, и тебе под нее подстраиваться нужно, высока вероятность что ты каждый раз будешь проверять, какие запросы генерирует EF. В половине случаев ужасаться. А иногда просто не сможешь запрос нужный написать используя linq. В случае таких БД лучше сразу выбирать dapper.
Большое спасибо, добра!
Видел в коде подобную конструкцию
public int? A {get; set;}
Гугл говорит немного про другую хуйню.
int? - это nullable int. По сути int, который может принимать значение null. С другими базовыми типами так же можно делать.
<LangVersion>8.0</LangVersion>
<Nullable>enable</Nullable>
<TreatWarningsAsErrors>true</TreatWarningsAsErrors>
Про nullable типы уже сказали (Type? это под капотом Nullable<Type>), а как операторы:
Ternary (conditional) operator:
var result = condition ? result1 : result2;
Если condition == true, то result = result1. Иначе result = result2.
Null-coalescing operator:
var result = result1 ?? result2;
Если result1 != null, то result = result1. Иначе result = result2.
var result ??= result1;
Если result == null, то присваивает ему result1. Иначе ничего не делает.
Null-conditional operator:
var result = thing?.member;
Если thing != null, то result = thing.member. Иначе result = null (и не возникает исключения, как если бы ты пытался обратиться к thing.member при том что thing == null).
У меня вопрос - какой стек мне нужен для этого, а точнее хватит ли мне asp.net или для этого придется дрочить еще всякие js'ы. Сам легко могу такое сделать на wpf'e/winforms, а в вебе не разбираюсь.
Вот хороший пример приблизительно того что я хочу https://monopoly-one.com/ , только там игровое поле на html коде, а мне достаточно/нужно .пнг фон.
ну любой сайт это серверная сторона что выполняется на сервере
и то что выполняется в браузере
и вот что в браузере это жс
ну или блазор если смелый
Вот сейчас я ради интереса ковыряю wpf и пытаюсь сделать кнопку из квадрата. Я уже полчаса гуглю, как это дерьмо заставить менять цвет в ответ на событие фокуса
Каждый ебаный элемент имеет в себе сотню ебаных свойств, а иде бесполезна более чем полностью. При том, что я в бленде сижу, специализированное по для интерфейсов, блядь. Хочешь поменять стиль – вот тебе 400 строк стилей всего элемента, ебись, блядь, ковыряй триггеры, дрочи этот котях
В рот ебал этот хамл. Десктоп загнулся и поделом ему с такими инструментами. Но майки тащат это сучье дерьмо в maui. Да, там будет флюент синтаксис, но наверняка найдется какой-нибудь дед-пердед, которому и хамл вкусный, и ебись потом с его контролами. Впрочем, не уверен, что майки в этот раз смогут сделать что-то популярное для мобилок
ну и нахуй оно нужно?
>Я уже полчаса гуглю, как это дерьмо заставить менять цвет в ответ на событие фокуса
то есть это значит что ты вообще не освоил основ и уже "говно говно говно"
про триггеры знаешь, а цвет на фокус поменять не можешь. Вот как так?
причем тут вообще флюент синтаксис до хамла. хамл силен не этим. хамл силен тем что декларативно описывает то, что иначе пришлось бы кодом набирать что как раз и есть лютый пиии.
А десктоп загнулся потому что макаки не умеют в нативную разработку и им похер "лагает, тормозит, половина одного потока", зато крос
десктоп загнулся, потому что он нахуй никому не нужен, когда есть универсальный веб интерфейс, доступный с любой ОС с любого устройства, лишь бы был браузер, да еще и с мгновенным обновлением версий
А я разве не так сказал? Я это и сказал что притащили вебинтерфейс в десктоп и похуй на то что оно тормознутое говно и жрет безмерно памяти и не выглядит нихуя нативно. Просто макакам писать легче.
потому что МАКАКИ
это и писать удобно и использовать удобно, причём тут макакство. интерфейс хуйня, ведь вся магия происходит в десктопе, а жрёт ли приложуха 2мб на чистом винапи или 400мб вкладка в моём браузере - меня не ебёт, когда у меня 24гб DDR4. Зато мои гугл доки доступны мне с любого устройства из любой точки мира, мне не нужно покупать специальное ПО. мне не нужно после переустановки винды ставить себе кучу приложений, потому что я использую веб сервисы. нахуя вот ты скажи мне нужны не-ОС десктопные приложения, кроме игор, браузеров и инструментов разработки?
Ну то есть ты привел доводы со стороны макак - "нам писать проще, одно на все платформы" и так далее
То есть подтвердил то, что я сказал.
А с точки зрения пользователя у тебя один аргумент "мне норм, остальное не ебет"
Потому и приходится покупать новые мощные машины и смарты чтобы поделки макак хоть как то работали.
Есть rectangle, который должен менять цвет по наведению. До кучи – по нажатию на него должна вызываться команда
1) в темплейт кнопки засунул прямоугольник. На событие фокуса он не реагирует
2) просто ректангл с триггером, не реагирует аналогично
А я всего лишь хотел сделать кастомный топ-бар. Вот как с этим работать? Не осилил, да. Ну да, я не осилил. Рассчитываешь, что декстоп должно быть удобнее писать, а тебе как будто специально палки в колеса вставляют
я размышляю с точки зрения человека, для которого разработка и использование ПО - это не спортивные дисциплины, а методы и средства решения задач. если мне захочется побайтоёбить - то я буду делать там, где без этого не обойтись, а не потому что нуу гыгы тупые макакеры на своём говнякте тащат 200мб а я вон пишу 100 строк на винапи на обработку нажатия кнопки через WM_ коды потому что я нимакакер гыгык))0 void* bThread = CreateThread() я многотопочный)00
И много он там добавил? Или как всегда скопипастил всё в кучу, а новое размазал крупицами по всей книге?
>цвет по наведению
по наведению чего? мыши что ли? так пролет мыли это не получение фокуса. Ховер эффект это триггер на IsMouseOver
Онклик для элементов что не имеют его делается через InputBindings
>>815724
Ну да ну да. Макакам норм, а пользователям страдать. Но кого волнует мнение пользователей да - ведь всегда можно купить более новое железо. А в итоге и выбрать то не говномакаческие поделки уже не выйдет.
А потом имеем тот пиздец что на пике
>Но кого волнует мнение пользователей
я тебе как пользователь заявляю, что в рот ебал десктопную хуйню, дайте мне веб сервисы. в наши дни пользовательское железо для них нихуя не стоит
>А потом имеем тот пиздец что на пике
ну и причём тут ведроид с его дебильной джабой как основным ЯП разработки?
>ну и причём тут ведроид с его дебильной джабой как основным ЯП разработки?
на смартах та же макаковая хуета "не хотим учить натив, дайте нам браузер и мы все в нем. тормозит? жрет память? это проблема юзера -пусть покупает новый смарт"
на десктопах проблема меньше выражена ибо устройство мощнее, но по факту есть ноуты и они не такие мощные и на них это говно ЗАМЕТНО лагает. но макак это не ебет. Софт есть - есть и макаке насрать на то как его говно работает у пользователя
>я тебе как пользователь заявляю, что в рот ебал десктопную хуйню, дайте мне веб сервисы
так бери вебсервисы, кто тебе запрещает. Никто на твои сервисы не покушается. Сиди в вебверсии телеграма вместо десктопной - твое право.
Но когда переделывают норм софт на жс версию это пиздец. Даже на моей машине (i9 7900x 64gb 3200 и сплошные ssd - да да уже старье) начинает лагать это уже ни в какие ворота.
К примеру, у меня стоит софтина Xmind 7 и летает. А вот ее новая версия переделана под электрон или что то такое и тормозит просто адски. Я не знаю какой там квантовый комп нужен для нее.
Туда же. но выражено меньше - personal brain
про скайп и так все знают - ну он у меня не тормозит (я его и не запускаю так то) так что ладно
логитеч вебкам панелька, кракен панельнка - все это переделали и заметна неотзывчивость.
комп мощнее чем мой древний 2 поколения назад феном х4 925, а по ощущениям все работает с той же скоростью. Потому что процветает макачество. Тенденция такая.
>ак бери вебсервисы, кто тебе запрещает
никто мне не запрещает, но ты выше писал
>Макакам норм, а пользователям страдать. Но кого волнует мнение пользователей
ну вот я и говорю, что я страдаю от привязки к ОС, конкретному устройству, установке ПО и прочему, а не от того, что приложуха жрет 200 мб в вкладке браузера вместо 2мб сразу в оперативке.
>К примеру, у меня стоит софтина Xmind 7 и летает. А вот ее новая версия переделана под электрон или что то такое и тормозит просто адски. Я не знаю какой там квантовый комп нужен для нее.
братишка проста тупа садись на условно бесплатный https://miro.com/app/dashboard/
для всего сейчас есть веб сервисы, нахуй тебе это десктопное говно?
>Потому что процветает макачество. Тенденция такая.
ну так а конкретно js и веб приложения vs десктопные приложения тут причём? из того, что ты говоришь андроид говно, электрон говно следует вывод, что тебе не нравятся говнокодеры, а не жс.
>для всего сейчас есть веб сервисы, нахуй тебе это десктопное говно?
1 не работают без инета.
2 имеют жалкий аналог функционала, что мне нужен
3 требуют закачивания или размещения моих рабочих файлов где то еще
4 оно тормоз.
5 оно неудобно. просто неудобно. абсолютно неудобно. может у вас простые требования, но мне для работы НЕУДОБНО шопездец
пункты 1,2,3 решают что оно мне не подходит. и не нужно кормить меня "ты просто не понимаешь", если оно не делает то, что мне нужно так как нужно.
то есть
>для всего сейчас есть веб сервисы
только твое мнение. Для тебя есть набор сервисов который удовлетворяет набор твоих требований и твои нужды
>ну так а конкретно js и веб приложения vs десктопные приложения тут причём?
Ну дошло до того, что откровенно десктопный софт переделывают или делают сразу на говноэлектронах и это не "просто дубль веб версии" типа как вацап сделал.
>андроид говно, электрон говно
про андроид я ничего не говорил. я говорил про смарты, на которых не стоят квантовые процы и сто гигов оперативы. и я не обязан постоянно менять свой смарт чтобы поспевать за жрущим ГОВНОМ типа электрона ( а вот его я как раз считаю лютым говнищем)
тем более что смарты не на что менять. Вот я хочу не лопату с норм железом, акб и так далее и за адекватную цену. принесешь? а нету нихуя
get;set; преобразуется в обычные функции:
_private _uVariable;
public Set(value) {_uVariable = value}
pulic Get() => _uVariable
Синтаксический сахар для инкапсуляции.
>get;set; преобразуется в обычные функции
Да не, вот просто, сама по себе любая функция разве по сути не является инкапсуляцией?
public hui Pizda(double height) {}
функция является - ведь она может делать внутри себя что-то и потом незаметно ее внутренняя логика может стать другой, а снаружи этого не видно.
точно также и внутренняя логика свойства может стать другой и снаружи этого не заметят
это и есть инкапсуляция.
> хамл силен тем что декларативно описывает то, что иначе пришлось бы кодом набирать что как раз и есть лютый пиии.
Бля, там кодом обычно проще было бы набрать и разбираться проще, чем пялить в эти бесконечные
<hui dlina = 5>
<v pizde> glubina = 25, shirina =5 </ v pizde>
</hui>
Почему, блядь, где то свойства описываются в <> где то между <> </>, плюс, все это такие сопли порождает, что я ебал, как посмотришь на этот хамл, так голова сразу болеть начинает
Нахуя нужны команды в WPF, чо они дают вообще, по сравнению с формами? На формах как было, блядь, есть кнопка, при нажатии вызывается метод. В wpf при нажатии срабатывает команда, которая дергает привязанный к ней метод, и чо? Нахуя эта прослойка в виде команды вообще нужна тогда, блядь? В чем профит?
Майкрософт собирает джуну ЯП в энтерпрайз:
— Вот, положила тебе в C# async-await, EF и дженерики с полиморфизмом.
— Мам, нафига??
— Ну как же, берешь запрос к БД через репозиторий на EF, запускаешь Async метод и await'ишь.
— А дженерики с полиморфизмом?
— Так вот же они!
сразу из головы чё помню. команды можно биндить, что удобно при использовании юзерконтролов, что в лишний раз энфорсит каноничный MVVM на самом деле ивенты тоже можно, но там такая хуйня костыльная маму ебал
>Являются ли дженерики реализацией полиморфизма или только интерфейсы?
>реализация инкапсуляции в шарпе это гет сет
Твоя проблема в том, что ты такие абстрактные понятия как "полиморфизм" и "инкапсуляция" пытаешься вложить в что-то одно. Это не так работает. Эти понятия слишком общие для того чтобы вкладывать их либо в только интерфейсы, либо только в геттеры и сеттеры. Их так и нужно воспринимать как что-то общее, полиморфизм когда ты что-то одно применяешь ко многим, инкапсуляция когда ты что то используешь в общедоступном и скрываешь главную его реализацию от пользователя.
А потом такие говорят, что html и css это легко, лол.
Для того чтобы у тебя в коде было всё структурированно, что в свою очередь облегчает поддержку и расширение этого кода.
Это как сказать "зачем нужно по папкам всё раскладывать, если можно всё в одну скидывать и функционал не изменится? желательно чтобы этой одной папкой был рабочий стол!"
У команды общий интерфейс, у каждой команды есть общая логика, твой же метод в винформс может принимать любую форму, ограничившись лишь больной фантазией того кто его реализует.
Команда может принимать аргументы, которые ты прописываешь прям в XAML коде, т. е. ты смотришь на XAML и уже примерно можешь представить что эта команда делает, тоже самое в winforms достигается только непосредственным просмотром кода метода в котором еще нужно будет попотеть чтобы понять откуда какие данные берутся.
Но ведь можно PWA на Blazor запилить и вообще выкинуть жс. Будет нативное веб приложение, которое маскируется под десктоп и работает быстро.
>команды можно биндить
В чем великая суть вместо название события = метод писать бинд = комманда?
>твой же метод в винформс может принимать любую форму
Да с хуяли это вдруг? В винформах событие дергает метод, про делегаты слышал вообще?
>Команда может принимать аргументы, которые ты прописываешь прям в XAML коде, т. е. ты смотришь на XAML и уже примерно можешь представить что эта команда делает
Вот щас бы сидеть смотреть откуда на хуй аргументы взялись в этом xml, ага? Я уж лучше открою и гляну нормальный код, а не это html спагетти
Ты совсем тупенький? Реализация твоего метода в формах это черный ящик, в случае с командой мы как минимум знаем что у неё есть методы CanExecute и Execute, а также ивент CanExecuteChanged
>>816033
Смотреть и гадать не надо, потому что есть общая структура. Ты просто пытаешься судить о том, чем не пользовался, непонятно зачем. Чтобы лишний раз подкрепить своё "это не я ленивый и не хочу учить новое, это технология хуевая"? Так это можно и без постов делать.
>Бля, там кодом обычно проще было бы набрать и разбираться проще
кому как. у меня вот проект на кутях где описывается кодом и это пиии. ведь нужно в голове выполнять этот код чтобы понять, а еще код длиннее и может собираться из многих методов и вообще адище
>где то свойства описываются в <> где то между <> </>
хмл есть хмл. Простой тип - строки числа енумы можешь задать как аттрибут, ну и то что обвешано всякими {Binding, Static ...и так далее, которые могут превратить заданную им строку в нужный обьект). А сложный тип нужно описывать как самостоятельный хмл узел, который в аттрибут не всунешь.
>>815987
>Нахуя нужны команды в WPF, чо они дают вообще, по сравнению с формами?
Биндинг биндинг. чтобы ты в MVVM не писал горы хендлеров событий в code-behind (который в идеале пустой) ибо декларативщина
>>816033
>Вот щас бы сидеть смотреть откуда на хуй аргументы взялись в этом xml,
как раз это и понятно ибо декларативное описание супротив императивного кода. хтмл точно такое же декларативное описание. когда там пишешь аттрибут data-хх ты ж не жалуешься.
А ну да. Это ж еще команда, которая имеет CanExecute. Не нужно бегать по форме и дисаблить всех нуждающихся. Не нужно также заводить отдельный флаг "эту операцию можно выполнить"
потому что команда содержит в себе еще и эту инфу и вид про это знает
дженерики это просто шаблон чтобы за тебя создали конкретный тип. это не полиморфизм.
Суть в том, чтобы свести весь UI и всё поведение пользовательского интерфейса к XAML, MVVM и биндингу, чтобы не определять события в коде. Алсо событие - не dependency property, так просто ты его не забиндишь. Ты можешь указать какое то конкретное событие твоего юзер-контрола, но оно будет вне контекста основной view-model'и контейнера/приложения, и следовательно ничего у тебя там не будет
Так я нуфаг
>в случае с командой мы как минимум знаем что у неё есть методы CanExecute и Execute, а также ивент CanExecuteChanged
Ебать, очень нужно, ага. Прям вот каждый раз, как надо к кнопке метод приколотить я использую всю эту хуйню, ага?
>Чтобы лишний раз подкрепить своё "это не я ленивый и не хочу учить новое, это технология хуевая"?
Почему не хочу? Я хочу. Только вот это все нахуй не надо, а только порождает код ради кода очередной
>тысячи опытных программистов использовали винформс и используя наработки, которые они до этого пилили при помощи костылей, создали продолжение винформс - впф
>неосилятор с двача: НИНУЖНО ЯСКОЗАЛ ЛИШНИ КОД КАК ВСИГДА ЛИШЬ БЫ МНЕ СЛОЖНЕЕ ПОНЯТЬ БЫЛА РЯЯ!!
Ты хоть сам понимаешь насколько жалко твои претензии выглядят со стороны? Умножение тоже нахуй не нужно, ведь не нужно никакие таблицы учить, просто складываешь всё последовательно и получаешь тот же самый результат!
>чтобы ты в MVVM не писал горы хендлеров событий в code-behind (который в идеале пустой)
И чо, я без команды не могу приколотить к событию метод, который во вьюмодел лежит? Рили?
МС дала им код бихайнд, который ко вьюхе приколочен в качестве вьюмодели по сути. Нет, не хочу его юзать, хочу отдельный файл вьюмодел создать. Почему? Нахуя? Так нада! В итоге, блядь
Window1.xaml
Window1.cs - пустой
Window1ViewModel.cs - с кодом
>Не нужно бегать по форме и дисаблить всех нуждающихся.
Нужно бегать и дисаблить с помощью canexecute команду, те же яйца, только в профиль, блядь
не.
хотя... погоди (чешет яйца)
не. все же не.
вот у тебя есть класс и ты с ним работаешь. а потом появляется наследник этого класса который переопределяет часть текущего. и твой код продолжая работать с текущим классом автоматом начинает работать с наследником. это полиморфизм
а дженерики просто шаблон чтобы за тебя сгенерили типизированные классы/методы, чтобы ты не был goшником
>дженерики это просто шаблон чтобы за тебя создали конкретный тип.
Пихаю туда разные типы данных, получаю одинаковое их поведение
>это не полиморфизм.
ясн
>чтобы не определять события в коде.
Какие, блядь, события в коде ты определяешь? Нахуярил OnButtonClick = ButtonClick и забыл, блядь, то же самое, что и биндингом твоим
ну вот у тебя допустим вьюмодель на формсах и ты хочешь сделать чтобы на онклик дергался метод во вьюмодели
тебе нужно
1 прописать хендлер онклик в коде бехайнд где достать дернуть метод вьюмодели
2 навесить на вьюмодель событие что "теперь эту кнопку можно кликать" чтобы в том же коде-бехайнд прописывать "на изменения вот этого можно сделать енаблед вот эти контролы"
умножаешь это на 20-30 контролов на форме и смотришь на количество кода что ты РУКАМИ захерачил в кодебехайнд
в случае WPF такого кода у тебя будет написано НОЛЬ
>>816122
>Нахуярил OnButtonClick = ButtonClick
где этот ButtonClick? во вьюмодели? так не пойдет. вьюмодель НИХЕРА НЕ ЗНАЕТ про вид. в этом ее суть
>просто складываешь всё последовательно и получаешь тот же самый результат!
Я тебя удивлю, но кудахтер только складывать и умеет.
>Ты хоть сам понимаешь насколько жалко твои претензии выглядят со стороны?
Где жалко то? Я, блядь, чего не открою поглядеть, везде, нахуй, контрол - бинд - команда - метод. Нигде команды, нахуй по другому не используются
это за тебя генерятся типизированные классы. просто замена ручному кодированию. Это не полиморфизм
Это всё часть одного и того же, как я уже писал выше, частой ошибкой является желание натянуть абстрактные понятие типа полиморфизма на что-то одно. Оно на то и абстрактное для того чтобы воплощаться в разных формах. Обощенные классы в данном случае облегчают применение полиморфизма и являются его частью.
>Я тебя удивлю, но кудахтер только складывать и умеет.
И зачем ты это высрал? Умножение человеку нужно или для тебя 5*5 и 5+5+5+5+5 это одно и тоже, поэтому таблицу умножения учить не нужно?
>где этот ButtonClick? во вьюмодели? так не пойдет. вьюмодель НИХЕРА НЕ ЗНАЕТ про вид. в этом ее суть
Который? ButtonClick()? Вот этот? Во вьюмодели конечно. Нахуя вьюмодели про вьюху знать для этого?
еще раз
вот у тебя кнопка. у нее есть событие онклик
у тебя есть вьюмодель
как свяжешь онклик с вызовом метода вьюмодели БЕЗ НАПИСАНИЯ хендлера в котором ты вызываешь метод вьюмодели?
Да, в первом у тебя одна операция, во втором 5. Первый у тебя займет 3 символа, второй 9. Первый читается быстрее. Ой, да это прям как впф против винформс!
>Нахуя вьюмодели про вьюху знать для этого?
ага. то есть вьюмодель должна теперь в сигнатуру свою добавить sender и eventargs, хотя для вьюмодели это просто метод без параметров
Ну если тебе так комфортнее думать, то не буду тебе мешать, жаль только что это реальность никак не изменит.
ок. закончили на этом. каждый пусть думает что хочет. все то весь мир не считает это полимфоризмом и один ты. ты конечно прав
>все то весь мир не считает это полимфоризмом
>весь мир
Это ты так свой манямирок называешь?
Хуею с клоунов, которые базовых определений не знают, но с видом знатока натягивают свою умственную отсталость на весь мир.
Вот, почитай на досуге:
https://en.wikipedia.org/wiki/Parametric_polymorphism
На пикриле выделил часть которая от тебя потребует большего внимания, чем другие.
При том, что твой винформ слишком монструозный и не структурированный. Тебе это уже несколько раз повторили, даже привели простую аналогию. Но ты всё равно продолжаешь кричать "Я ИСПОЛЬЗУЮ ЗНАЧИТ НОРМАЛЬНО!! А ТО ЧТО ВЫ ГОВОРИТЕ МНЕ НЕ НУЖНО!!!", продолжая закрывать глаза на отсутствие адекватной и удобной структуры у винформс приложений.
в WPF не только команды, а и БИНДИНГИ для команд.
напомню первоначальный вопрос
"Нахуя нужны команды в WPF,"
вот затем и нужны чтобы отвязаться от событий заменив их на определение команды и возможность на нее биндится.
нахуя команды нужны были бы в формсах - я не ебу.
>а не полимфоризм в шарпах
Как много обличий у твоего манямирка, то это весь мир, то вдруг шарпы...
гм. я думал мы в тебе про шарпы сидим. и вот еще
"Являются ли дженерики реализацией полиморфизма или только интерфейсы? Какого хуя, везде написано, что реализация инкапсуляции в шарпе"
вижу слово "в шарпе"
а оказывается шарп не причем. ясно ясно.
Может тогда объяснишь всем, почему в шарпах это не полиморфизм, а что-то другое, одному тебе известное?
ок ок. ты смотрел с колокольни "все виды полимфоризма" я же рассматривал только ad-hoc (собственно о нем я и писал)
каждый думал о своем. Я это признал. что еще?
Ебаный рот этого казино, блядь. Я все понял, походу мы все тут не поняли друг друга.
Я спрашивал чисто за команды. В целом, мне лезть на винформ нахуй не надо. Я и на впф покодю
>напомню первоначальный вопрос
"Нахуя нужны команды в WPF,"
вот затем и нужны чтобы отвязаться от событий заменив их на определение команды и возможность на нее биндится.
>>816166
Вот так, например. Событие? Событие, все ок. Нахуй тут команда нужна?
я же выше писал пример когда у тебя события и хендлеры в кодебехайнд и сравнение с впф
ты предложил делать не хендлеры а сразу хендлером пусть будет метод вьюмодели
но тут есть несколько но
1. это добавит в сигнатуру сендер и аргс которые логически во вьюмодели нахер не нужны. Для нее это просто метод
2 проблему флага "можно кликать" это не решает. ты все равно вынужден писать ручной механизм переключение статуса enabled для контролов в зависимости от состояния вьюмодели
3 биндинг может быть на команду которая находится хуй знает где в иерархии, до которой банально не добраться без ручной реализации хендлера где тебя ждет путешествие вверх по деревью контролов ( у вьюмодели спрашивать бесполезно - она про родителей не знает)
в итоге нулевого кода не будет. А там где ты сокращаешь код - ты вносишь мусор во вьюмодель
Конечно ты можешь реализовать костыли и присобачить их к финформс чтобы убрать эти проблемы как можешь
но это и будет ответом на твой вопрос "а в чем выгода"
А еще есть фокус, где можно ли работать с командой или нет зависит от фокуса. например кнопки на тулбаре в офисе меняют вклвыкл в зависимости куда фокус у тебя. И это все само работает, а не ты руками бегаешь прописываешь что должно быть активно или выключено в каждый текущий момент
но это уже лишнее. и так хватает
Умник, блять, и чё тебе это даст, если ты пилишь не вермишель ебаную в MainWindow.xaml, а как белый человек раскидываешь компоненты по юзер-контроллам? Твой клик будет искаться в UserControl.cs, хуй ты оттуда достанешь по человечески главную вьюмодель
>Ебаный рот этого казино, блядь. Я все понял, походу мы все тут не поняли друг друга.
Эна воно как. в общем так
1 команда это обьект который связывает в себе и хендлер и canexecute, что уже очень полезно ибо не размазывается
2 Команда у вьюмодели это свойство. со всеми вытекающими для биндинга. не забывай про OneWay
3 У команды ясный интерфейс ICommand, который не зависит че там в итоге будет вызвано и как. У метода же никакого такого интерфейса нет. Ну да ты можешь требовать сигнатуру вида Action/Action<T>, но это анальное ограничение и в случае интефейса ты можешь сделать свои реализации команд, а с методом нет
4 гладиолус
да одного того что хендлер и флаг связаны воедино хватает для того чтобы создать класс объединяющий их а наречь его команда. Только одной этой причины БОЛЕЕ ЧЕМ достаточно так то
1/3 треда точно
ну так то это не годами измеряется. тут выше отписывались что столько пишут, а толком ни с чем не сталкиваются
>А там где ты сокращаешь код - ты вносишь мусор во вьюмодель
Как будешь оповещать вьюмодель о том, что в модели изменилось какое-нибудь свойство, которое ко вьюхе приколочено? Во вьюмодели, естественно чисто обертка.
>если ты пилишь не вермишель ебаную в MainWindow.xaml
Какую вермишель? По каким юзер-контролам чо ты там раскидываешь, как белый человек? Ну ка поясняй, чо сказать хотел.
>Твой клик будет искаться в UserControl.cs, хуй ты оттуда достанешь по человечески главную вьюмодель
Нахуй мне ее доставать, поехавший? Мне похуй, где этот клик будет искаться, метод приколочен, он и сработает из вьюмодели при клике.
> , что в модели изменилось какое-нибудь свойство, которое ко вьюхе приколочено?
Я подписываю вьюнмодель на PropertyChanged модели и обновляю соответствующие свойства.
>да одного того что хендлер и флаг связаны воедино хватает для того чтобы создать класс объединяющий их а наречь его команда.
Да вот хуй. Какие вы, блядь, хендлеры руками все время прописывать хотите? Все за вас уже сделано на хуй. Присобачил на событие в xaml свойствах контрола метод из vm и все работает, блядь, изкаробки. Какие, блядь, хендлеры, где вы эти делегаты руками пишите, блядь?
Флаг, блядь, хуяг. Дался вам этот флаг? Ну заблочишь ты выполнение команды и чо? Кнопка то в окошке все равно нажиматься будет и юзер, будет сидеть и жать ее не понимая, хули нихуя не срабатывает, тогда как, если ее дисаблить, то он сразу увидит, что нажать ее нельзя и начнет думать, а почему
Реализовывать INotifyPropertyChandeg у каждой модели, еще и {get;set} уже не написать, а надо расписывать и дергать PropertyChanged. И это я еще выходит, по твоему мусор вношу, ага, блядь.
> Присобачил на событие в xaml свойствах контрола метод из vm и все работает, блядь, изкаробки
1 а ну покажи это. а мы посмотрим
2 флаг IsEnabled для кнопки к которой ты привязал как поддерживается? или кнопка всегда активна и похуй что кликать нельзя в данный момент?
>еще и {get;set} уже не написать,
Fody поможет.
Я не он если что
Так зачем в каждой модели?
Не в каждой модели, а только в тех моделях в которых которым нужно будет оповестить кого бы там нибыло об изменениях
Большинство моделей просто проставляются со стороны вьюмоделей, а оповещать обратно им не к чему.
>Дался вам этот флаг? Ну заблочишь ты выполнение команды и чо? Кнопка то в окошке все равно нажиматься будет и юзер, будет сидеть и жать ее не понимая
что за бред. кнопка переходит в состояние disabled когда команду юзать нельзя. Никогда таких кнопок не видел что ли?
>1 а ну покажи это. а мы посмотрим
Ну на, смотри
>>816166
>флаг IsEnabled для кнопки к которой ты привязал как поддерживается? или кнопка всегда активна и похуй что кликать нельзя в данный момент?
Элементарно. Создаешь свойство булево, биндишь на свойство IsEnabled в кнопке. Все. Понадобилось, сбросил его в вм, кнопка неактивна, пользователь это видит и как дурак жать и орать, что хули ничо не работает не будет. Нужна стала, взвел его и вот, пожалуйста, нажимай кнопку. Проблемс?
>Fody поможет.
Щас бы еще под каждый пук дополнительную либу прикреплять.
Не, лучше под каждый пук нахуярить команд, которые только и делают, что этот метод вызывают, ага?
ButtonClick(object sender, RoutedEventArgs e)
Или
Command ButtonClickComand;
ButtonClickComand = new Command();
ButtonClickComand += ButtonClick();
чтобы
ButtonClick();
Охуеть, блядь.
>которые только и делают, что этот метод вызывают, ага?
нет не только. я уже говорил и еще раз повторю. команда это хендлер с флагом "IsEnabled". И раз контролы умеют в эту сущность, то это более полезно, чем отдельно метод, отдельно флаг
ну а что еще польза вот ниже читай
>>816734
>Ну на, смотри
куда смотреть?
> Создаешь свойство булево, биндишь на свойство IsEnabled в кнопке
1 то есть все таки отдельное поле...с отдельным биндингом
2 я уже говорил что команда это свойство и как любое INPC свойство может быть перебиндено в рантайме. Метод на такое не способен
3 Фокус манаджмент в принципе работать не будет.
>под каждый пук дополнительную либу прикреплят
не прикрепляй. нравится руками писать пиши. когда надоест подключишь либу которая будет писать за тебя. это кому что нравится
В какую одну, поехавший? В твоей кривой аналогии, ты блядь, под каждый файл отдельно папку хуяришь, которые так же в одной общей лежат. От так заебись, сразу лучше стало, ага?
В моей аналогии я не скуплюсь на строчки, если они помогут мне структурировать проект и облегчат работу с ним в будущем.
>куда смотреть?
Вот в этот пост, ты издеваешься?>>816166
>1 то есть все таки отдельное поле...с отдельным биндингом
И...чо? Лучше парочку полей под нужды, ну чет мне слабо верится, что у тебя программа постоянно хуярит кучу контролов то включая их, то выключая. А под несколько контролов не трудно поле создать. Список команд под все контролы нинужон.
>я уже говорил что команда это свойство и как любое INPC свойство может быть перебиндено в рантайме.
Пример приведи, когда это нужно.
>Фокус манаджмент в принципе работать не будет.
Что это и зачем нужно?
А с чего ты взял, что это тебе поможет структурировать там что-то? Тыскозал что ли? Еще раз, только внятно поясни, как лапша из четырех дополнительных строк в случаях команд поможет тебе структурировать проект?
>Какую вермишель? По каким юзер-контролам чо ты там раскидываешь, как белый человек?
????
Ты весь UI в MainWindow.xaml пишешь, или что? Кто тут поехавший то бялдь???
>Нахуй мне ее доставать, поехавший?
Чтобы он сработал из вьюмодели фактически из DataContext содержащего кнопку контрола, нужно забиндить метод, а не просто указать имя. С указанием имени нихуя у тебя не сработает.
>Вот в этот пост, ты издеваешься?
а где в этом посте связь события с методом вьюмодели? хендлер на скрине в code-behind и никакого отношения к вьюмоделям не имеет.
> Лучше парочку полей под нужды
Это тебе лучше. Мне лучше когда сущность одна, и количество контролов значения не имеет. OneWay биндинг на команду имеет. Ну а работа с фокусом в принципе невозможна по твоей схеме
>Пример приведи, когда это нужно.
когда нужно поменять целевую команду (читай хендлер на лету). но это тупой спор. потому что ты скажешь "не меняй целевой хендлер, а сделай один хендлер и в нем уже if и разбирайся" на что я скажу что это тупость делать аггрегирующий хендлер, а ты скажешь нет и в общем тупик
>Что это и зачем нужно?
это привязка команды в зависимости от фокуса. Посмотри хотя бы на меню визуал студии и тулбары. Это подходящий пример. В зависимости от того где ты щас находишься пункты и кнопки либо активны либо нет.
Городить руками весь этот огород..да ну нах
>Ты весь UI в MainWindow.xaml пишешь, или что?
Еще раз, я не какой то неибаца wpf программист, поэтому и спрашиваю у вас, что и как. Я писал небольшие wpf приложения, да, весь UI у меня был в MainWindow.xaml. А как надо, можешь рассказать? Без троллинга.
>>816794
>нужно забиндить метод, а не просто указать имя. С указанием имени нихуя у тебя не сработает.
Да?
MainWindow1.xaml:
<Window x:Class="WpfApplication1.MainWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
Title="MainWindow" Height="350" Width="525">
<Grid>
<Button Click="Button_Click"/>
</Grid>
</Window>
MainWindow1.cs:
namespace WpfApplication1
{
public partial class MainWindow : Window
{
public MainWindow()
{
InitializeComponent();
}
private void Button_Click(object sender, RoutedEventArgs e)
{
MessageBox.Show("Добрый вечер");
}
}
}
Берешь этот код и охуеваешь, что все работает без бинда, просто, с указанием имени. Если MainWindow1.cs тебя не устраивает, то можешь создать MainWindow1ViewModel.cs положить код туда, только в xaml DataContex не забудь прописать, работать будет аналогично
>Ты весь UI в MainWindow.xaml пишешь, или что?
Еще раз, я не какой то неибаца wpf программист, поэтому и спрашиваю у вас, что и как. Я писал небольшие wpf приложения, да, весь UI у меня был в MainWindow.xaml. А как надо, можешь рассказать? Без троллинга.
>>816794
>нужно забиндить метод, а не просто указать имя. С указанием имени нихуя у тебя не сработает.
Да?
MainWindow1.xaml:
<Window x:Class="WpfApplication1.MainWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
Title="MainWindow" Height="350" Width="525">
<Grid>
<Button Click="Button_Click"/>
</Grid>
</Window>
MainWindow1.cs:
namespace WpfApplication1
{
public partial class MainWindow : Window
{
public MainWindow()
{
InitializeComponent();
}
private void Button_Click(object sender, RoutedEventArgs e)
{
MessageBox.Show("Добрый вечер");
}
}
}
Берешь этот код и охуеваешь, что все работает без бинда, просто, с указанием имени. Если MainWindow1.cs тебя не устраивает, то можешь создать MainWindow1ViewModel.cs положить код туда, только в xaml DataContex не забудь прописать, работать будет аналогично
>что все работает без бинда, просто, с указанием имени.
и не является MVVM аж нисколько, в общем винформс подход
только не спрашивай зачем нужен MVVM ибо все с тобой будет ясно
>только в xaml DataContex не забудь прописать, работать будет аналогично
ну я же просил показать пример связки события контрола и вьюмодели в хамле
так покажи как это сделать
не нужно показывать связь с code-behind
>хендлер на скрине в code-behind и никакого отношения к вьюмоделям не имеет.
А что, вьмодель у нас это не просто отдельный cs файл на который мы перенаправляем DataContex?
>это привязка команды в зависимости от фокуса
Как это работает? Сменил я фокус и что? Как дальше это все командами подхватывается не городя руками?
>и не является MVVM аж нисколько
Это схуяли, блядь? Model-View-ViewModel. Где там про bind? Это просто построение программы, что вся логика убирается в модель и связывается с вьюхой через вьюмодел, чтобы в любой момент можно было безболезненно выкинуть нахуй вьюху текущую и напялить другую
>вьмодель у нас это не просто отдельный cs
вьюмодель это из MVVM. я не знаю куда ты там что перенаправляешь ибо событие можно захендлерить из хамла только на code-behind причем конкретного для юзер контрола или окна. Если у тебя несколько юзер контролов то все будет в разных местах
>Сменил я фокус и что?
WPF знает про и ищет команды в текущем элементе (на котором фокус). И конечно результат выполнения команды будет разный в зависимости от фокуса.
>Model-View-ViewModel. Где там про bind?
вообще то ICommand они КАК РАЗ ДЛЯ ПОДДЕРЖКИ БИНДА В MVVM и придуманы. Для не mvvm придуманы routedcommand
я приведу список что не так с методами и пойду
1 невозможно забиндить событие на метод вьюмодели без промежуточного хендлера в code-behind. Тот кто пишет что можно - фантазер. Конечно можно использовать кастомный биндинг но это уже не стандарт
2 Метод отдельно флаг отдельно - удобно только в простых решениях, когда команды не передаются куда то, не собираются в списки комманд (для рендеринга контекстного динамического меню например) и т.д.
3 метод не INPC. Его не сменить на лету. Притянутый за уши!!! пример - кнопка стартстоп, где триггерами целевая команда меняется в зависимости от чего то. Можно сказать что можно в методе решить что делать с помощью if, но это уже спорный момент и слишком примитивный пример
4 CommandTarget и работа с фокусом принципиально невозможны
5 невозможно забиндить хендлер на метод который находится уровнями выше (подобие Relative Source AncestorLevel). Впрочем это продолжение пункта 1 - все придется делать или через code-behind или ебашать RoutedCommand, что не MVVM
Ну а теперь ты разбиваешь свою дрисню на юзер контролы или их вообще пилит отдельный член команды и охуеваешь, что юзер контрол увидит твою хуйню только в своём юзер контроле, а все состояния, данные и прочая хуйня в совсем другом месте, стыдливо прикрываешь попу и перестаёшь тут нахуй бычить, если рассматриваешь всё это с точки зрения
>ну гыгыг вот хеловорлд выводится в MainWindow.xaml чё тут еще надо)))0 тупые сук ахаха ))))
>вообще то ICommand они КАК РАЗ ДЛЯ ПОДДЕРЖКИ БИНДА В MVVM и придуманы
Ну, очередные костыли накрутили и рады. Там, блядь, весь wpf костыль на костыле и костылем погоняет. Нахуй мс поддерживает эту парашу, которая даже на момент выхода была неудобным говном я хз.
>кнопка стартстоп, где триггерами целевая команда меняется в зависимости от чего то.
Покажи код такой кнопки
>перестаёшь тут нахуй бычить
А кто бычит вообще? Я как удав спокоен, это двачи, тут и на хуй могут послать, ты чего обидчивый такой?
>юзер контрол увидит твою хуйню только в своём юзер контроле
юзер контрол в юзер контроле? чо,блядь? Попроще можно? Юзер контрол это вообще что в данном случае? Если я кнопку и текстблок нахуярил вместе в проекте типа юзер контрол и затем вставил его на свое окно - ты это имеешь ввиду? Вот джва таких юзерконтрола, общаются они между собой через вьюмодель, верно? Чтобы все работало, нужны бинды, верно? я все правильно понял?
>Там, блядь, весь wpf костыль на костыле и костылем погоняет
сказал тот, кто не понимает зачем нужно MVVM и что это такое
когда созреешь до понимания что и зачем, вот тогда и приходи с вопросами. Впрочем ты не придешь тогда, ведь вопрос "нахера" у тебя не возникнет
А до этого хотя бы изучи RoutedCommand ну чтобы меньше говнокодить хоть немного
>Не поддерживает с 2013 года
но не потому что WPF плохой
просто из за наступления макак с их "веб на десктоп" приоритеты сдвинулись
но грядет мауи и там будет тот же самый хамл просто основанный на хамарин (те же яйца только со стилями лучше, но во много WTF)
Мдель это именно модель. в ней не должно быть бизнес-логики. Даже дата-репозиторий, дёргающий данные, не является моделью. VM в WPF - прокси между данными (model) и вьюхой (view)
>>816867
>чо,блядь? Попроще можно?
Боюсь проще некуда, если ты не понимаешь, зачем нужно разбиение вьюх как и всего прочего на отдельные компоненты, модули, контролы. Мне кажется, тебе просто не хватает опыта, чтобы это понять. Мы тут вдвоём втроём? пытались тебе объяснить с разных позиций, что наговнокодить можно и событиями, но по-человечячи если делать - биндинги - крута, но твоё невежество непробиваемо. Я тоже на самом деле когда только изучал WPF, думал ротебать этих биндингов и комманд особенно чё бля ёпту я щяс нахуй как привяжу события блять System.Interactivity блядь подключу блядь всё блядь будет нахуй. Но потом по мере работы всё больше и больше понимал, какая же это хуйня и как же элегантно выстраивается архитектура приложения на биндингах, вот так руки и выпрямились
правда потом я понял, какое же десктоп ненужное говно, и в итоге хуй знает зачем просто овладел этим проклятым wpf
ом и щас выше доказываю, какая же он ненужная хуйня
тебе да. я же отлично на нем зарабатываю.
>Мдель это именно модель. в ней не должно быть бизнес-логики. Даже дата-репозиторий, дёргающий данные, не является моделью. VM в WPF - прокси между данными (model) и вьюхой (view)
Да ты что, солнышко, блядь. Знаешь зачем эта вся хуйня сделана? Чтобы ты мог вырвать, нахуй свою вьюху для wpf и прилепить без проблем вьюху от asp.net mvc, просто выкинув нахуй в и вм и приляпав через контроллер вьюху asp.net mvc чилить сидеть дальше. Как ты это сделаешь, если у тебя в вм логика?
>Мдель это именно модель. в ней не должно быть бизнес-логики.
>VM в WPF - прокси между данными (model) и вьюхой (view)
Так, в модели логики не должно быть, вм это прокси между моделью и вьюхой...эммм, а где тогда бизнес логика должна быть?
пошли человека в хамарин где для одного слоая вьюмоделек разные виды под андроид и под айос
а если он скажет "у нас wpf же хуле мне твой хамарин", то напомни ему про тесты
ну а если тесты ему не нужны, то какой смысл дальше говорить
>Как ты это сделаешь, если у тебя в вм логика?
Вынесу логику в сервисы, тогда VM будет работать как контроллер
В хуервисы, где у тебя в аббревиатуре мввм буква "с" для сервисов твоих? Что, по сути, сервис твой? Service.cs в методах и функциях которого логика? И чем это отличается от ModelForLogic.cs в который я положу свои методы и функции для логики?
>где у тебя в аббревиатуре мввм буква "с" для сервисов твоих?
вот же на - MVsVM
>И чем это отличается от ModelForLogic.cs в который я положу свои методы и функции для логики?
Ничем, клади
вот путь развития от макаки до белого человка
Сказ в 3 частях. UI фреймворк не принципиален главное суть
1 сначала говнокодим как макаки, то есть по клику на кнопку делаем хендлер в классе формы где дергаем модель забираем данные, организуем их для визуальщины и отображаем вручную собирая вид
Ну где позволяет используем тот убогий BindingSource
2 Потом растем, читаем книжки про SOLID и чистые архитектуры и понимаем, что у нас в форме перемешан код и взаимодействия с моделью и построения визуальных контролов.
И для тестирования этого нужна специальная макака, которая будет тыкать на кнопки.
Ну или использовать дикие тулзы которые кликнут на кнопку и потом че то там доставать из контролов чужого приложения, что сам по себе пиздец
Немного подумав о том, что можно сделать учитывая данный фреймворк, у нас рождается MVP, то есть модель-вид+презентер
В презентер уезжает взаимодействие с моделью. То есть как теперь
а) модель есть модель
б) вид отправляет запросы в презентер и в виде остается только рисование (непосредственная работа с контролами) то есть (КАК РИСОВАТЬ)
в) на презентер возлагается запросы к виду, ну какая там еще визуальная логика и дергание вида с просьбой отобразить данные
презентер знает про вид через интерфейс. То есть презентер ничего не знает про контролы, а у него вид с интерфейсом "отобрази такое" (ЧТО РИСОВАТЬ)
то есть: вид дергает по клику презентер - презентер достает юзера из базы - презентер вызывает меод вьюхи "покажи юзера" и дает ему юзера - вьюха рисует
Обязанности разделили. каждый занимается своим делом. Ущербная, но тестируемость, но ущебрная. Отличный подход для WinForms в силу его ущербности
3 тут вам достается фреймворк который умеет в биндинги.
И так мы приходим к MVVM. Но зачем? почему не остаться в MVP? зачем менять P на VM? а вот:
1 презентер вынужден знать про вид, а значит вид должен дать ему контракт чтобы его презентер вызывал (который ничего не знает про контролы в общем то, а дает команды "изобрази это")
биндинги же позволяют ничего не знать про вид, а следить. то есть вьюмодель вообще не знает про вид ничего. Она знает про саму себя, а вид(ы) сами следят за ней и рисуют себя
2 можно строить иерархии вм, биндинг все разрулит.
3 Раз нет прямой связи вид - вюмодель - вид, то можно строить независимые иерархии контролов вида и иерархии вм
4 за счет шаблонов и биндингов рисование гуи получается декларативным и обычно ни строчки кода в code-behind
Больше свободы, больше изолированность (кто про кого знает), большая декларативность, отличная тестируемость - дернул команду, смотри состояние вьюмодели, нет ограничений как в MVP
вот путь развития от макаки до белого человка
Сказ в 3 частях. UI фреймворк не принципиален главное суть
1 сначала говнокодим как макаки, то есть по клику на кнопку делаем хендлер в классе формы где дергаем модель забираем данные, организуем их для визуальщины и отображаем вручную собирая вид
Ну где позволяет используем тот убогий BindingSource
2 Потом растем, читаем книжки про SOLID и чистые архитектуры и понимаем, что у нас в форме перемешан код и взаимодействия с моделью и построения визуальных контролов.
И для тестирования этого нужна специальная макака, которая будет тыкать на кнопки.
Ну или использовать дикие тулзы которые кликнут на кнопку и потом че то там доставать из контролов чужого приложения, что сам по себе пиздец
Немного подумав о том, что можно сделать учитывая данный фреймворк, у нас рождается MVP, то есть модель-вид+презентер
В презентер уезжает взаимодействие с моделью. То есть как теперь
а) модель есть модель
б) вид отправляет запросы в презентер и в виде остается только рисование (непосредственная работа с контролами) то есть (КАК РИСОВАТЬ)
в) на презентер возлагается запросы к виду, ну какая там еще визуальная логика и дергание вида с просьбой отобразить данные
презентер знает про вид через интерфейс. То есть презентер ничего не знает про контролы, а у него вид с интерфейсом "отобрази такое" (ЧТО РИСОВАТЬ)
то есть: вид дергает по клику презентер - презентер достает юзера из базы - презентер вызывает меод вьюхи "покажи юзера" и дает ему юзера - вьюха рисует
Обязанности разделили. каждый занимается своим делом. Ущербная, но тестируемость, но ущебрная. Отличный подход для WinForms в силу его ущербности
3 тут вам достается фреймворк который умеет в биндинги.
И так мы приходим к MVVM. Но зачем? почему не остаться в MVP? зачем менять P на VM? а вот:
1 презентер вынужден знать про вид, а значит вид должен дать ему контракт чтобы его презентер вызывал (который ничего не знает про контролы в общем то, а дает команды "изобрази это")
биндинги же позволяют ничего не знать про вид, а следить. то есть вьюмодель вообще не знает про вид ничего. Она знает про саму себя, а вид(ы) сами следят за ней и рисуют себя
2 можно строить иерархии вм, биндинг все разрулит.
3 Раз нет прямой связи вид - вюмодель - вид, то можно строить независимые иерархии контролов вида и иерархии вм
4 за счет шаблонов и биндингов рисование гуи получается декларативным и обычно ни строчки кода в code-behind
Больше свободы, больше изолированность (кто про кого знает), большая декларативность, отличная тестируемость - дернул команду, смотри состояние вьюмодели, нет ограничений как в MVP
Ты придурок или притворяешься? MVsVM же в казахстане делали, у них там латиница, конечно у них там будет s, а не c.
Идиот!
В либе, очевидно.
MVVM - это паттерн о UI целиком и полностью. И логика в нем только для интерфейса, бизнес-логику ты пишешь отдельно. Вот например:
Ты пишешь калькулятор на WPF, который может только в сложение двух чисел (специально очень простая задача, чтобы ты понял), a+b=c. У тебя вьюшка - это то, как программа выглядит, модель - твои данные, а вьюмодель связывает вьюшку и модель. Но модель никакого сложения не производит, у тебя сложение в отдельной либе. И когда тебе нужно получить c - ты делаешь следующее:
c = MyLiba.Addition(a, b).
Нахуя? Чтобы когда тебе внезапно понадобится сделать этот калькулятор в вебе или на андроиде (а в реальном мире это нихуя не внезапная потребность), ты не сидел и не дублировал логику из моделей WPF, а спокойно вызывал свою либу и радовался жизни.
мимо
>У тебя вьюшка - это то, как программа выглядит, модель - твои данные
Какие данные? Где в твоём примере данные? У тебя из вм дёргается либа. Где модель то?
>этот калькулятор в вебе или на андроиде (а в реальном мире это нихуя не внезапная потребность), ты не сидел и не дублировал логику из моделей WPF, а спокойно вызывал свою либу и радовался жизни.
Ну, вот твоя либа и есть модель по сути. Что ты её добавишь в проект, если переедешь на ведроид, что я в проект добавлю тупо свою модель и все работать будет искаробки, что у тебя, что у меня. Так почему ты так уверенно говоришь, что твоя либа это не модель нихуя?
>Так почему ты так уверенно говоришь, что твоя либа это не модель нихуя?
Либа - это модель. А если точнее, либа - это модели + бизнес-логика. Скажем, ты дергаешь из SQL юзеров. У тебя будет класс DataAccess, модель UserModel и, скажем, класс ModifyUser. Но это все - по сути кишочки твоей программы, отношения к UI не имеющие. UserModel в либе и в WPF - не одно и то же.
В такой программе у тебя вьюшка - вьюшка, модель - UserModel (НОВАЯ, а не из либы), а вьюмодель через либу просит юзеров или че-то с ними делает.
Нахуй дублировать модели? Как минимум, модель в WPF относится к UI, а не к бизнес-логике. Во-вторых, модель в твоем UI и в твоих кишочках может различаться. Простой пример - ты дергаешь юзеров вместе с датой создания аккаунта. Она нужна в гуе? Нет. В итоге у тебя либа берет юзеров с датой, а гуй получает без даты.
Удобно, например, когда ты этих юзеров получаешь через WebAPI: ты хочешь, чтобы через API можно было получить всю инфу о юзере, но для гуя тебе дата реги не нужна. Вариант 1: создать новый вид запросов к API, но это пиздец, да и не всегда ты владелец этого API. Вариант 2: делать запрос на всю инфу, как предлагаешь ты. Но если юзеров ты запрашиваешь много, то дохуя памяти будет просто так уходить на инфу, которая и не используется. Или вариант 3: ты делаешь запрос на всю инфу и обрезаешь ненужную, приводя первоначального юзера в удобоваримый для твоего гуя вид.
Мидл на галере 2+ людей. Недавно летом матрицу сдал(внутрений собес на должность мидла). А на проекте давно уже делаю задачи любой сложности.
это ж субъективно. зависит от того сколько языков ты знал до этого. срок может быть и пару недель даже
Могу ли я в шарпике убить нафиг GC и писать код без всех этих проверок ненужных, выделяя/освобождая память ручками?
Тогда можно
>делать запрос на всю инфу, как предлагаешь ты. Но если юзеров ты запрашиваешь много, то дохуя памяти будет просто так уходить на инфу, которая и не используется
И поэтому ты предлагаешь эту кучу юзеров одного класса перегонять в другой? То есть, мало того, что у тебя будет их в два раза больше, пока перегоняешь, так еще и время на это тратится, ведь пользователей дохуя. Браво, блядь, а потом начинается, мам, тормозит
На выбор есть несколько тем:
wpf - говно, правда или вымесел?
команды нинужны, стоит ли писать лишние строчки кода, чтобы в любой момент изящно запретить юзеру нажимать кнопку?
мввм - является ли логика моделью?
твой? ставлю.
а так это очевидные вещи
вид отображает
вьюмодели содержат модель (не путать с другой моделью) для отображения
а модель - собственно логика приложения
и нет никакой сложности определить к чему относится тот или иной код и где он должен быть логически расположен.
Ты не туда воюешь, это мне вчера тут орали и доказывали, что я еблан и в модели логики быть не должно
Хммммммм.
Как же у вас все замудрено.
А как называется следующая картина:
У нас есть сущность, она хранится в БД, она ничего не знает о бизнес-логике, просто представляет из себя строку в БД. Есть класс который бизнес логикой этой записи владеет, он знает что, допустим, возраст нельзя указать отрицательный или имя должно быть длиннее 2 символов. Ну и есть какая-то страничка, которая данные введенные отдает классу с бизнес-логикой, и соответственно рисует что-то в зависимости от того что скажет класс с бизнес логикой. Что тут чем является?
Нажал на вьюхе кнопку, сработал метод в вм, который взяв данные отправил их в модель, которая поглядела валидные ли данные. Далее метод из вм хуярит эти данные в БД, если они валидны. Все.
>что я еблан и в модели логики быть не должно
ну если почитать у вас тут просто безумие какое то
>>817533
>она хранится в БД, она ничего не знает о бизнес-логике,
знает или не знает, но она является моделью в MVVM.
В MVVM вообще все что не вид, то есть модель. Это концептуальное разделение основных слоев. Это не отрицает разбиение модели на слои типа слой бизнеслогики, слой персистенс, утилиты и т.п.
MVVM всего лишь описывает как выделить визуальную часть
Опишу как у меня было.
В школе я был тупенький, на уроках информатики давали паскаль. Ну, мне нравилось, я учил. Единственный во всем регионе сдавал информатику. Потому лучшие баллы, кек, по информатике в регионе, мне даже грамоту выдали за это, лол.
Так вот, поступил я в шарагу на кодера. Там давали Си. Ну и год дрочили си. И сказать честно я нихуя не понимал как писать сложные программы. Ну, т.е. простые, которые нормально в одном файле можно держать - пожалуйста, а банально какую-нибудь складскую программу по учету товаров, еще и с ГУЕм - не представлял.
Так вот, на втором курсе шараги у нас пошел шарп. И он был охуенен. С ним я быстро наращивал сложность программ, понимание как строить что-то сложное начало приходить, потому что не нужно было думать о куче мелких вещей. К концу второго курса я с такими вот днищескиллами смог найти работу .net-джуном.
Так вот, когда на 4м курсе нужно было писать диплом и научник настойчиво попросил делать это на С++, проблем с переходом к С++ уже не было никаких, потому что умея строить сложные программы, плюс имея коммерческий опыт разработки, переключиться на другой язык не так сложно, достаточно немного погуглить про моменты которые отличаются, типа управления памятью и прочим.
Короче, мораль. С# позволяет очень быстро нарастить сложность программ и не думать о примитивных вещях, сосредотачиваясь на том как модули взаимодействуют друг с другом. Когда ты это умеешь, остальное лишь вопрос пары минут гугления.
Нет, особенности работы с qt у qt ведь не только аналог винформс есть, у них там еще QT QML слишком сильно отличается от форм. Да и различия самих крестов с решёткой тоже дают о себе знать
Не, я может коряво объяснил. Вот есть формы, есть кути. По сути и то и другое для визуализации чисто. Кути же для питухона того же есть, например. Если смотреть с точки зрения визуализации тогда, сам алгоритм работы же похож? Накидал на форму контролов, обрабатываешь баттонклики? Или в кути по другому все?
Ну попробуй ёпта скачай qt express или как там он называется. Желаю тебе удачи и чтобы qt editor с 1 раза собрал все либы
Объясни, плес, в чем именно?
>>817718
>Желаю тебе удачи и чтобы qt editor с 1 раза собрал все либы
Кто? И что, он не может собрать свои либы, а виноват я или что?
Я просто спрашиваю. В чем подход другой? Чем отличается от форм? От wpf отличается? Чем? Я знаю, конечно, что можно с головой погрузиться, но до того, как прыгну, мне охото понять, в какую жопу я собираюсь шагнуть
во всем. Начиная от набора контролов и заканчивая тем что в кутях слоты
в общем если ты знаешь формы это значит что qt ты будешь как слепой котенок
то же самое можно сказать и про WPF
Интересно. Если не лень, можно простой пример? Вот в формах есть баттон, нажал, событие или биндинг обработали - метод выполнился.
А в кутях как? Не так что ли все работает?
Ну QT я бы назвал даже не фреймворком, а полноценным SDK со всеми его статическими и динамическими либами, бесплатными и платными изданиями и своими IDE. Вот их IDE - qt creator, можешь конечно попытать счастья в VS, но последний плагин под вижак я помню был на 15 студию, но если начнешь осваивать - я бы рекомендовал именно с qt creator. Так вот qt creator работает то ли на чистом cmake, то ли на своём враппере cmake, а cmake дело тонкое, чуть что не там файлы - ты нихуя не поймёшь, только в штаны насрёшь с ебанутых ошибок компилятора. Еще веселее было, когда у меня в qt creator'е какая то хуйня с локалями была, и эти ебаные ошибки выдавались даже не на русском/английском, а вот так
dwadj038%T#$)t50w48t_)TY_@_$@u-6t824u huyna.h line 22
awd_(UT$WTU)$_)_____$*TU$)U_)$WIJ OERH GT)H$W) huyna.cpp line 90
Это раз. Два - это отличия qt и winforms.
Я уже лет 5 не трогал qt, да и тогда трогал его только в академических целях, сделал 2 лабы на формах и QML и плюнул нахуй на эту дичь, ибо ну его впизду.
Так что мои понимания отличий поверхностные и неактуальные.
У крестов из под коробки нет событий, но их концепция в целом нужна в GUI приложений. Так вот эта система в qt реализована на слотах и сигналах, это как минимум первое отличие. Суть примерно та же, реализация совсем не та же.
Генератор кода, насколько я помню, в qt был слабее, чем в winforms, приходилось много бойлерплейта писать. Не сказал бы, чтобы крестовые нюансы прям сильно вставляли палки в колёса, но в целом шарп гораздо слаще крестов, поэтому ванлайнеры решётки превращаются в среднюю такую боль на крестах.
Контролы местами другие и работают по другому. Уже не помню точно, но вроде у text input'ов не было слотов событий, которые есть у аналогичных контролов в винформс и подобное.
WPF есть смысл сравнивать только с Qt QML, но к тому моменту qt меня так заебал, а qml показался таким ебанутым по сравнению с xaml, что я окончательно забил
Это MessageBox?
В старт приложения добавь
System.Windows.Forms.Application.EnableVisualStyles();
(ну и референс на System.Windows.Forms)
Так вот, как это в плане архитектуры должно выглядеть?
Допустим я сделал так:
У меня есть класс Worker, этот воркер раз в час делает запрос к API1 сравнивает что пришло с тем что есть и недостающее пихает в мою базу.
Но что если однажды нужно будет добавить новые данные, допустим из API1 нужно будет не один запрос, а 2 делать и как-то аггреригрвать результат? Или если апи изменится и отдавать будет не в том формате? Или я решу свою базу заменить выводом в консоль? В общем, как примерно было бы сделать такую штуку более гибкой, чтобы в случае чего не приходилось полностью переписывать класс Worker?
наверно просто по букве S из SOLID'а разбивай все процессы на отдельные классы
Какого хуя тогда всем этот куту нужен? Блядь, ну хуйня же? Нет, мы тут на куту пишем, а ты ничтожество, раз не знаешь, что событие это сигнал называется. Да ну? ДА! Это одно и тоже? Нет!! Этадрукое
откуда нам, шарпистам, знать что в голове у плюсовиков
для шарписта плюсовик нездоровый человек
>Какого хуя тогда всем этот куту нужен?
Если ты не ERP макака на галере, а делаешь продукт, который продаешь третьим лицам, то на шарпе особо не попишешь, ибо вскрывается на раз-два декомпилятором. Если пишешь на крестах, то qt там наверно самый продвинутый sdk для UI ну или електрон))0
нинужно
>ибо вскрывается на раз-два декомпилятором
Ща бы сидеть вскрывать все говно, что твои макаки наговнокодили, ага. Главное идея и реализация. Я уверен код фейсбука был уббог, код вконтакта был убог
Ну я рассуждаю по проприетарному софту типа автокадовских и адобиевских программ. Я думаю одна из причин, по которой они пишут на невиртуализируемых языках - это дополнительная сложность крякинга
который юзает плюсы, а не более адекватный язык
>Который может юзать указатели,
что они дают чего нельзя сделать в шарпе (ОСОБЕННО с ансейф)?
конечно не понимаю. это ж не я заявляю, что есть дохуя чего чего нельзя сделать на шарпе (и это с ансейф!!!), но можно на плюсах ибо есть указатели
насколько я помню, unsafe в шарпе не такой функциональный, как ты его себе воображаешь. ты не можешь например взять произвольный адрес и кастануть его к void*, а потом оттуда читать/хуячить в память напрямую. это можно делать с IntPtr и прочие вещи, но это очень долго и сложно
Во, спасибо.
Так и шарпист может, так что сосёшь ты. Иди джавистов тралль.
class Program
{
private static Object syncObject = new Object();
private static void Write()
{
lock (syncObject)
{
Console.WriteLine("test");
}
}
static void Main(string[] args)
{
lock (syncObject)
{
Write();
}
}
}
Потому что ты локаешь в том же потоке дважды. Второй лок видит, что он уже захватил этот ресурс и едет дальше
вызови Write через Task.Run(() => Write()); и позырь чо буде
Возмжно таск наследует лок из скоупа, в котором он был создан. Поставь эксперимент, где ты таск создаёшь вне lock'а в main
у монитора приписка есть
Obtain the monitor lock of obj. Will block if another thread holds the lock
Will not block if the current thread holds the lock
форматирование поплыло из за зведочек в коментах к монитору.
тут он повисает на втором локе, но из первого быстро выходит и сразу заходит во второй
поставь
Thread.Sleep() после Task.Run и увидишь что он будет ждать
А, точно.
Для них выбор продиктован требовательностью к производительности. На кряки и по большому счету наплевать, потому что основной доход у них от организаций, которым выгодней заплатить за лицензию, чем разорится на судах и выплате компенсаций.
В общем, на самом деле я давно хотел чего-то подобного. Вернее я хотел чтобы был вариант писать как в сишчке - без классов(хотя бы на уровне файла), потому что иногда они не нужны. Но пока единственное применение что я вижу в текущей реализации это какие-то совсем маленькие программки, потому что в больших - ну будет у нас один файл с этими "Top-level statements and functions". Ну и что? Погоды оно не сделает. А вот если бы можно было как на прикриплейд, то другое дело. Даже вижу кейсы для использования вот так вот. Например нужно константы хранить, оно довольно удобно ложилось бы на это все, каждый раз делать статичный класс для констант - ну реально же как-то неоч, а константы так или иначе много где нужны и разбить их по файликам бывает необходимо и получается что куча ненужного мусора в виде: public static class ProgramConsts{...}; public static class ServerConsts{...}; public static class SettingsConsts{...}; и т.д.
В общем, не знаю я. Было бы классно если бы тогда в 10 шарпе позволили без классов писать, пусть и с какими-то ограничениями.
>это какие-то совсем маленькие программк
Для этого и создавалось. В остальном не вижу проблем, кроме как неудовлетворенное "хочу как в сишечке". Твои includes можно заменить partial классами, и не нужно будет каждый раз смотреть что там заинклюдили и откуда.
>куча ненужного мусора в виде: ...
Мусор получится если ты всё это в один файл закинешь, а потом заставишь остальных гадать где какие константы лежат и вообще где они используются, а в твоём варианте сразу понятно к каким классам эти константы относятся. Можно вообще папки(неймспейсы) использовать для этого и везде у тебя будет твой Constants класс, просто с обращением через Server.Constants или Settings.Constants. Рефлексией можно будет легко собрать все константы, пройдясь по всем неймспейсам и вложенному классу Constants.
Я так понимаю это сделали чисто чтобы привлекать новичков, которых раньше при выборе языка могли отпугивать все эти class Program static Main, а теперь как во всяких Питонах/JS, понятно и младенцу.
Используйте SDK-style csproj всегда и везде и проблем будет меньше (или больше)
а вообще из одной студии нельзя копировать в другую (тупизм)
но если открыть в одном солюшене, то можно
Это тупая трата времени с их стороны. Пользы от нее ноль. В Programs обычно мало кода и по факту просто уберут вложенность
Лучше бы сбегали в другие языки, например котлин, и оттуда выдирали удачные подходы.
class Blog(int Id, string name, IList<Post> posts)
class Post(int Id, DateTime time, Blog blog)
мне надо через ЕФ Кор выбрать 5 блогов по времени последнего поста (это получилось) и два первых и два последних поста для этих блогов. Вот с этим, он меня посылает, то таблица 't' не сущестует, то could not be translated, то еще какая шляпа. Можно как-то написать такой запрос, не вытягивая на клиент все посты?
Вот тебя нужно послать в тему по EF, как наглядный пример того, что ORM не нужны )
Да не. Я конечно понимаю, что возможности орм сильно ограничены по сравнению с SQL, но в данном случае дело скорее во мне, а не в орм.
Получилось пока как на пике, не понятно почему нельзя написать Posts...Take(2).Union(Posts...Taske(2) что б на стороне базы объединение произошло.
На стороне базы делаешь таблицу с сортировкой по дате создания, а через EF берёшь Take(2) и TakeLast(2)
>TakeLast(2)
А есть хоть один провайдер в котором реализовано TakeLast?
>>818817
> делаешь таблицу с сортировкой по дате создания
Можно по-подробнее? Что за таблица? Я же могу свою таблицу Posts отсортировать. У меня проблема в том, чтобы выгрести и инфу о блогах и часть их постов за один запрос.
Если у тебя диплом в этом семестре, а ты всерьез задаешь такой вопрос типа реально-нереально разобраться, то не факт, что ты успеешь сделать какую нибудь васянскую ERP систему на винформах
Не, диплом у меня в след семестре, просто решил заранее решить этот вопрос, что бы потом не бегать с горящей жопой
Ну вот одумайся, пока не подписался. Я тоже выёбывался и в этот раз тоже выебнулся и брал ебанутую тему, потом либо просто проёбывал дедлайн, либо в последний день лютую хуйню делал лишь бы работало и приносил.
Раз это так запарно то лучше поищу другую тему, гугля что нибудь интересное для диплома я читал, что многие предлагают делать сайты или интернет магазины,такой вариант можно рассматривать или можно еще что то проще найти
У меня знакомые постоянно просят дать сайт, на котором можно прослушивать звонки знакомых или читать их смс. Если сделаешь такой - очень благодарен буду!
У тебя Яровая в знакомых?
И еще поиск соцсетей человека по фотографии. А то финдфэйс закрылся, а вещь-то полезная. Это же не сложно, а люди спасибо скажут. Тыжпрогаммист
Где можно найти инфу о том, какие изменения исходников сборки требуют перекомпиляции зависящих от неё сборок?
Например, если я добавлю приватное поле в reference-тип, это потребует перекомпиляции клиентов или нет?
По сути коры, но считается, что он объединяет в себя и то и то
Благодарю
И то и то, создается как раз для того чтобы не было двух веток, а была только одна - .Net c циферкой
Если у постов нет дат, но ID - автоинкремент, то можно просто по ID искать 2 минимальных и 2 максимальных значения. Ничего сложного.
А я бы на твоем месте не слушал тех кто отговаривает.
СУБД как тема диплома - интересно. Другое дело, что если это будет стандартная СУБД в который ты просто сделаешь индексы, хранимки, триггеры и прочий дефолт, то тебя могут спросить: "А что тут нового-то?", ну, это если вуз не совсем шарага.
Разобраться - реально, я правда по другой теме писал диплом, но однокурсник запили колоночная СУБД, буквально за неделю реализовал, еще неделю занимался оформлением диплома, изучение необходимой для реализации литературы, по его словам, заняло месяц.
> нет. дело именно в орм. абстрагируясь от базы ты получаешь проблему выражения запросов к базе в терминах орм.
А не абстрагируясь ты получаешь кучу копипастного кода и возможные проблемы в будущем.
Для примера, вот чел на работе писал нативные запросы к MySQL, было это давно и на джаве, так вот, чел ушел, продукт остался. В итоге клиенты не могут нормально поставить себе новый MySQL потому что он там чет подхитровыебанное писал для оптимизации запросов, никто лезть разбираться из кодеров сейчас не хочет. Юзал бы он ОРМ, достаточно было бы одну dll'ку заменить на ту что умеет с новыми версиями MySQL работать и никаких бы проблем с этим не было. А ведь есть клиенты которые купили какую-нибудь про-версию MS SQL и хотят ее использовать, вот ты будешь писать нативные запросы к каждой СУБД? А есть ли у тебя время чтобы каждой возможной СУБД написать запросы? А что будешь делать когда уже все СУБД поддерживаешь, и нужно буквально в одном месте один новый запросик делать? А если по солиду все это реализуешь, то в итоге у тебя самого выйдет новая ОРМ, так нахуя ты велосипед изобрел, когда есть нормальные решения?
нЕТ ТЫ НИ НАПНИМАЕШЬ ВЫ ФСЕ МАКАКИ МАКАКИ ВЫ ХАТИТЕ ПРОСТО ЧТОБЫ БЫЛО И УДОБНО НЕЕЕТТТ СУКА Я ЗАПЩИРАЮ МАКАЧИТЬ МАКАКА НЕЛЬЗЯЯЯ НАДО ВСЁ НАТИВНО ДЕЛАТЬ СУКА ТЫ ЧТЬО БЯЛЯТЬ НЕ ПАНИМАЕШЬ ОТ ВАС СУКА СОФТ ТАРМАЗИТ ВСЁ ТАРМИАЗИТ МАКАКИ БЛЯТЬЬБББ
>А не абстрагируясь ты получаешь кучу копипастного кода и возможные проблемы в будущем.
а абстрагируясь ты получаешь проблемы орм уже сейчас. 2 стула как ни крути.
>потому что он там чет подхитровыебанное писал для оптимизации запросов
если ему без ограничений орм понадобиось оптимизировать, то с орм тем более это ему было бы нужно и он такое бы нагородил, что вы еще без смены мускуля все за голову хватались. Чито поделать - орм не для оптимизаций
ну а про то что новый мускуль не поддерживает старые запросы это шутка такая чтоль?
Анонасы, посоветуйте гайды по visual studio, а также sql menegment. В шараге гайдов не дали, сижу, пержу, ищу сам.
> посоветуйте гайды по visual studio
Может тебе еще клавиатуру для кодинга подсказать чтоб программировать на 30% быстрее? Как тебя на ворлдскиллз отправили с такими вопросами?
> если ему без ограничений орм понадобиось оптимизировать
А ему, судя по всему, и не надо было оптимизировать, он просто сам решил что хочет, а это был 2005 - делай что хошь, лишь бы работало. Я правда не знаю были ли в то время ОРМ, я тогда только в 3й класс пошел.
> ну а про то что новый мускуль не поддерживает старые запросы это шутка такая чтоль?
Не знаю что там поддерживается или не поддерживается, потому что когда я пришел работать, никаких СУБД кроме MS SQL я не знал, а на работе для новых проектов использовали уже pgSQL. Суть в том, что при обновлении все ломается, а при откате на старый MySQL - работает, лезть в код этого проекта никто не хочет, потому что там хрен пойми как все работает. Один вот попытался, в итоге месяц возился-возился, а результатом возни было добавление в руководство строчки про то что работает на с такой-то версией MySQL работоспособность с другими - не гарантированна.
>работает, лезть в код этого проекта никто не хочет, потому что там хрен пойми как все работает
ну так это ваши проблемы что написано все через жопу
пишите нормально
зы: даже с вашей орм в случаях оптимизации придется костылить sql.
Хотя в наше время идут по пути "юзер богатый и докупит железа"
>> посоветуйте гайды по visual studio
>Может тебе еще клавиатуру для кодинга подсказать чтоб программировать на 30% быстрее? Как тебя на ворлдскиллз отправили с такими вопросами?
Туда всех с нулевыми знаниями берут блять
Надо соединить бек(asp.net core web api) и фронт (react+ts). Общее представление есть, хотел бы может какие то ресурсы/гайды или типа того что бы посмотреть примеры именно react+ts. Или может у кого будет вообще советы по коммуникации двух сторон.
Перечитал подходящие главы из книги ASP.NET Core and React(Carl Rippon), но в ней много неточностей и непонятной инфы.
.NET 5 - это по факту .NetCore 4, очередной ребрендинг, с намеком что вот теперь то это основная ветка дотнета.
Из менее маркетологических причин - начали сливать библиотеки в единую платформу, мол теперь CoreCLR - для серверов, Mono - для AOT, но крутится на них общая FCL
Зырь финт ушами.
Берешь докер.
Бек в контейнер для бека, там вся неткор хуйня
Фронт в контейнер с нжинском
В конфиге нжинкса делаешь чтобы запросы от клиента пересылались в контейнер с беком.
А, как я придумал. Я молодец? Я молодец!
Никаких сложностей то и нет, если проблемы не искать. На фронте можешь сделать набор методов, которые будут принимать подходящие для запросов параметры, делать запрос по домену бэка + константа с адресом + аргументы твои через, например, https://www.npmjs.com/package/axios, возвращать промисы. На беке просто делаешь веб апи контроллеры и получаешь запросы от фронта. Если нужно коммуникацию в другую сторону - дефолтный signalr.
Всмысле как? Берешь фронт,собираешь его для прода, затем парой команд для докера копируешь в контейнер с настроеным nginx, затем создаешь из образа - контейнер и биндишь к порту, все у тебя фронт в контейнере, nginx там только чтобы принимать соединения. В другом контейнере у тебя лежит бекенд. Так вот, когда у тебя из фронта запрос в виде: env.prod.BASE_URL/api/v0/Item/1, если ты настроишь по гайдам, бек получит этот запро, отдаст фронту, а фронт уже через nginx клиенту. Это все делается просто-быстро. Да, можно не nginx а ноду или что-тебе больше нравится, просто nginx простой и довольно популярный.
Можешь конечно чуть больше поебаться и запихнуть фронт внутрь проекта с беком, настроить там все, но это та еще ебота на самом деле, первый вариант хоть и кажется мудренным, на самом деле проще и удобнее, потому что фронт отдельно - бек отдельно, ты можешь проверить большую часть фронта не запуская бек, можешь проверить свагером апи бека.
Легко, фронт же должен отдаваться браузеру через какой-то хттп реквест. Т.е. нужен веб сервер. Обычно если фронт пилится на Vue/React/Angular, то там запущен сервак на ноде (сблеванул) и когда ты деплоишь новые сорцы (в твоём случае тайпскрипт), он компилит это в джаваскрипт и потом отдаёт эти статичные файлы (жс, цсс, хтмл, графику, шрифты) любому, кто сделал http request.
Dockerfile
FROM node:13.12.0-alpine
WORKDIR /app
COPY package.json ./
COPY package-lock.json ./
RUN npm install --silent
RUN npm install react-scripts@3.4.1 -g --silent
А потом запускаешь
docker build
Всё очень легко, всё делается за пол часа, всё гуглится с миллионом работающих примеров за минуты.
пик случайно приклеился
Насчёт Razor pages не скажу. MVC проекты вполне себе пилятся на реакте/ангуляре. Смотри гайды на метаните
>еще юзаешь докер?
Докер + helm + k8s + DevSpace = вообще не думаешь об инфраструктуре, пишешь код и деплоишь за секунды.
>>820724
На самом деле в нашем сетапе Докер только для компиляции образов (image building) делается. Так то можно хоть докер, хоть бульду buildah - ебучие бульдоги и ебучие собаководы! не могли нормальное лого для своего продукта сделать? пригорает., хоть kaniko, хоть podman. Они все умеют взять имеющийся докерфайл и сделать образ. Докерфайл можно за несколько минут в баш скрипт преобразовать, если очень хочется.
>деле в нашем сетапе
вся суть. сделал образ и трава не расти
а вот будешь разворачивать по другому запоешь
>Нормальные пацаны
Это ты так смузихлёбов назвал? Безсервеная архитектура хорошо для всяких stateless functions годится, когда надо чего-то быстро сделать - аутентификация, число посчитать, чего-то внутреннее для отладки, процесс какой-то запустить, аудит лог записать. Приложухи пусть пока будут на отдельно выделенном процессе (на кластере процессов) крутиться .
В моем хлеву с gcp работают, там уже не только функциями ограничиваются - App Engine, Cloud Run, базы данных. Хотя под капотом оно примерно кубернец и докер, конечно.
>gcp
У нас Azure и AWS. Мы их лямбды и функции тоже используем, но не как полноценные приложения, а для того, что выше перечислено было.
ага меня тоже это удивляет. что то похожее это glimpse, но оно ж заброшено да и для асп.нет же (не коре, хотя на коре 2 ставится)
Медленно продвигался, делая самый базовый функционал для взаимодействия и обработки полученной инфы. Весь код для консольного приложения работал нормально.
В общем стал переносить на форму в ВФ кнопочки, типа сделать-то, сделать другое, в кнопочки копипасть рабочий код. Все шло нормально, пока вдруг аддон Flurl не запорол малину отказавшись отправлять ерундовый запрос - причем в консольном приложении все работало/работает, а в форме, в виде запрогораммированной кнопки, нихуя.
Причем с первой кнопкой все нормально, результат ее работы строго тот же, что и запуск из консоли.
Разница между кнопкам в том, что первому адресу достаточно пустого GET запроса, а второму необходимы headers, которые я ему присылаю. Но это почему-то не срабатывает для формы.
Где я проебался? Почему один и тот же код работает в консольном приложении и отлетает с абсурдной ошибкой в форме?
ниче не понял но на картинке он жалуется что ты шлешь GET с телом запроса (что конечно возможно, но не родным клиентом)
тело запроса принято слать как POST же
>>820447
>Telescope
А чем вас встроенный функционал не устраивает? Кор отлично выплёвывает и запросы ко всяким АПИ и БД и тайминги и вообще всё что надо для телеметрии/мониторинга. Там уже всего встроено навалом, а ещё есть всякие Serilog, TelemetryClient, elmah и ещё куча независимых наработок.
И конечно есть
https://devblogs.microsoft.com/dotnet/introducing-dotnet-monitor/
https://docs.microsoft.com/en-us/dotnet/core/diagnostics/dotnet-counters
https://github.com/Microsoft/MIEngine/wiki/Offroad-Debugging-of-.NET-Core-on-Linux---OSX-from-Visual-Studio
dotnet-monitor - вообще сюда копай
Ну я скопировал всю инфу из запроса браузера. Там ГЕТ + набор header. Все тоже самое я ему и шлю. Кроме того, как я и сказал, этот же самый код работает из консоли.
нужно не для телеметрии, а для разработки
у тебя есть ендпоинт все вроде норм, но показывает 404
как узнать что там порешал асп что выдал 404, куда он там зароутил и не нашел?
встроенным функционалом плиз
и тому подобное.
Если у тебя Serilog/TelemetryClient, то в конфиге в проде меняешь флаг на Debug/Verbose/Trace где надо (он может и дефолтные системные события ловить) и смотришь что он выполняет, куда тыкается, какие рауты пытается запустить и прочее. Во всяких облаках это за тебя вообще абстрагированно во всякие красивые панельки, там даже свои собственные конфиги трогать не надо, оно за тебя всё загрузит.
Ну и dotnet-monitor.
>встроенный функционал
это какой еще? У меня есть web-api в релизе, нужно реквесты проверять, чекать запросы. В телескопе из коробки есть широкий функционал, для asp.net нашел только (похожее) под AWS, и то платное
>выплёвывает
и куда пишет, если нет логгера? Все, что ты перечислил, это логгеры
>смотришь что он выполняет, куда тыкается, какие рауты
вот больше делать нечего в разработке как логи читать.
достал ты своим продом.
прямо как в том анекдоте
"а вот если бы у рыб были блохи"
кроме тебя НИКТО не говорит про прод. Более того, поясняют, что это нужно НЕ В ПРОДЕ епрст, а в деве
такая панелька обычное дело для пхп, да даже для асп.нет это минипрофайлер или глимпс. А для кора чет ничего нету нормального
сырой "прод" висит, который дебажат 24/7. Прод он только потому, что конечник может чекать API, все еще в процессе разработки
Kibana, Elmah, App Insights, https://newrelic.com, https://grafana.com. Там нормальный поиск и группировка всех логов и телеметрии. Некоторые могут помочь навесить алерты и информаровать о высокой нагрузке, куче ошибок и прочему.
Есть ещё такие поделия https://github.com/mo-esmp/serilog-ui
вот только такие вещи как телескоп они не для релиза
разные подходы, разные ожидания от того что должно быть.
Я на коре в хайлоад прод пилю уже 3 года и не жалуюсь на отсутствие инструментария. Отладка косяков даже в твоём ненавистном проде занимает от нескольких минут до нескольких часов. Локально вообще секунды-минуты любая проблема устраняется. Даже когда работаешь с каким-то магическим 3rd party API, который ведёт себя не по документации (которой и нет).
спасибо
>Я на коре в хайлоад прод пилю уже 3 года и не жалуюсь на отсутствие инструментария.
звучит как "я в блокноте пишу и мне норм. значит IDE никому не нужны"
или "я папки зипую и мне норм. ваши гиты не нужны"
Нет, это просто значит что ты не знаешь/не понимаешь как работать с выданным тебе инструментом. У меня были коллеги, которые ломали гит репо, и потом жаловались что гит говно, потому что делает какую-то ерунду. Вот было бы так как в SVN/TFS/Perforce!
А на самом деле они не только не знали как с гитом нормально работать, а даже учиться не хотели. Но момент пожаловаться никогда не упустят.
ты щас вообще о чем? причем тут вообще гит?
гит, конечно, говно, но в данном контексте он вообще не причем
потому что называю вещи своими именами?
это не делает меня не программистом.
и желание иметь что-то что помогает мне в разработке больше чем тупая консоль, тоже не делает меня не программистом
так что мимо. Я свои слова могу обосновать, но это выйдет за рамки этого треда.
И уж точно говнистость гита не относится к сути моих слов ранее, потому что гит там упомянут просто до кучи
а у коре сделали хранение логов в файлах? последний раз ставил чей то велосипед с нюгета
а вообще серилог это про структурные логи, хотя Nlog тоже могет
На данный момент я попробовал другой аддон. RestSharp кажется. С ним все примерно то же самое. Исключений нет, однако сервер выдает заглушку, типа у вас не доступа к этой странице. Опять же, запрос содержит точь-в-точь такой же набор заголовков, метод. Все это я просто скопировал из браузера и все работает в консоли.
Вот этот запрос с консоли выдает те же результаты, что и браузер. Через форму - хуй. Я в замешательстве. Приложение с нормальным интерфейсом гораздо предпочтительнее для меня, чем вводить циферки в консоли. Я даже нагуглить ничего не могу.
Мне кажется, что форма чем-то выдает себя из за чего сервер отказывается ей отвечать, как браузеру.
>звучит как "я в блокноте пишу и мне норм. значит IDE никому не нужны"
>или "я папки зипую и мне норм. ваши гиты не нужны"
>своими именами
Сначала пожаловался, что у него инструментов не хватает или они не работают как ему нравится. Потом написал какую-то хрень про свои фантазии с блокнотами и гитами (именно что "своими именами", сам придумал, сам назвал). Затем, когда ему сказали что панелька в пхп вообще не сравнима с инструментарием в дотнете, его заклинило на гите.
>А для кора чет ничего нету нормального
Освой выданный тебе инструментарий сначала нормально, потом утверждай.
Чтобы бэкенд-девелопер занимался бэкендом, а фронтенд-девелопер занимался фронтом.
Оригин то зачем убрал? И если в заголовке тип контента, значит с запросом нужно отправлять данные, вообще так гадать сколько угодно можно, если хочешь чтобы помогли, то делай так чтобы проблему воспроизвести можно было.
<Grid.RowDefinitions>
<RowDefinition Height="auto"/>
<RowDefinition Height=""/>
</Grid.RowDefinitions>
<Grid.ColumnDefinitions>
<ColumnDefinition Width="250"/>
<ColumnDefinition Width=""/>
</Grid.ColumnDefinitions>
Теперь я хочу чтобы было не 250, а бинд на мою переменную, которую буду изменять в коде, и вот эти изменения должны отражаться. (то есть нажал кнопку и вместо 250 будет 500)
Но в голове каша
написал так
public int PanelSize { get; set; }
<ColumnDefinition Width="{Binding PanelSize, RelativeSource={RelativeSource FindAncestor, AncestorType=Window}}"/>
Но нихера не происходит при изменении PanelSize
Либо как-то по другому, можно без этих биндов получить этот Width?
Мне просто надо самым минимумом сделать, а не написанием огромных классов для маленькой задачи. Но и как получить ColumnDefinitions Width я тоже не шарю
>Потом написал какую-то хрень про свои фантазии с блокнотами и гитами (именно что "своими именами", сам придумал, сам назвал)
дядь. ты перечитай тред что ли
А именно хотя бы эту пару постов - мой, где гит упомянут, и тот на который он был ответом. Ну можешь и далее свой про гит. А потом подумай и еще раз подумай и еще раз подумай и именно подумай.
>его заклинило на гите.
так это тебя заклинило. о нем РЕЧЬ ВООБЩЕ НЕ ШЛА. читай внимательнее, учитывай контекст
>Освой выданный тебе инструментарий сначала нормально, потом утверждай.
ну вот опять.
да они и так будут ими заниматься. банально в силу их знаний они не смогут заниматься не тем.
Значит не будет. Я из тех, кто "я только спросить"
все что касается браузера - фронтенд
все, что касается сервера - бэкенд
для фронта нужно знание html/css/js, чтобы в браузере все работало как надо
для бэкенда нужно на чем то логику писать, базы данных знать, кеширование и так далее
V в MVC относится к серверному рендерингу шаблонов. Razor выполняется на сервере. То есть это бэкенд.
Я последний раз ВПФ лет 5 назад использовал, потому элегантного и правильного решения не предложу.
Но как вариант вот тебе говнокодерское. Даешь твоему гриду имя. Достаешь из него твой ColumnDefinition, где-то хранишь, значение и при нажатии кнопки меняешь значение его свойства Width. Да, как я сказал - говнокодерство, но это намного проще сделать если тебе действительно нужен минимум.
Ну, я просто думаю что если быть уверенным в своих знаниях - с мандражом полегче будет справиться.
Потому что слишком зелен и не смог разобраться, а в случае с этими расширениями все оказалось понятнее. Кстати, а в чем разница, если эти аддоны внутри себя используют те же базовые методы?
>>821016
C оригином выходит тот же самый ответ: Permission Denied. На самом деле, там нужен единственный заголовок, как на первом скрине. Из консоли я получаю страничку с инфой, которую далее обрабатываю.
На втором скрине, происходит такой же запрос(?), но из формы, однако ответ как если бы пользователь без прав перешел по ссылке, куда у него нет доступа. Но доступ-то должен быть, я подтверждаю его заголовком, это мои собственные данные из браузера.
Кажется дело в том, что через форму сервер почему-то сбрасывает сессию логина, то есть отвечает мне как незалогиненому пользователю - на скрине видно меню-форму для логина. А из консоли это меню сменяется на список с опциями и разделами, который пользователь может видеть после логина. Это уже хоть что-то. Спасибо, парни. Осталось понять, что с этим делать.
да нет никакой разницы откуда ты запрос делаешь. Ты просто что то накосячил
>V в MVC относится к серверному рендерингу шаблонов. Razor выполняется на сервере. То есть это бэкенд.
Но ведь это касается браузеров, там html, css и js, это UI веб-приложения. Как же это не фронтенд?
Отделяй мух от котлет.
хтмл/css/js это фронтендерское. фронтендер (в данном случае верстальщик) это создает и отдает бэкендеру
а бэкендер делает из них шаблоны, прокидывает данные, собирает и рендерит в результат.
Вот тебе аналогия еще.
Например вертальщик верстает страницу по макету что ему дизайнер дал, использует картинки от дизайнера, подготавливает спрайты, ассеты (или что он там делает), но это ж не делает его дизайнером.
Так что где бы ни был хтмл создавать его фронтендеру. Для бэкендера это просто шаблон который нужно отрендерить и заполнить
как то я сложно выразился. короче
дело фронтендера работать с "там html, css и js, это UI веб-приложения". Он это и создает. И если что то должно быть получено с сервера - дело бэкендера организовать это получение. И это либо полноценный рендер шаблонов либо просто статик хтмлки.
Ну блин не знает фронтендер про Razor, про асп.нет, про MVC
а бэкендер не знает про хтмл, стили, заебы браузеров и так далее.
Так что никто из них не сможет залезть в чужую область.
https://docs.microsoft.com/ru-ru/dotnet/csharp/whats-new/csharp-8
Какой-то джаваскрипт нахуй, какие-то локальные стат методы, индекс-хуиндексы. Зачем всё это говно пихать в C#. Могли бы тогда отдельно выпустить Си Скрипт какой-нибудь. Я просто в ахуе во что код превращается со всеми этими конструкциями. Сейчас ещё джуны начнут это говно подхватывать. Сокращая код такими конструкциями ты его не делаешь более понятным.
Это обычный процесс - по ходу жизни простого инструмента он усложняется и предъявляет большие требования к квалификации. А потом появляется новый простой и удобный инструмент, за который садятся начинающие. Подобное с играми Paradox Interactive постоянно - со старта играть норм, а через несколько лет вкатываться - непонятно.
А касательно конкретных изменений 8 версии - мне нравятся новые функции свича, юзинг, индексы и диапазоны (хотя больше работаю на 7.3). Асинхронные потоки тоже интересно было бы потрогать. Остальное не особо интересно для меня, но так и должно быть с языком широкого назначения.
>ты его не делаешь более понятным.
Потому что долбоебу вроде тебя лень учить новое и более удобное? Так это не джуны виноваты, а ты.
ничего не поделать. есть хидер HEAD но ты же шлешь POST так что сервер вынужден сформировать тебе ответ. Да и в любом случае вынужден
Прискорбно.
Нашел такую настройку, но она экономит ресурсы клиента.
>HttpCompletionOption.ResponseHeadersRead;
Не могу, я всего лишь модер. Админ проебался и неизвестно когда появится. А если такая настройка уже есть на сервере, можно ли об этом как-то узнать, на заходя на него? Вообще есть какой-то способ узнать об доступных API сервера извне?
>а бэкендер не знает про хтмл, стили, заебы браузеров и так далее.
Так как он может этого не знать, если cshtml файл, он же View в MVC приложении, всё это в себе содержит? Или если это Razor Pages приложение, то cshtml @page файл.
ну он знает хтмл, он же не идиот. Его ж невозможно не знать. Но знает его ровно на уровне "мне дали хтмл, я превращаю его в шаблон для razor". Но в верстке он никакой, и если где то плывет верстка - это не его проблема. Его задача рендеринг шаблонов и заполнение их данными.
Да что угодно. Задача бэкендера чтобы вид генерился как надо. Для этого он использует шаблонизацию, проброс данных, таг хелперы. Даже если это стили или жс, или даже текст, что заполняются на лету.
Но не он же этот хтмл, стили и жс придумывает.
>>821414
>>821466
Да, что-то я хуйню вчера сморозил. Сам ведь активно пользуюсь фичами из версии 6 и 7. А сегодня использовал новые свичи из версии 8. И мне понравилось.
Хотя насчёт локальных методов не уверен. У кого-нибудь есть хорошие примеры их использования? Просто, если метод сложный, то его всегда лучше разбить на простые методы и тогда смысл в локальных методах отпадает сам по себе.
> то его всегда лучше разбить на простые методы
Ну так ты не останавливай мысль. Вот тебе наводящий вопрос
вот у тебя был 1 метод. ты его рефакторил и разбил на 3. куда положить 2 выделенных метода если они не нужны никому больше в классе кроме текущего метода?
Типа у меня структура весит 1000 байт, передал в метод получилось я перегнал 1000 байт, вернул из метода еще 1000.
Сделал цепочку методов (10 штук) которые чекают что-то в структуре, но не меняют ее, получилось 10х1000 байт перегнал?
>Правильно ли я понимаю что каждый раз когда я передаю в метод или возращаю из него свою структуру, то я произвожу операцию копирования?
Да. Чтобы этого избежать используют ref модификатор параметра либо ref структуры в новых редакциях языка. Если ты передаешь класс, т. е. ссылочный тип, то передается копия ссылки, если структуру, то передается полная копия данной структуры. Именно поэтому структурами рекомендуется объявлять сущности небольшого размера.
Но минус ref модификаторов в том, что их нельзя использовать в async методах.
Да очень просто без задней мысли берешь и всё настраиваешь. Там я неправильно выразился, по сути тебе нужно делать web api, который вьюхи реакта/ангуляра будут просто дёргать для обмена данными. Именно дотнетовские вьюхи абсолютно не нужны.
В общем случае да, если какие-нибудь вызовы не заинлайнятся.
Нужны именно хорошие примеры или информативные источники, спасибо.
когда то решил изучать его, но он мне не нужен, но вот что я в итоге отложил в заметках
"где доки?
А нигде. https://github.com/xunit/xunit/issues/1018
приходится читать статьи
Comparing xUnit.net to other frameworks
https://xunit.github.io/docs/comparisons.html
Введение в написание тестов и знакомство с xUnit
https://habr.com/post/357648/
Shared Context between Tests
https://xunit.github.io/docs/shared-context.html#class-fixture
TheoryData
https://andrewlock.net/creating-parameterised-tests-in-xunit-with-inlinedata-classdata-and-memberdata/
https://hamidmosalla.com/2017/02/25/xunit-theory-working-with-inlinedata-memberdata-classdata/"
Благодарю!
fire-and-forget называется
loop(10)
{
... что-то делаем
}
Приходится каждый раз писать статический метод loop(int, Action<int>), но у этого есть минус, если нужно выйти досрочно из цикла, потому если наужно таки выйти досрочно приходится делать метод loop(int, bool, Action<int>), в котором бы проверялось условие досрочного выхода, это неочень удобно.
Потому что в С# используют LINQ
Клиент игры. В разных местах UI игрок может посмотреть на коллекцию предметов, отфильтрованных по типу. В одном месте он может посмотреть на скины-оружие и покрутить их в 3д, в другом - посмотреть на портреты, а в третьем - на емодзи.
GameItem представляет конкретный игровой предмет и хранит: Id, Type[skin,weapon,portrait,emoji], Rarity[comon,rare,legendary], иконку, 3д модель
GameDatabase хранит все игровые предметы разбитые по типу: Skins, Weapons, Portraits, Emojis. Дополнительно он хранит список UniqueItems - это особые предметы, которые доступны в коллекции только, если они попали в инвентарь игроку (например, это может быть новогодний подарочный скин). И список ItemsPacks - это игровые наборы, которые хранят в себе до 5 игровых предметов.
В GameDatabase можно узнать: IsUniqueItem и IsItemPartOfPack по itemName.
BackendService хранит данные игрока и его инвентарь с сервера, стоимость и скидки на игровые наборы, список Discounted и Time-limited наборов. Предметы из Time-limited наборов доступны к покупке только ограниченное время, допустим 12 дней, потом они исчезают из коллекции.
В BackendService можно узнать: IsDiscountedItem и IsTimeLimitedItem по itemName.
Итак, к сути вопроса. Когда игрок открывает коллекцию, то мне нужно показать актуальные игровые предметы для него и скрыть те, которые сейчас недоступны. Для этого мне нужно обратиться как к GameDatabase, так и к BackendService. Кто и на каком уровне должен проводить фильтрацию и сортировку предметов для коллекции? Это явно не GameDatabase, который выступает простым хранилищем. Это либо BackendService, либо какой-то отдельный класс, объект которого будет создаваться для каждой коллекции свой, типа GameItemRepository(database, backend);
Можно добавить новый класс:
public class GameItemData
{
public string Name;
public bool Locked; (находится ли предмет в инвентаре)
public bool Discounted; (находится ли предмет в скидочном наборе)
public bool TimeLimited; (находится ли предмет в ограниченном по времени наборе)
}
Заполнять и возвращать эти данные будет BackendService:
backend.Store.GetSkinsAndSortBy(GameItemsSort.Rarity);
BackendService снаружи не знает о GameItem и о GameDatabase. Но внутри он хранит и использует ссылку на GameDatabase. Когда я буду заполнять коллекцию для UI, то буду работать и с GameItem, и с GameItemData.
Клиент игры. В разных местах UI игрок может посмотреть на коллекцию предметов, отфильтрованных по типу. В одном месте он может посмотреть на скины-оружие и покрутить их в 3д, в другом - посмотреть на портреты, а в третьем - на емодзи.
GameItem представляет конкретный игровой предмет и хранит: Id, Type[skin,weapon,portrait,emoji], Rarity[comon,rare,legendary], иконку, 3д модель
GameDatabase хранит все игровые предметы разбитые по типу: Skins, Weapons, Portraits, Emojis. Дополнительно он хранит список UniqueItems - это особые предметы, которые доступны в коллекции только, если они попали в инвентарь игроку (например, это может быть новогодний подарочный скин). И список ItemsPacks - это игровые наборы, которые хранят в себе до 5 игровых предметов.
В GameDatabase можно узнать: IsUniqueItem и IsItemPartOfPack по itemName.
BackendService хранит данные игрока и его инвентарь с сервера, стоимость и скидки на игровые наборы, список Discounted и Time-limited наборов. Предметы из Time-limited наборов доступны к покупке только ограниченное время, допустим 12 дней, потом они исчезают из коллекции.
В BackendService можно узнать: IsDiscountedItem и IsTimeLimitedItem по itemName.
Итак, к сути вопроса. Когда игрок открывает коллекцию, то мне нужно показать актуальные игровые предметы для него и скрыть те, которые сейчас недоступны. Для этого мне нужно обратиться как к GameDatabase, так и к BackendService. Кто и на каком уровне должен проводить фильтрацию и сортировку предметов для коллекции? Это явно не GameDatabase, который выступает простым хранилищем. Это либо BackendService, либо какой-то отдельный класс, объект которого будет создаваться для каждой коллекции свой, типа GameItemRepository(database, backend);
Можно добавить новый класс:
public class GameItemData
{
public string Name;
public bool Locked; (находится ли предмет в инвентаре)
public bool Discounted; (находится ли предмет в скидочном наборе)
public bool TimeLimited; (находится ли предмет в ограниченном по времени наборе)
}
Заполнять и возвращать эти данные будет BackendService:
backend.Store.GetSkinsAndSortBy(GameItemsSort.Rarity);
BackendService снаружи не знает о GameItem и о GameDatabase. Но внутри он хранит и использует ссылку на GameDatabase. Когда я буду заполнять коллекцию для UI, то буду работать и с GameItem, и с GameItemData.
foreach i in Enumerable.Range(0, 1)
Сука, тебе мало синтаксиса в шарпе? Блядь, я год работаю на нем и еще год в качестве хобби, и ощущение, что я новичок
> (0, 10)
Мало. Хоче чтобы был способ делать асинхронщину еще проще. Типа просто пишем: async Object и не нужно каждый раз писать Task<Object>. Оч бесит его писать, когда у тебя там что-то типа : async Task<IZalypa<IPizda<IJopa>>> Почему бы просто не писать IZalupa<Pozda<IJopa>>? А еще хотелось бы чтобы был синтаксис для анонимных функций который позволял бы выйти из основной функции сразу. Короче, много чего хотелось бы в плане синтаксиса.
На такое только большим текстом и отвечать, что для двачей не формат.
Если коротко, то учи SOLID.
У тебя всегда должен быть только один source of truth для чего угодно. А сейчас ты хранишь предметы и на клиенте и на сервере (если я правильно понял). Если есть сервер, то он должен быть твоим источником правды и должен хранить текущее состояние твоей игровой сессии. Клиент своё состояние должен получать от сервера.
GameDatabase и BackendService - плохие названия в данном случае, потому что не отображают конкретное назначение. Нужно разбивать на более детальные классы: инвентарь, предложения (discounts и timeLimited), предмет (он должен содержать о себе всю нужную инфу, такую как unique, name, type), набор предметов (через всякие hashmaps можно быстро узнать, является ли предмет частью этого набора), игровой менеджер, персонаж, сервис для запроса к серверу (отправить новые данные, получить текущее состояние) и т.д..
Серверу пофиг, как ты там свой UI организуешь. Ему главное хранить текущее состояние объектов (игрового мира).
Сервер и клиент должны общаться друг с другом посредством контракта. Если изменение какого-то слоя на сервере (помимо самого контракта) влечёт за собой изменение клиента, то значит архитектура поехала и ты делаешь что-то не так. То же самое работает и в обратную сторону.
>В котлине все по дефолту асинхронное?
нет в котлине добавил функции suspend и она становится как async в шарпе, но при этом внешний вызов не требует писать await. код вообще не меняется.
>внешний вызов не требует писать await
Так это разное поведение, с await ты ждёшь выполнения асинхронной функции, а без await выполнение кода продолжается не дожидаясь выполнения асинхронной функции.
это корутина. без await она никуда не уйдет и будет ждать завершения корутины
а async/await нужен если у тебя не одна такая корутинка и нужно чтобы дальше пошло и можно было еще корутинок запустить, то есть аналог var task =
а если у тебя в шарпокоде нет var task= , то и await тебе не нужен
>а если у тебя в шарпокоде нет var task= , то и await тебе не нужен
Как это не нужен? А если у меня есть асинхронный метод, который используется в разных участках кода, при этом в некоторых участках кода нужно ждать выполнение метода, а в других участках нужно просто запустить его выполнение и продолжить, т. е. у меня нет var но при этом где-то есть await, а где то его нет.
вот в шарпе ты пишешь
awat Foo();
await Bar();
Это означает что у тебя в месте await поток освободит и даст поработать другому пока Foo() и Bar() работают. Но Bar() будет выполнено после Foo()
в котлин синхронно так
foo()
bar()
эти вызовы будут сделаны в одном потоке.
но если эти функции помечены как suspend, то этот код будет выглядеть вот так
foo()
bar()
то есть абсолютно так же
но будут вести абсолютно идентично тому, что выше на шарпе - в месте вызова foo() поток даст поработать другим и будет ждать результата foo(), а потом вызовет bar() и снова даст поработать другим пока bar() не отработал
а вот если тебе нужен аналог var task/future то тут уже понадобится async/await чтобы котлин не ждал выполнения этих корутин, а реально пошел дальше и вел себя как TPL в шарпе
причины необходимости "когда нужен var task" те же что и в шарпе, когда ты уходишь от обычного await и опускаешься до TPL. Иначе же писать await не нужно - котлин сам знает что это корутины и нужно подождать на них (дав поработать иначе) пока кодер сам не захочет не ждать (подключит async/await в привычном виде)
В шарпе, написав/увидев await перед асинхронной функцией я понимаю, что выполнение кода может продолжаться в отличном от того, который выполнял код до await, потоке. Это нужно брать во внимание когда идёт синхронизация обращения к данным, как пример есть класс ReaderWriterLockSlim у него есть методы EnterReadLock и ExitReadLock которые должны последовательно вызываться из одного потока. И как мне в котлине знать, что вот этот как await а вот это нет?
Ну код же не в блокноте пишешь. IDE показывает места где вызов функции есть вызов корутины.
1 неуловимый джо - твой софт недостоен ковыряния
2 очень злой джо - твоя ца энтерпрайз где за факт взлома их так нагнут, что им проще купить, чем рисковать
3 Ключевой функционал унести на сервер.
4 CoreRT может сделать тебе нативный бинарник который ковырять сложнее (но это уже свой гемор)
Ну т. е. ручками каждый раз наводить на вызовы и смотреть тип функции? Потом еще раз наводить, на всякий случай, вдруг вот на эту ты не наводил. Ясно.
да нет же
вот лучше пример. прекрасно видно что в данном месте происходит разрыв контекста (то бишь вызов корутины)
Так это не удобно. Приходится на поля смотреть, когда ты думаешь о коде, то смотришь на код, а не на поля. И get("") воспринимается как обычный блокирующий вызов.
нуу это уже критика из разряда "а где точка с запятой, как я отличу одну инструкцию от другой"
нет никаких проблем если пишешь на языке. даже не замечаешь этот аспект
в отличие от ConfigureAwait который не только замечаешь, а и бесит
к тому же такое доступно только в функциях suspend (как и в шарпе только в async) а не вообще везде. Если слово async/suspend замечаешь и не понимаешь что это значит что внутри будут вызовы других корутин...ну значит котлин не для тебя
да и в шарпе только анализатор подскажет что функция возвращет Task, а ты написал ее просто так ибо не знал, что она с Task
Это мой домашний проект за который мне некоторые кидают донаты и я хочу дать им чуть больше функционала, потому что именно они его запросили и только из-за них я решил это сделать.
1) к сожалению ковыряют, я пробовал добавить тупо по ключам с HWID, раздал 10 ключей и отслеживал запуски, было более 40 штук, т.е 30 человек откуда крякнутую версию взяли.
3) не хочу содержать сервер и бороться с проблемами блокировок и прочей фигней, уже пытался в другом проекте так делать и это просто боль, по всему миру все друг друга блокируют и твой сервер может быть тупо недоступен для этих людей
4) у меня есть возможность в проге что-то типа плагинов делать, поэтому наверное такое мне не подойдет, сломает все к чертям.
Обидно что .net приложения очень легко ломать, от чего писать что-то сложное что можно продавать как премиум тупо отпадает желание.
>The type or namespace PackageName does not exist in the namespace Microsoft (are you missing an assembly reference?)
могут быть проблемы если проект не собирается и ставишь нюгеты
и что забавно именно нюгеты нужны чтобы он собрался
ребут студии помогает. иногда даже удаление .vs
Пытаюсь слить несколько проектов в один. Все проекты до этого собирались, никаких проблем с установкой пакетов не было.
Не может преобразовать стринг в чар. Да банально перегрузки этой нет. В коре у этого метода 10 перегурзок, а в фреймворке всего 6. Разные версии языка что ли?
Версии проектов смотри. Некоторые пакеты с некоторыми проектами и некоторые проекты не будут совместимы.
Воспользуйся этой сигнатурой: Split(String[], StringSplitOptions)
.Split(new string [] { "hui" }, StringSplitOptions.None);
Спасибо!
Типа хочешь подписать приватный event на приватный же метод?
Если выцепил этот метод MethodInfo method
И выцепил событие EventInfo eventInfo
То
1) Создаешь делегат
handler = Delegate.CreateDelegate(eventInfo.EventHandlerType, target, method) (target - инстанс на котором метод вызывается, ну или бери перегрузку без него, если метод статический)
2) Подписываешь его к событию
eventInfo.AddEventHandler(eventSource,handler) (где eventSource - инстанс который event поднимает)
Ежели AddEventHandler не работает из-за проверки видимости ("бла бла бла нет публичного метода add")
То нужно рефлексией вытащить сгенерированный компилятором метод подписки, и вызывать уже его (обычно на событие ShitHappened метод будет зваться add_ShitHappened)
Почему бы не использовать unity?
1) питон и джанго
2) шарп и дотнет
к обоим язык отношусь хорошо. Шарп привлекает чуть больше тем, что у него статическая типизация и по субъктивному моему мнение, он лучше для бекэнда заходит
Но на питоне вариант вкатиться прям на текущей работе, потому что стек в беке питон + го
ты же понимаешь что этот вопрос не имеет смысла?
в теме про шарп будут выбирать шарп
а в теме про питон будут выбирать питон
ну тут вопрос не про языки как таковые, а про работу на них в сфере бекенда в СНГ
Зависит от локации. У меня дотнетный город (запад Украины) - много вакансий есть и на легаси, и на новье, но на пайтоне что-то тоже есть. По моим впечатлениям от комментов на дваче, в РФ с дотнетом потуже. Ориентируйся по сайтам поиска работы.
Анон, спасибо тебе, недельную таску выполнил за пару суток
спасибо
Смотри что в вакансиях твоего региона требуется, то и учи. Может быть у тебя там только для легаси шарп нужен, тогда изучая .net core ты по большей части время потратишь и будешь типа >>825316 вопросы задавать. А может быть у тебя там все на докерах-хуекерах сидят - нужно будет учить как деплоить докером. А может быть у тебя там извраты и они во встройки впихивают .net, тогда вообще весело будет. В общем, смотри вакансии, требования к ним и гугли незнакомые слова.
В самом статике ничего плохого нет. Если это stateless класс, который легко покрыть тестами - то вообще никаких проблем. Если есть state, то надо убедиться что оно thread-safe. Если это классы внутри Startup scope, то вообще пофиг. Эти вещи нужны для инициализации всего приложения и покрываются интеграционными тестами.
Ну, я использую статику чтобы разгрузить основной класс от всяких вспомогательных методов. Типа вот у меня есть метод JoinXwithY(X, Y), мне не хочется чтобы реализация этой штуки была в методе т.к. метод join в linq довольно здоровый выходит, я вынес это в метод, но если подумать, зачем этот код внутри этого класса - потому я выношу в отдельный статический класс. Ну или мне не нравится писать каждый раз string.IsNullOrWhiteSpace(str), я сделал метод расширения str.IsEmpty(), но ведь вдруг кто-то проебет класс с этими расширениями и получится что половина кода программы - красная. Ну или в сторонней библиотеке есть enum, а у меня с этими перечислениями связана логика, как-то оформить нормально в класс не совсем получается потому что получится что я как-то должен управлять новым классом чтобы знать что там за элемент перечисления, потому я делаю еще один статический класс в котором логика которая связана с работой этого enum(достать имя связанное с ним, какие-то константы и прочяя фигня), тут я бы, будь это не сторонняя штука, - таки замутил класс обычный, но вот что поделать - сторонняя библиотека.
Мне лень вникать, но делать методы расширения для всяких удобств - норма.
Использовал первоначальную реализацию (из решарперовского кода, когда еще Lifetime был классом), сомневаюсь что на двачах найдешь еще юзеров этого дела.
Extension Methods - обычное дело. Под них целые nuget пакеты пилят.
>получится что половина кода программы - красная
Студия быстро найдёт, какой using добавить. А вообще, если расширяешь какой-то класс, то один из стандартов - это пилить свой класс в том же namespace, в котором находится основной класс. И не важно, что у тебя в приложении используются свои нэймспэйсы.
namespace System {
public static bool IsEmpty(this string str) { }
}
Главное внутри таких классов не делать чего-то, что невозможно будет покрыть тестами. Например new ExternalResource(). Это может быть и БД коннект, и хттп клиент, и работа с файловой системой, и подключение к хранилищу сертификатов.
Вопрос снят
в треде .NET-а хочу с уверенностью сказать - садись на пыху и не еби мозги. Да, нет перегрузки, но явно лучше компилированного говна будет
толсто
Если я сделаю так:
int a = x%2;
a--;
if(a>0)
{
...
}
Как это оптимизирует среда? Будет ли просто проверка первого бита или как-то иначе? Просто не хочется качать жетбрейновские штуковины, потому что я не доверяю этим пидорам, да и прочие штуки качать, но интересно же. Может кто упарывался и знает.
Только не говорите опять что ебучие винапи нужно. Я не переживу этого. О какой кроссплатформенности можно говорить, если постоянно для любой хуйни - винапи. Если так, то пиздец же.
У любой платформы есть стандартные библиотеки вида user32.dll в винде, при помощи которых можно отследить движение мыши.
С запросами тебе нужно работать с сетевым потоком, который ты будешь передавать в жсон-парсер. Для того чтобы взять только нужное, отбрасывая лишнее, нужно будет написать жсон-конвертер.
Давайте обсудим RSA...
Насколько я знаю, в RSA, (e, n) - публичный ключ, (d, n) - приватный ключ.
Соответственно...
Шифрование:
>c = m^e mod n, где с - cipher, m - message, e - public exponent, n - modulus
Дешифрование:
>m2 = c^d mod n, где с - cipher, m2 - decrypted message, d - secret exponent, n - modulus
>(m == m2) -> true
Подпись:
>s = m^d mod n, s - подпись (читай шифрование приватным ключём), m - подписываемое сообщение, d, n - компоненты приватного ключа.
>(m, s) - подписанное сообщение (сообщение и подпись)
Проверка подписи:
>m2 = s^e mod n; дешифрование, но публичным ключём.
>(m2 == m) -> true, если подпись s валидна.
Все эти формулы и вычисления, по модулю n, можно производить при помощи того же BigInteger: https://github.com/bazzilic/BigInteger/blob/master/BigInteger/BigInteger.cs
но при условии, что "m" - число со значением в диапазоне от 0 до (n-1).
На выходе, "с" и "s", со значением, в этом же диапазоне.
Однако, что если задача состоит в том, чтобы шифровать-дешифровать и подписывать данные произвольной длины?
Очевидно, следовало бы разбить их на блоки, и поработать с последним блоком, например, указав в конце шифра длину последнего блока.
ну, и собственно вопрос... Как всю эту хуятину впроглить, чтоб оно фурычило годно, с байтарраями произвольной длины?
Файл это FileStream
Сеть это NetworkStream
И тот и тот stream
Нет никакой разницы в последовательном чтении разве что в NetworkStream не сделаешь Seek назад
Концепция то мощная и всяко лучше Dispose, но использовать ее - совсем другое дело. Я вот пытаюсь интегрировать в MVVM и, если по хорошему, то при создании каждой новой вьюмодели нужно создавать LifetimeDefinition который еще и хранить где то и точно так же не забывать вызывать как и Dispose и очищать.
И это в MVVM где WeakRef норма.
Ну внутре решарпера у них свой компонентный фреймворк автоматически их порождает и диспозит вовремя, большой бонус в том что не надо в каждом элементе иерархии имплементировать dispose да не забывать диспозить дочерние компоненты, а просто передавать по цепочке лайфтайм.
Абсурд ситуации в том, что у MS внутри у себя похожим образом использует в качестве лайфтаймов CancellationToken (LifetimeDefinition ~ CancellationTokenSource), а nugetной версии JB прикрутили к лайфтаймам функционал этих самых токенов.
ну жетбраинс проще. они сделали свой компонентный фреймворк. А я натягиваю сову на имеющийся глобус.
имхо MS просто нарушает семантику. Меня в асп.нет коре смутило что их лайтайм с событиями запуска это не события а CancellationTokenSource
Семантика нарушена, хрен поймешь, нужно идти гуглить (а еще попробуй нагугли почем так, ведь только мнения)
Чем больше пишу, тем CancellationTokenSource у меня не эквивалент lifetime-ам. Уже много кода переписал и количество lifetime.Bracket/Execute/TryExecute просто зашкаливает. У CancellationTokenSource ничего похожего нет.
вот это посмотри.
https://www.youtube.com/watch?v=Sq_h5bVWJ0k
он и про модели многопоточности тоже глаголит
Я посмотрел, проникся и щас у себя внедряю.
Ты до этого всего сам по видео никогда не дойдёшь, хоть засмотрись. Это всё надо самому пробовать и параллельно смотреть, почему оно именно так работает. Эти видео сеньорам хорошо заходят или просто интересующимся, когда хочется на диване поваляться, но запоминать толком ничего не планируешь.
не соглашусь. Вот я использую другой подход, где первым шагом является разобраться в основе "что к чему куда", общее понимание "как все устроено". для этого читаю и смотрю все ПО ДИАГОНАЛИ что можно пока не придет понимание. Именно понимание. Если ничего не запомнил и хер с ним. Невозможно запомнить без практики.
Главное понять суть. Для этого меняю источники пока не сложится общая картина.
Таким образом формируется основа и далее уже можно начинать учиться и тогда новые знания будут укладываться в канву общего понимания. Без основы мозг будет вынужден куда то отложить новые знания, а нормального каталогизированного склад в голове нет и потом приходится класть знания абы куда, что потом затрудняет поиск. А именно способность быстро находить в голове нужное и есть цель - так то мозг никогда ничего не забывает, он плохо ищет в своем бардаке
Если же не понять, то в итоге можно стать гугл-копипастер проггером, который видит закономерности че как используется, но не понимает, потому и копирует найденное, а не реализует "по принципу"
Конечно можно "разбираться по ходу дела", но это банально медленнее в итоге.
я соглашусь, что "ну для тебя это не первый язык". Да. Но я этот подход использую для любой области, где у меня нет базиса, и он себя оправдывает
Я уже честно сказать забыл, как базы изучал (15 лет прошло), поэтому всё айтишное теперь можно просто брать и смотреть и понимать, что там происходит. Конкретно это видео >>827416 для новичка без нормальной базы будет просто развлекалово без какой-то практической ценности.
Немного подумал и согласился со сказанным. Я тоже в любой новой (не айти) области сначала кучу всего по диагонали пересматриваю, а потом уже пробую.
Вот только я не понимаю почему.
модель это вся логика приложения. там вообще все, что не вид и не связующее звено в виде контроллера
Или ты про классы сущности?
Описываются.
Я просто думаю что ты немного путаешь модель с DTO. DTO может выступать моделью, но модель не ограничивается DTO'шкой. Валидаторы, запросы к базе и вообще бизнеслогика это все модель.
Я почитаю про DTO, если это то, что имею ввиду - я отпишусь еще
а это типичная проблема
анемичные модели (не путать с dto) и rich model
"не путать с dto" потому что назначение dto следует из названия. А анемичная модель не цель, а следствие.
В rich model в саму модель пихают логику. Противоположный подход - когда логику распихивают по сервисам, а сама сущность в итоге вырождается в dto по своему виду. Еще и базы данных способствуют тому, чтобы были get;set; для мапинга.
но анемичная модель, хоть и выглядит, как dto, но не dto, а значит может иметь методы.
Я противник rich model, даже валидация и та зависти от контекста.
но тупые get;set; тоже не дело. Я предпочитаю чтобы модель имела контракт (что особенно важно в мультипотоке, да и вообще защищает от ошибок), что делает ее неподверженной "ой забыл учесть", но добавляет проблем с базой данных.
То есть я не меняю логически связанные поле1= и поле2= а придумываю какой то метод которые позволяют не делать публичных сеттеров
я кажется понял, что ты имеешь ввиду, а какие проблемы появляются с бд в таком случае?
ну база данных любит публичные сеттеры.
А если у меня их нет, то мне приходится изворачиваться с сохранением и чтением.
Тут варианты
- либо иметь гет сет и валидаторы в нужных местах, что данная заполненность модели валидна в данном контексте (и что никто кривыми руками не сломает ничего после валидатора)
- либо любое изменение модели не нарушит ее стейт, то есть минимум публичных сеттеров и апдейты через методы.
хмм.. спасибо
И в чем проблема того чтобы то что выглядит, ведет себя и по сути является DTO называть DTO?
Да и в чем проблема порезать всю логику на сервисы. Скажем вот так вот:
IRepository<T>; IValidator<T>;
В репозиторий мы в конструкторе отправляем валидатор:
Repository<T>(IValidator<T> validator)
и все, пусть делают там что хотят с объектом который получили из БД, но когда решат сохранить его то будет что-то типа:
void Update(T entity)
{
if(!_validator.IsValid(entity)) throw new Exception("Что-то пошло не так :)");
Update(entity);
Commit();
}
При этом этот же валидатор может быть использован много где. Удобно же. А если нужно будет добавить новый валидатор в одном месте - никаких проблем, ты добавляешь новый, и просто инжектишь его в то место где надо, а в остальных все остается по старому. То же самое и с репозиториями, допустим для тестовых нужд тебе достаточно чтобы у тебя все это дело было в виде обычного списка, нет нужды реальную БД запускать и все это там как-то реализовывать - никаких проблем если вот так вот делать не возникает. В общем, я не знаю.
>по сути является DTO называть DTO?
не является. выглядит, но не является. семантика иная.
в дто логики быть не должно
в анемичной модели она допустима
есть еще ValueObject который похож, но у него своя семантика.
про валидаторы я вообще хз о чем ты.
Просто в споре "где должен находится код валидации" я отвечаю "не в модели". Модель может быть валидна в одном контексте, но невалидна в другом. Частично заполненная модель валидна в месте заполнения, а там где она нужна полная - она придет уже полная.
потому валидировать ее нужно в контексте использования, что текущее состояние модели допустимо в текущем месте.
Есть такое понятие как "концепция баррикады", где на входе модель завалидировал и нет смысла ее валидировать постоянно, главное чтобы она не менялась после (из другого потока или джун посчитал что в данном месте ее можно поменять и все сломал)
Я сторонник анемичной модели. с ней тупо проще кодить. Так что у меня модели с гетсет, сервисы с логикой, валидаторы. И такое в подавляющем большинстве софта.
Ну, т.е. что я понял. Штука нужна чтобы контекст у всех репозиториев был общий Зачем оно надо - впринципе ясно. А вот что не ясно, так это как этим правильно пользоваться.
Допустим я хочу чтобы в моем контроллере я работал с репозиторием товаров. Правильно ли я понимаю что нужно в конструктор передавать этот самый UnitOfWork, из него тащить репозиторий, как-то работать там с ним.
А что если репозиториев много?
Да и вообще, если в контексте EF рассматривать, получается же что DbContext это же и есть этот самый UnitOfWork. Или это не так?
В общем, можете объяснить, если не сложно?
int a = 100;
while (a > 5)
{
System.Console.WriteLine(a);
a--;
Помогите, пожалуйста!
Точку с запятой в конце не скопировал, блять, но я думаю, что вы это поняли. Прошу простить.
Ты че-то напутал, чел. Тебе поди надо пересчитать сколько в данном куске кода используется переменных, операторов, пространств имен и прочих языковых выражений. Для автоматизации определения и подсчета можно использовать регулярные выражения. Вкратце про них можешь почитать по ссылке. Примеры кода можешь нагуглить сам: метрика Холстеда для c#.
https://metanit.com/sharp/tutorial/7.4.php
Взломать можно всё, вопрос лишь в цене. Ваши гавноподделки и так ломать никто не будет, проще свою прогу написать с таким же функционалом и продавать, вот и всё. Вы вряд ли там пишите что-то такое, что никто бы не написал.
На Джанго и Руби он Рэйлс
Какого хуя ещё нет возможности пилить код XAML в браузере?
Учись говоришь, на чем учиться, чем конкретным заниматься, как опыта набраться, если на работе не так уж и много чего юзаешь?
пиши велосипеды того что уже есть. в итоге получится говно, но навык очень сильно прокачаешь
>в дто логики быть не должно
>в анемичной модели она допустима
>Anemic domain model is the use of a software domain model where the domain objects contain little or no business logic - https://en.wikipedia.org/wiki/Anemic_domain_model
В DTO тоже никто не запрещает добавить конструктор (который всякие сериализаторы смогут спокойно вызвать) и/или добавить пару методов, например Equals для своей версии сравнения двух объектов ДТО или HasErrors, HasRecords, Count для какого-нибудь generic response.
Тоже самое было. Своё было пилить лень. Так и тупил несколько лет. Потом задолбало и начал ковырять свои проекты и читать кучу статей/смотреть видео. Потом методом перебора нашёл нормальную работу. Теперь норм.
https://www.youtube.com/watch?v=rtXpYpZdOzM
На, потрать один раз пол часа на просмотр и не делай больше никогда каши в своих проектах, от которой твои коллеги будут мечтать тебя убить.
>в моем контроллере я работал с репозиторием
Это вообще чума.
Контроллер должен быть туп как пробка. Он создаёт контракт для работы с твоим приложением. Это точка входа, которая описывает маршрут, по которому можно что-то запустить в твоём приложении, request/response models, возможные варианты ответов (200, 201, 204, 400, 401, 403, 404, 500). Стандартный такой набор, который почти любой контроллер должен иметь. Всё!
Остальное должно быть во всяких сервисах, хэндлерах, валидаторах, которые уже будут решать, откуда данные тянуть - HttpClient, DbContext, Redis, FileSystem, etc.
Все дело в семантике. Семантика это суть класса. Суть dto - передача данных. Анемичные модели не для передачи данных. Они используются как модели/сущности. Их можно использовать как dto, кидая их в сериализатор, но сериализовываться будет от хорошо до "дохера мороки".
у dto же, наоборот, суть - передача данных, потому у них во главе всего именно это, а это значит открытые независимые друг от друга свойства без какой либо валидации и вкусные для сериализатора и без конструктора. И в нем нет никаких причин делать конструктор с параметрами.
И если вам захочется добавить конструктор чтобы "ну там вот оно было так вот я управляю там чем то", то это уже будет не DTO (семантика которого всего этого не иметь), а переход к POCO, который используется как DTO
HasErrors, HasRecords, Count также внесут семантику POCO
Если ты студент и тебя работодатель не нашел сам, то никак.
Зависит от того, что тебе удобнее. Если не против переехать - рабочий вариант. Можешь попробовать пойти на какие курсы при фирме с перспективой трудоустройства. Можешь за те же полгода сделать приличный пет-проект или пофрилансить для опыта. Можешь изучить другой язык, если хочешь. Я бы в таком порядке рассматривал возможности.
АТО! Риск просадки есть всегда. Вот звезды не так сойдутся и GC решит в самый ответственный момент почистить кучу и вот тебе просадка.
А конкретно со структурой. Если будешь делать ее нормально, через указатели и не будешь постоянно упоковкой-распаковкой заниматься, то ничего такого быть не должно.
Типа с конца листа надо начинать и к 0 индексу идти.
Каким, образом-то они меняются? AsEnumereble просто возвращает сам себя. IQueryable это просто интерфейс который расширяет IEnumerable гарантируя по контракту что тот кто будет его имплементирует - реализует работу с провайдером и прочую залупу.
Для этого структуры и сделаны, поэтому просадка будет минимальной.
>"<span class="post__detailpart"><a href="/pr/res/1797054.html#1812758" id="1812758" class="post__reflink">№</a><a href="/pr/res/1797054.html#1812758" class="postbtn-reply-href post__reflink" data-num="1812758">1812758</a><span class="post__number">468</span></span>"
Имею в виду, это же просто стринг, а не кастомный класс. Значит и переопределять .GetHashCode() не нужно, верно?
Если нужно то могу шебмку с демонстрацией запилить.
Забыл добавить, чтобы вы мне не говорили что я строки не так сравниваю, такая фигня с обычной логикой тоже наблюдается. Всегда когда взаимодействую с определенным свойством. Например проверяю через || превышает ли длинна строчных свойств обьекта какую-либо константу.
Имплементации стандартного GetHashCode могут меняться и хеш может не совпадать с хешем такой же строки созданной в старой версии проги либо в другом модуле. Если тебе пофиг на это то юзай дефолт
Спасибо за инфу.
>they should never be used as key fields in a collection
Это именно то, что я и планирую с ними делать, лул.
Показывай код, причин может быть несколько. Разница в дебаге и релизе в том, что в дебаге код компилируется без оптимизаций, т. е. твой говнокод в релизе мог быть обрезан в каком-то месте, поэтому результат отличается от результата в дебаге. Еще одной причиной может быть:
>в дебаге пошагово
Если ты используешь асинхронные функции, таски или потоки.
Никакой ассинхронщины.
Пикрил1 - собственно код обычного класса юзера. IsValid проверяет являются ли поля слишком короткими при этом не являясь заглушкой Nothing. Запускаю прогу, получаю пикрил2. Пошагово проматываю в отладчике до следующего юзера с заглушкой и получаю пикрил3. Входные данные одинаковые, результат другой
хм, скрин не удалило почему-то. Начинайте нумерацию с пикрил0 тогда
Вот еще для наглядности перемотал пошагово на того же юзера
Ну так дебил, возврат метода один и тот же будет, просто в оптимизированном коде отрицание добавилось к той каше которую ты написал в сравнении, потому что анализатор убрал условие после которого ничего не происходит.
почему тогда когда я хочу собрать список невалидных юзеров я получаю валидных с заглушками?
Ты правда настолько тупой? У тебя middle name у всех @ что по твоему условию невалидное поле, но почему то в твоей тупой голове оно стало валидным, может тогда в коде отразишь? Или будешь дальше ждать когда коробочка магическая твои мысли прочтет?
Блять, каким хуем заглушка, на которую стоит проверка это невалидное, мать его, поле? Там есть всякие точечки и другие знаки вместо имен и я и хочу получить таких юзеров. Если пройтись до первого такого юзера отладчиком, он не попадает как невалидный, а если пустить выполнение дальше то все остальные попадают
>>829735
>>829944
Удачи, анон. Я сам сталкивался (правда во фреймворке, а не в коре) с тем, что условие, которое 100% должно выполняться, в дебаге работает, а в релизе просто проскакивается, как-будто этого кода вообще нет. Победить так и не смог.
В итоге пока этот код нужен был, приходилось юзать его в дебаге, что замедляло работу очень сильно. Хорошо хоть это был личный проект, а что бы я делал, будь это что-то серьёзнее - хз.
ещё scoop, все актуальны, майки пока над своим официальным работают
https://www.microsoft.com/en-us/p/windows-terminal/9n0dx20hk701
На шарпе из фриланса, доступного новичку - лабы в ВУЗе. Дрочи то что нужно для лаб в ВУЗах.
>if((mask<<32)|incomingMessage > 0)
Условия в if заменяй на переменные, названия которых будут объяснять то что происходит в коде. К примеру:
if (target < 32 && target > 1)
Делаешь:
var targetInAcceptableRange = target < 32 && target > 1;
if (targetInAcceptableRange)
Твой message.slice(0,64) можно поместить в переменную, которая опишет, что у тебя в этом слайсе с 0 по 64, чтобы можно было хотя бы представить что ты с ним в методе делаешь, если еще и метод назвать хорошо, то и код читать не придётся.
Пользовался conemu и cmder много лет. То же самое говорил, когда мне про новый WT задвигали. Теперь не знаю как без него жить. Очень удобно. Очень близко к zsh на маке + свои фишки.
return candidate is { IsVirtual: true, ReturnsVoid: true, Name: "Dispose", Parameters: { Length: 1 } parameters }
в какой версии шарпа ввели?
для switch да. но для is
Вот у меня куча запросов к стороннему АПИ. Допустим мне нужно по разным каталогам таваров по разным ценовым диапазона сделать запросы. Так вот, если делать это последовательно то оч медленно выходит. Я решил использовать PLINQ. И чет не совсем понимаю как мне потом аггрегировать результат. Не будут ли какие-то проблемы если я результат в List засовываю с помощью AddRange? Я просто пока что посмотрел на дебаге и все норм работает, но я в этом вашем паралельном программировании и прочих многопотоках не силен особо, но ждать пока 90 запросов каждый из которых возаращает по 1к+ответов - довольно долго, приписав AsParallel() в дебагере скорость в разы скаканула, но я боюсь, что в релизне могут быть подводные камни. Я знаю что можно залочить, но так же знаю что оно не всегда нужно. Вот мне и интересно, надо ли в этом случае и вообще как правильно-то этим AsParallel пользоваться.
Посоветуйте книгу другую для новичка, на русском.
Для новичка я бы Шилдта или Албахари советовал, как справочник. Причем не обязательно последние версии.
А если практические знания, то как не хейтят тут, но метанит и professorweb - норм сайты чтобы с основами разобраться. Конечно там многие примеры - сферически кони в вакууме, но так-то у большинства обучающих материалов так, там хотя бы круды научишься делать.
Спасибо, почитаю.
var httpClient = new HttpClient() { BaseAddress = "blah" }; //этот клиент должен создаваться один раз как singleton
var tasks = listOfUrls.Select(url => httpClient.GetAsync(url));
var result = await Task.WhenAll(tasks);
Как-то так. У тебя хттп запросы и так асинхронно запускаются. Вместо того, чтобы запускать их по одному, запускай разом все и потом получай список ответов.
Для новичка - Троелсен. У него и информация свежая, и изложение для новичка. Альбахири не читай, его нужно открывать когда ты уже пару книг для новичков прочитал и имеешь хоть какой-то практический опыт. Метанит и профессорвеб даже не открывай, это пустая трата времени, которая только в заблуждение тебя ввести может.
> await Task.WhenAll
Аноны, я конечно самоучка и пишу только для себя, но поясните, почему использование подобных конструкций вообще важно?
Когда мне нужно выполнить асинхронно какой-то код, я просто создаю объекты Thread и выполняю их, руками контролируя выполнение и завершение потоков. Есть же семафоры, есть мьютексы. Никаких проблем никогда не возникало, грабли многопоточности как правило дают по голове один-два раза, а потом ты уже понимаешь, откуда идут проблемы и больше сам себе их не создаёшь. Так ли важно пользоваться всем этим синтаксическим сахаром?
Ты не различаешь асинхронности и многопоточности, первое тратит меньше ресурсов, легче контролируется и уменьшает шанс выстрелить себе в ногу. Создание Thread для выполнения асинхронных операций это пустая трата процессорного времени и памяти, так как всё могло бы происходить в рамках одного потока. Для этого как раз и создан класс Task и TPL в целом.
> Ты не различаешь асинхронности и многопоточности
Возможно, нужно почитать что-то на эту тему.
> Для этого как раз и создан класс Task и TPL в целом
Но раньше ведь жили без этого как-то.
Жили, но использовали не Thread, а делегаты и AsyncResult, но они сложны и раздували код настолько, что использовали их только создатели библиотек и по-настоящему опытные программисты.
> делегаты и AsyncResult
Я скорее даже не про ранний C#, а вообще. 20-25 лет назад тоже писали стабильное и быстрое ПО (лучше, чем сейчас), хотя у серьёзного программиста под винду были только плюсы и голый CreateThread из винапи. И ничего.
А то не могу нагулить, вечно на всяких стекфлоу тонны какой-то хуйни написаны вместо нормальных ссылок на гайды
Фронтом ему выступает IIS из Win Server 2019.
Единственное, что было изменено в конфигах:
startupTimeLimit="3600"
в web.config
Раньше (на 2.2) при загрузке приложения из Application Pool оно почти мгновенно грузится (секунд 20-40) и сайт сразу же после этого становится доступен.
Сейчас, на 3.1, сервис грузится те же 20-40 сек, а потом 10 минут сайт недоступен. То есть я делаю запрос, запрос зависает. Запрос развисает через 10 минут, и следующие запросы выполняются мгновенно. Запрос один и тот же и крайне дешёвый (10-15 мс). Я открываю логи, которые ведёт сама программа: в 10 первых минутах запроса там просто нет, то есть он даже не приходит. Через 10 минут они прилетают все скопом.
Что делать, как быть? В чём проблема? Как чинить?
блин, я забыл написать что под net core. JetEntityFrameworkProvider не пашет
Всё, вопрос снимается. Один из IHostedService очень долго исполнял StartAsync. Не знаю почему на 2.2 этого не было видно
Раньше на алголе писали, и ничого!
20-25 лет назад у нас все клиенты тяжёлые были и сетевые запросы редко использовались. Но мультипоточность и работа с сетью была жёсткой магией и писалась на тыщи строк на всяких плюсах. И эти проги постоянно падали или отжирали все имеющиеся ресурсы и тормозили.
>Возможно, нужно почитать что-то на эту тему.
Не "возможно", а обязательно к прочтению. Щас ни одна прога (даже иногда калькуляторы, лол) без async/await не обходятся. Не зная как оно работает ты себе не только в ногу, но и в голову начнёшь выстреливать. Надо кучу статей перечитать и самому много всего перепробовать.
Разворачивай проверку и делай дебаг каждого шага, если косяк только в релизе, то через старый добрый PRINT DEBUG смотришь.
Я подозреваю что у тебя там косяк с кодировками, на входе идет какой-нибудь utf-16, а строка у тебя в utf-8, выглядят одинаково, но по факту это разное.
>>830069
Значит этот код не участвует в работе программы или в нем вечная false проверка, в результате оптимизация убила эту ветку кода.
Просто так код не выкидывается из работы, плюс дебаг не работает на релиз версии потому что код который ты пишешь может стать нечто другим и там тупо не на что ставить breakpoint.
Ну. Мне вот дали протокол(что-то около 20 разных типов сообщений: регистрации, авторизации, проверки подлинности сервера, запроса канала и т.д.). Задание было в форме: Есть 100к роботов, они хотят общаться, но из-за того что они очень стеснительны - бояться общаться напрямую. Необходимо разработать приложение которое бы позволило им всем общаться через это самое приложение, а так же в случае необходимости - рассылать им всякое разное от людей. Форма диалога происходит в виде: Робот 1 присылает запрос о том что хочет выйти на связь с Роботом2, если робот2 сейчас подключен - создается зашифрованный канал, который передает сообщения, в случае если превышено время ожидания, либо один из роботов прислал сообщение о том что хочет разорвать общение, либо сообщение об ошибке, какнал закрывается. Так же необходимо было всякие проверки подлинности по этому протоколу, регистрации и прочую залупу.
А другому джуну что вместе со мной приходил - распарсить жсон попросили.
> плюс дебаг не работает на релиз версии потому что код который ты пишешь может стать нечто другим и там тупо не на что ставить breakpoint.
Вот меня эта хуйня реально бесит. Серьезно. У меня просто на работе стоят шпиенские программы которые захватывают файлы собранные и минут еще 10 держат, и приходится постоянно переключаться то на релиз то на дебаг чтобы дебажить и на релизе приходится либо молиться чтобы тут-то остановилось, либо везде долбить в консольку чтобы отлаживать. Вот какого хуя-то? Почему нельзя сделать было по-человечески, чтобы все эти оптимизации только с каким-то флагом компиляции включались, а изначально то что ты написал - то и будет. Аааа, жопа.
> Вот какого хуя-то? Почему нельзя сделать было по-человечески, чтобы все эти оптимизации только с каким-то флагом компиляции включались, а изначально то что ты написал - то и будет. Аааа, жопа.
Вообще-то можно, но какой смысл тогда в релизе?
>Вот меня эта хуйня реально бесит
Прикол, сначала делают дизайн из костылей, а потом жалуются. Чё-то у меня за 10 лет такой хуйни не происходило.
как перекат делается? просто создаёшь новый тред? а то тут шапку надо хорошо так подправить.
Ну и пиздец.
> public virtual byte[] Encrypt(byte[] data, RSAEncryptionPadding padding) {
> throw DerivedClassMustOverride();
> }
>
> public virtual byte[] Decrypt(byte[] data, RSAEncryptionPadding padding) {
> throw DerivedClassMustOverride();
> }
Это так много мне говорит, что охуеть просто. Я весь в просвещении. Меня настигло сатори и я познал Дзен, это этой хуйни.
Спасибо анон. В качестве благодарности, нихуя так и не поняв - вкину вам сюда - неразрывный пробел: Alt+255, вакаба ваш говнокод не жрала.
>я познал Дзен, ОТ этой НЕВЕДОМОЙ хуйни
>вкину вам сюда - неразрывный пробел: Alt+255, ЧТОБЫ вакаба
Нутыпонел.
Рили, проще запилить свою RSA на BigInteger.cs, чем это вот, хуй знает как написанное - юзать.
к тому же некоторый синтаксис из шарпа9 почему то работает в моей VS, где им и не пахло.
Потому что
>the current plan is that C# 9 will only be officially supported on .NET 5. However, in the current design records do not depend on any new CLR features, so many things may work in .NET Standard 2.0 in an unsupported fashion (similar to C# 8).
еще раз
как мой компилятор который не знает про шарп 9 (студия не превиев) компилирует код который использует фичи из шарп 9?
это вы в яндекс или в мейл собеседовались?
я на миддла просто мило попиздел с тимлидом о всякой дотнетщине и скинул ссылку на свой гитхаб, без всяких тестовых заданий
И что там у тебя на гитхабе? У меня есть большой проект, но он в приватном репозитории, так как приносит мне деньги.
Ну как. Там тестовое это выдавалось на время испытательного срока. Типа вот тебе задание, вот три месяца - справишься - берем, не справишься - посмотрим. Я сделал за неделю, меня взяли и сразу кинули в пекло, чел что парсил json не справился и его перевели отправили к тестировщикам. Воооооот.
.NET Standard 2.0 не требует превью и прочих net5 специфичных установок. Он у тебя уже давно есть.
да причем тут .NET Standard 2.0, который описывает по факту какие классы доступны и синтаксис языка, который должен разобрать компилятор и если он не знает, допустим, про инит свойства, то для него это будет "бэд синтакс"
David Gourley, Brian Totty, Marjorie Sayer, Sailu Reddy, Anshu Aggarwal - HTTP_ The Definitive Guide-O'Reilly Media (2002)
Так хорошо начал, что захотелось даже граммотно с нормальными примерами ответил, но после
>вот прям искаропки ничего нет или как?
только и хочется сказать "ты дебил или как?" и бросить ссылкой
https://docs.microsoft.com/en-us/aspnet/core/mvc/controllers/routing?view=aspnetcore-3.1
Спасибо
Это чудо, чел. Звони в Ватикан.
В моем cs-ки, папка би и обж. Где нугетсы?
%userprofile%\.nuget\packages
https://docs.microsoft.com/en-us/nuget/consume-packages/managing-the-global-packages-and-cache-folders
cпасибо
Интересно, если скопировать нугетсы с одного проекта на другой студия не будет ругаться?
В чем собственно проблема? Я не совсем понимаю как это сделать не всрато. Пока что придумал так: Вот словарик, в нем ключ - id, а значение - CancellationTokenSource, если я решаю отменить задачу - смотрю есть ли в словарике такой ID, и если есть - отменяю. Но это выглядит во первых всрато, во-вторых получается что нужно заботиться о том чтобы удалить CancellationTokenSource после того как задача завершилась. Есть ли какой-то более изящный, элегантный и вообще правильный способ это все организовать?
https://github.com/Microsoft/VS-ColorThemes
https://studiostyl.es
Как обновить шрифты надеюсь сам догадаешься.
Возьми https://www.hangfire.io и запускай задачи через него. Там можно задачу отменить и через UI и через API и по таймеру (timeout).
Пикрилейтед, там подписано, какие строки срабатывают, а какие нет. Причем без разницы, что там за инструкции, могу после замены текста поставить какой-нибудь тхреад.слип - один хуй он будет проигнорен.
https://marketplace.visualstudio.com/items?itemName=VisualStudioPlatformTeam.VisualStudio2019ColorThemeEditor
я с 2017й сохранил и накатил. там правильный (для меня) синий. но не без гемора все
Как создать sql базу данных локально? Я читал гайды на метаните, смотрел на ютюбе и я не понимаю, где она создаётся и что я вообще делаю.
Короче, скажите просто как сохранить поля класса, чтобы при следующем запуске он их считывал и выводил. Заранее спасибо.
База данных на локальном сервере хранится, тебе нужен denwer или MySQL сервер
Смотря какую базу используешь
Звучит как шиза, завтра попробую твою штуку посмотреть, или если поймёшь в чем дело то пиши
> База данных на локальном сервере хранится, тебе нужен denwer или MySQL сервер
Т.е. без этого никак? А вот когда сборка программы будет, оно базу данных само создаст?
Нет, просто вроде бы был какой-то метод, чтобы без вот этого вот хранения на локальном сервере. Просто пишешь кода на sql и он подчиняется.
> Смотря какую базу используешь
Ну вот я и хотел спросить, какие варианты есть, и как бы сделали вы?
MySql и sql всегда хранятся на сервере
Либо локальном либо удаленном, а приложение запрашивает к нему доступ
Внутри приложения никакой базы нет
Но
Существует база данных которая хранится просто в файле
Гугли SQLite
Забыл добавить, что еще непротухшая профильная вышка есть.
Зато если все разом перестанут учить жс, то сразу станет быстро найти работу на чём-то другом.
>Звучит как шиза
Я вот и сам охуел с этого.
Сначала не было этих мессджбоксов, у меня просто селектор не ставился в курсор позицию, стал разбираться почему и выяснилось, что после присвоения текста часть кода просто не работает.
Единственное, что буквально только что перешел с 2017 на 2019, и изменил фреймворк до 4.7.2, до этого ничего такого не замечал.
>завтра попробую твою штуку посмотреть, или если поймёшь в чем дело то пиши
Спасибо.
Попробую тоже завтра-послезавтра на максимум упростить этот код, и надо будет в отдельном проекте попробовать и на разных студиях, может понятней будет.
var value = calc1(45, 77);
var result = calc_total(value, 1);
Чтобы я уже дальше мог под себя его допилить.
Powershell.
при всех хз проблемах дропай bin/obj/.vs
и выключай разные там Fody
и выключай оптимизацию кода
на
using Namespace.PackageName;
даёт ошибку что
Using directive is unnecessary.
The type or namespace name PackageName does not exist in the namespace Namespace (are you missing an assembly reference?)
При том что нужный пакет есть в packages.
Короче когда ты делаешь remove и insert
Метод text changed вызывается ещё раз поэтому все ломается)
То есть ты пишешь в поле - вызывается текст ченж- внутри события ты меняешь текст в поле и снова вызывается текст ченж)
Как понять какая подходящая?
Я ставлю последнюю стабильную, сейчас попробовал прошлогоднюю установить, но та же самая проблема.
то что есть в референсах то нюгет и затянет если может
чего нет - то не затянет
ну и конечно еще есть опциональные зависимости - будет тянуть если условие соблюдается. например у тебя либа на разные дотнеты и каждому варианту свой набор зависимостей
В общем с нагетсами какая то фигня.
Делюсь лайфхаком, как я сделал:
Правая мышка по References, Add Reference. Дальше Browse и выбираю из папки с нагетсами нужный референс вручную.
Почему то через нагетс менеджер не устанавливается, хз почему так.
Добра и сотен нефти вам
Почему, кстати, прчти все дотнетовские вакансии требуют жс, в отличие от джавовских?
Не совместима с версией используемого фреймворка. Также надо проверить что проекты в солюшене тоже друг с другом по версиям стыкуются.
А еще почисти на всякий слачай nuget cache (гугли команды) и сделай Clean Solution + Rebuild Solution.
Потому что основной используемый шаблон в дотнете был MVC, а там обазательно вьюшки с хтмл+жс+цсс.
А ещё раньше АПИ вообще не было, только веб формс.
Последние 3 года всех кого знаю пилят только АПИ точно также как и жава, а весь фронтенд в отдельном репо на всяких Ангулярах и Реактах.
В жаве же с фронтендом всегда туго было, поэтому на нём всегда только бэк пилили.
Но в итоге джависты освобождены от необходимости знать фронтенд, а шарписты - нет.
да глупости же. кто пишет апи или вообще веба не касается знать не знает фронтенд
вот я не знаю.
вернее я знаю его настолько чтобы знать что оно лютое говнище
Контракт должен быть железным. Если тебе нужно чтобы твой ресурс могли
GET /api/my-resource/:id
то весь этот контракт нужно прямо указать. Никакой магии, никаких зависимостей, каждый контракт полностью самодостаточен.
Да, код получается больше, но поддерживать, читать и расширять такой код куда проще чем магическая динамичность.
Ты ещё gRPC не видел, там ещё с контрактами жёстче.
Вообще, как и в случае с протобафом для gRPC, ты можешь руками (или при помощи какого-нибудь постмэна) построить свою OpenAPI доку и потом применить генератор, который тебе Controllers + Actions оттуда напили. Добавишь потом custom Api Conventions и можно пользоваться.
Если в одном месте прям свербит и хочется динамичности, то иди копай GraphQL, который можно на прямую в твою БД отправить и клиент сам сможет выбрать оттуда что ему нужно.
>>835297
>>834889
>>834999
>>835072
>То есть ты пишешь в поле - вызывается текст ченж- внутри события ты меняешь текст в поле и снова вызывается текст ченж)
Да, все так, спасибо, тоже сейчас дошел до этого.
И как же мне теперь передвинуть курсор?
Главное до этого все работало, когда метод изменял исключительно последний символ, но теперь вообще не помню как я так изменял этот текст, чтобы ивент не вызывался второй раз.
>события в шарпе сами по себе уебанство
Почему? И как же такое без событий делать?(И зачем?)
>и тех кто делает sender as нужно бить палками
Почему и как надо? Изначально объявить объект текстбокса через sender as и уже к нему обращаться? Будет разница?
>Почему? И как же такое без событий делать?(И зачем?)
потому что чтобы отписаться нужно передать делегат, да не какой то, а тот же самый. А если он у тебя ламбда то придется ламбду ломать.
лучше когда какой нибудь IObservable подвариант где выдаст тебе токен, который ты потом Dispose вместе со всеми
А еще лучше lifetime передать и оно само отпишет отовсюду когда lifetime умрет
>Почему и как надо?
((TextBox)sender)
и везде так где сендер не ожидается нулл или другого типа. Получишь ошибку каста вместо невразумительного Null Reference Exception
если делаешь as - следующим делом проверяй на null. Иначе касти нормально
чет не ответил на "а как без событий"
ну тут никак если конечно не подключаешь reactive, а поскольку обычно нет, то да получается такая херь с +=/-=
Попробовал чутка причесать твой код.
Вот так вот.
ну так то в сендеры может и что то другое прилететь. вот у меня в WPF с табконтролом хрен знает что прилетало (кривая его реализация)
вот тогда нужен as и проверка на нулл
правда и тогда лучше is
Всё, Mono теперь .NET 5. Все движки, использующие Mono станут dotnet native.
угу. использование IoC контейнера как сервис локатор считается антипаттерном. По возможности класс должен принимать, что ему реально нужно
Локально на проекте подключаюсь к задеплоиной БД, стянут последний мастер с фронта и бека. Есть функционал по добавлению роли для участника какого то клуба. Локально все работает, но вот на задеплоином сайте почему то вылетает ошибки: System.InvalidOperationException: Role IJ����� ������� does not exist.
at Microsoft.AspNetCore.Identity.EntityFrameworkCore.UserStore`9.AddToRoleAsync(TUser user, String normalizedRoleName, CancellationToken cancellationToken)
at Microsoft.AspNetCore.Identity.UserManager`1.AddToRoleAsync(TUser user, String role)
Как это вообще возможно и в чем может быть проблема??
В общем смотрите, я накидал примерную суть упрощенную своего сервиса обработки некоторой работы. В моем петпроекте работа создается в контроллере и она отличается, в данном примере чтобы показать что типа сложно - сортируем лист из 100000 элементов.
Так вот, мне хочется проекте добавить возможность посмотреть статус работы чтобы на фронтенде рисовать красивый прогрессбар. Как это можно сделать красиво? Если скажем я сделаю класс: WorkStatusObserver в этом классе у нас будет словарь id-WorkProgress, в который буду добавлять на каждой итерации цикла объект WorkProgress пусть это будет простой объект, в котором при создании указываем максимальное значение и затем обновляя текущее и таким образом можно посмотреть % выполнения и обновлять его по ходу выполнения работы, это будет нормальным решением? Допустим этот класс(WorkStatusObserver) будет синглтоном, таким образом я буду из контроллера иметь возможность посмотреть сколько там осталось еще пока работа завершится. Норм это, или не?
Что-нибудь с CultureInfo или подобным.
Есть серьёзный философский вопрос, поэтому задам его здесь.
Как изменить статичный четырехмерный объект?
Желательно приватный - private static obj = {[бла-бла - четырехмерие]};
Сам студент, хочу скатиться с джавы.
А если он из-за статичности этой, своей - неуправляемый и принципиально-неисправимый?
Да.
Нужно послать на сервис 2 объект класса ClassХ. Сервис 2 имеет такой же IJob, и должен запустить DoJob() полученного объекта.
Как примерно такое сделать? Может есть готовый фреймворк? Или вручную только сериализовать и рефлексировать? Или еще какой подход есть для таких задач?
На всякий случай уточню, сервис 2 ничего не знает про имплементации IJob в сервисе 1.
Чтобы было прямо указано что например с NetFramework 4 работает библиотека Xxxx версии 1.02, Yyyy версии 4.1 и тд.
Кто нибудь проходил этот туториал? https://docs.microsoft.com/ru-ru/aspnet/core/tutorials/razor-pages/?view=aspnetcore-3.1
На 2 этапе возникает ошибка, на этом моменте https://docs.microsoft.com/ru-ru/aspnet/core/tutorials/razor-pages/model?view=aspnetcore-3.1&tabs=visual-studio-code#scaffold-the-movie-model ввожу в терминал dotnet aspnet-codegenerator razorpage -m Movie -dc RazorPagesMovieContext -udl -outDir Pages/Movies --referenceScriptLibraries а в ответ сначала было, что не может найти фреймворк 3.1, хотя он у меня установлен, а после когда поставил более старые либы, начал выдавать, что команда не найдена или не найден файл.
Про .NET Framework желательно забыть как про страшный сон. Только кор или сразу dotnet 5.
В самом nuget прописано, на каких версиях оно работает
В общем есть задание, каждое кол-во времени создаются детали.
Как их лучше хранить? Думал в лист<стринг> сохранять "A","B" if timeHasCome, но потом парсить будет некрасиво.
Это же тупо задача из линейного программирования. Храни в массивчике и не парься.
Охуеваю с таких постановок задач. Пиздец, я пока читал - запутался, пришлось перечитать 10 раз чтобы понять что за 4 этап и что вообще от меня хотят.
Нет бы по человечески: G(w0) = F(w1)+ E(w2) + 8 + rand(-3, 3). Нет, блядь, каждый раз какой-то еблан берет и вот такую вот простыню напишет и ты больше времени не на решение а на формазизацию задачи тратишь. С этой хуйни еще в школе горело. Нахуй и в пизду.
В общем, хочу из одного IHostedService посылать запросы к своим же контроллерам. Но т.к. эта фигня делается исключительно чтобы в этом сервисе не нагружать и без того тяжелый сервис всеми этими контекстами с бд, не хочу чтобы это api торчало наружу. Что и где прописать чтобы исключить возможность запроса из вне. В идеале вообще сделать это апи доступным только изнутри приложения. Я гуглил, все решения это в мидлваре прописать контроллеру ограничения, но блин, а вдруг злоумышленник - ебучий сисадмин, который вертит на хую эти запросы к самому себе и режет их. Просто лично мне это было бы ну очень удобно, потому что в синглтон не хочется передавать IServiceScopeFactory, а из БД таки хочется достать данные. Конечно, я могу просто создать еще один синглточнчик в котором буду хранить строку подключения и создавать контекст так.
>выдай сюда результат команды dotnet --info
Пакет SDK для .NET Core (отражающий любой global.json):
Version: 3.1.108
Commit: c423b556b5
Среда выполнения:
OS Name: manjaro
OS Version:
OS Platform: Linux
RID: arch-x64
Base Path: /usr/share/dotnet/sdk/3.1.108/
Host (useful for support):
Version: 3.1.8
Commit: 05a0c8f6b1
.NET Core SDKs installed:
3.1.108 [/usr/share/dotnet/sdk]
.NET Core runtimes installed:
Microsoft.NETCore.App 3.1.8 [/usr/share/dotnet/shared/Microsoft.NETCore.App]
To install additional .NET Core runtimes or SDKs:
https://aka.ms/dotnet-download
> Зачем?
Чтобы не передавать в синглтон IScopeFactory или не делать дргой синглтон, который будет делать мне контексты к БД. Я же написал вроде. В контроллер, т.к. он scoped я могу спокойно передать нужный мне контекст, затем просто сделаю запрос к нему, получу нужные мне данные и буду работать дальше.
Ладно, чтобы было понятно. Есть сервис, он должен брать из БД табличку с расписанием, смотреть время, если пришло время для следующего запуска запросить из БД все объекты которые привязаны к этому расписанию и делать запросы на основании этих объектов к сторонним ресурсам, получив ответы - обновлять значения в БД. Ну и я вот хочу убрать из этого класса этот IScopeFactory, тогда в этом классе будет только методы Start/Stop/DoWork, в DoWork я и буду делать всю эту поеботу. Зачем оно надо? А вот надо, нужно смотреть цены на товаров раз в 12 часов в некоторых интернет магазинах и кидать оповещение если цена снизилась людям которые подписались на рассылку. Как это сделать иначе - я не придумал.
то есть вместо прямого очевидного и простого решения лезть в базу данных из своего вечноживущего сервиса ты хочешь нагородить сверхсложный огород пытаясь дергать внешний контроллер
Ну да. А что, это неправильно? Я просто не понимаю. То говорят что передавать контекст напрямоу плохо, то что ручками его собирать, то что IScopeFactory в конструкторе - говнокод. Я уже не знаю как делать чтобы правильно было. Делаешь очивидно и просто - уууу, в лоб зарешал, ууу. Пытаешься делать не так - уууу, нагородил огород. Короче, не знаю уже.
Нужно избегать использования Service Locator, потому что он скрывает знание "что конкретно нужно этому классу". Это такая неявная зависимость и приходится рыть код, чтобы понять что ему надо то. Может он раз в 100 лет попробует достать из локатора какую то зависимость, а у тебя ее нет в контейнере и все рухнет.
То есть вместо передачи зависимости на контейнер нужно стараться, чтобы зависимости были явными. Чтобы класс знал только о том, что ему нужно и четко определял это в контракте (идеально конструктор и все). А уже кто-то там повыше уровнем решал как прокинуть ему эти зависимости.
И в общем случае вместо прокидывания контейнера, из которого класс будет доставать что ему нужно лучше создать фабрику которую и прокинуть и уж она предоставит все что нужно. Фабрика это уже явная и узкая зависимость. И та же фабрика обеспечивает lazy создание чего там тебе нужно.
Я не пользуюсь и не знаю EF но по примерам складывается ощущение, что прямо на месте создают/достают из контейнера. Я хз такие практики - у меня от них глаз дергается.
Почему то команда dotnet aspnet-codegenerator не работает, хотя dotnet tool install dotnet-aspnet-codegenerator говорит, что уже установлен.
Глобально установлен. Команда заработала, но отвечает хуйню Building project ...
It was not possible to find any compatible framework version
The framework 'Microsoft.AspNetCore.App', version '3.1.0' was not found.
- No frameworks were found.
You can resolve the problem by installing the specified framework and/or SDK.
The specified framework can be found at:
- https://aka.ms/dotnet-core-applaunch?framework=Microsoft.AspNetCore.App&framework_version=3.1.0&arch=x64&rid=manjaro-x64
RunTime 00:00:18.15
ничего не было сказано про статический класс, ты написал статический объект
а так, Zhopa.Xer = 2
Курю мануалы по авалонии и возник вопрос.
Почему в построении интерфейсов назрели две крайности?
1. Таскаешь мышкой компоненты по форме, мышкой же размещаешь, мышкой же в инспекторе сбоку настраиваешь свойства.
2. Всю разметку печатаешь ручками в специальном языке разметки, при поддержке твоей ИДЕ тебе показывается конечный результат, в котором ничего нельзя подправить мышкой.
Я не нашел сбалансированного решения, наподобие как в автокадах всевозможных, когда ты можешь и мышкой таскать и в командном процессоре снизу показаны команды, которыми строится интерфейс и при желании и умении, ты можешь ручками продолжать его строить, вводя новые команды. Воркфлоу выглядит так, пишешь ему что-то типа button name="OK" text="{bind MyOKCaption} а потом можешь мышкой подвинуть появившуюся кнопку и в этом поле команда станет выглядеть например так button name="OK" text="{bind MyOKCaption} margin=point(16, 303)
Если такие CAD-style-решения есть, ткните носом, позязя.
ну авалонию делают любители. они не могут сделать полноценный редактор
да даже майки со своим WPF дизайнером не могут сделать такое
в итоге все ручками привычно
WPF так всё и работает, но я не представляю как этим пользоваться кто-то в здравом уме будет, потому что это своего рода костыли для долбоеба, который не может разместить элементы интерфейса по контейнерам.
Мне известен возвращаемый тип (стоит ли его учитывать; есть ли он вообще; является ли он generic) и известны типы параметров. На основе этого нужно подобрать подходящий метод.
Пока думаю делать так:
- первый проход по методам - строго сравниваем параметры (type == type)
- второй проход - используем IsAssignableFrom, но учитываем только generic типы
- третий проход - используем IsAssignableFrom
- проходим по получившемуся списку методов, подбираем первый подходящий возвращаемый тип и возвращаем метод
Это понятно. Может есть способ проще... Мне нужен такой же подбор по параметрам и возвращаемому типу, как это сделано в самом C#. Это нужно для скриптового языка.
ну а какая разница? знаешь типы, методы есть - выбирай из них. Для экономии времени можешь составить свой словарь "сигнатура - метод" и он будет моментально тебе находить по сигнатуре
Для drag-and-drop пользуйся win forms.
От создайния интерфейсов мышкой не зря отказались. Это вообще теперь industry standard - не пользоваться drag-n-drop разработкой. Такой способ только для быстрого прототипирования может подойти или для домашней поделки.
>методы есть - выбирай из них
Легко сказать... Там столько подводных всплыло с дженерик-типами. Написал не слишком сложный поиск. Добавил ещё сортировку по "весу". Для скрипта должно хватить, если я всё учёл.
https://pastebin.com/YW9N8xbP
Потому что парсер наткнулся на этот кусок и дальше не стал строить дерево.
А вообще, как по мне заменять это на LINQ - плохая практика. я вот сам попервой нахреначил кучу хуйни так, а потом хуяк и этим пользоваться менее удобно оказалось и для понимания оно сложнее, особенно теми кто не особо за LINQ шарит, например бывшие джависты-пхпшники, они сразу начинают - ууууу, нипанятна.
Хуёво быть ботом.
В html/css никто не двигает элементы мышкой. Маржин и паддинг нужно устанавливать у родительского элемена, дочерние элементы уже выравниваются автоматически. Тоже самое и в WPF делают. Это удобно тем, что если у тебя, к примеру, 5 последовательных эелемнтов и ты их расположил двигая мышкой т. е. явным указанием маржина, а иногда и трансформирования, то если тебе нужно будет передвинуть один элемент, то менять эти маржины придётся у всех 5 элементов.
Есть одна БД, в ней около 10 таблиц, в каждой около 10 столбцов, все таблицы записаны в csv. Суть: нужно по запросу вида "таблицанейм.столбецнейм" получать столбец/строку из него. Я решил под таблицы написать модели и быстро осознал, что на каждую придется написать строк 100 чисто логики парсинга, и то полнейший костыльный пиздец выйдет. Так вот: как эту хуйню нормально запарсить?
Про библиотеки, которые это сделают за меня, я в курсе, но шараге на их существование (ровно как и на существование половины стандартных библиотек, лол) поебать. Нужно как-то свою реализацию написать.
Как создать Json-объект?
Что-то наподобие
>new Object[]{"key1": value1, "key2": value2};
А?
У тебя проблема с тем, чтоб распарсить csv? Если сами файлы ошибок не содержат, то задача тривиальная.
У меня проблема с тем, что мне нужно вручную как-то забиндить распаршенные данные к моделям, при этом таблиц дохуя, столбцов дохуя, типы данных у столбцов разные. У меня нет идей, как это сделать нормально, а не через тысячу ифов.
Ты создал строчку.
Всё, я нашёл уже:
> Dictionary<string, object> yourObjects = new Dictionary<string, object>(){
> ["key1"] = 1
> , ["key2"] = "value2"
> }
> ;
>// yourObjects["key1"] = 1;
>// yourObjects["key2"] = "value2";
>Console.WriteLine(yourObjects["key1"].ToString());
>Console.WriteLine(yourObjects["key2"].ToString());
Парсишь csv сначала в словарь где ключ это название заголовка, а значение список из значений таблицы под этим заголовком. Переводишь все щначения при помощи tryparse
На коре только новые модули/сервисы, всё остальное на фреймворке. Никто не будет бежать переписывать всю кодовую базу на кор.
>Последние 3 года всех кого знаю пилят только АПИ точно также как и жава, а весь фронтенд в отдельном репо на всяких Ангулярах и Реактах.
Сейчас же в ASP.NET Core есть Blazor Server (WebAssembly на вебсокетах).
Он только только продакшн френдли стал. И он не для всех проектов подойдёт. Для тяжёлых клиентов надо однозначно Blazor выбирать вместо всяких реактов/ангуляров. Для остального надо думать.
Я содал словарь с разными типами.
Да, ToString() возвращает строку из числа и строки, чтобы показать её, эту строку - в консоли.
>И он не для всех проектов подойдёт.
Почему не для всех? По вебсокетам дешевле общаться и отзывчивость лучше. Есть автоматическое переподключение. Если вебсокеты недоступны, то переключается на SSE или Long polling. Можно пересылать данные и файлы в бинарном формате MessagePack.
var obj = new { key1 = "value1", key2 = "value2" }
По типу варфейса, кс или пупк
В Юнити например
Это многое объясняет...
https://devblogs.microsoft.com/dotnet/choose-a-net-game-engine/
Открой статью, там ссылки на движки, кликай на каждый из них и смотри что на тех движках пилят. Там хоть шутек, хоть рпг, хоть VR. Например https://stride3d.net
скора. вроде бы даже в ноябре будет презентация
10 ноября.
Сап, шарпач! Это снова я! Все вышеотвеченные ответы понял, принял.
Возникла новая проблема. Читаю документацию по этой авалонии, сделанной любителями и пытаюсь воспроизводить хеллоуворлд. И первое что я пытаюсь сделать, чтобы при нажатии на кнопку вызывалось событие. Мне предлагают три варианта:
1. Прибиндить простую команду.
2. Прибиндить команду Reactive UI (кстати, добавочный вопрос, кем сделан этот и может лучше мне его рассмотреть? Почему вообще авалония эта к нему цепляется, как к зависимости? Не, я конечно и сам погуглю, но и анона бы почитал)
3. Пробросить нормальное классическое событие. И вот тут возникает проблема. Когда я пишу <Button Content="Click Me" Click="OnClick"> клик подчёркивается и пишет, что unable to find suitable setter or adder bla-bla-bla... Я что, должен что-то подключить? Но я делаю в точности по референсу в туториале. Ожидается, что такая фундаментальная вещь, как обработчик нажатия кнопки, должна быть подключена из коробки. Или нет? Хуета какая-то, простихоспаде.
1 угу бинди команды
2 авалония умеет понимать Reactive UI - его команды свойства и так далее правильно.
3 когда пробовал (давно) то было вот https://github.com/AvaloniaUI/Avalonia/issues/1153
щас не знаю. да и вообще нужно не click а tapped вроде бы http://reference.avaloniaui.net/api/Avalonia.Input/InputElement/1F79D61A
выбор между 1 и 2 фломастеры. 2 получишь так, а 1 самому придется фреймворк писать. Для меня это изи и я выбрал 1. но потом ничего не выбрал, потому что мыльность шрифтов в авалонии под винду нет лечения.
в замен могу оставить тестовый акк и 50 гигов квоты на нем
MyClass Class = new MyClass();
через него обращаюсь к переменной и изменяю её, то в следующий раз у неё оказывается то же, неизменённое значение. Как это сделать нормально?
MyClass Class = new MyClass(); создает локальный инстанс. потому никто другой ее не видит - она каждый раз создается. нужно присвоить ее внешнему чему нибудь
нет никакой особой магии. те же правила, что в и однопотоке
представь что ты вызываешь метод с этим MyClass Class = new MyClass(); из одного потока подряд. И подумай как бы ты сохранял переменную между вызовами. Вот это и делай
Если ты под "переменная" имеешь ввиду поле/свойство класса, то просто сделай это поле/свойство статичным.
Это был первый шаг на пути к говнокоду и неуправляемой архитектуре, которую надо будет с нуля каждые 2 года переписывать.
True, False, True, True
Почему во втором случае False хотя строка не менялась.
Ниже пример моих попыток:
вообще да, судя по его комментам этот какой-то студ проект, который сразу после сдачи в /dev/null
Потому что s2 и s3 это ссылки на интернированную строку, а string.Format (s1) это ссылка на ново созданную строку, если обернуть его в string.Intern то результатом второго сравнения будет True.
Ты зачем одно и то же в каждом перекате спрашиваешь?
Уже не надо, сам нашел
ни на какой. остался на WPF. В нем есть TextOptions.TextRenderingMode
>>840796
варианты это uno но это, как я понимаю, вебвью какой то а не натив
или авалония
или QT
и даже если на авалонию (или uno) перегонишь код как есть в основном (не внедряя MVVM) то контролы придется создавать самому. в XAML это конечно проще чем формсы, но все же это знать надо.
Можешь подождать MAUI но хз че оно там будет еще....и когда.
> остался на WPF
Не катит. Оно гвоздями прибито к шындовс. А я ищу замену устаревшему морально Lazarus FreePascal IDE который write once - compile everywhere с библиотекой LCL, кросплатформенным клоном Delphi VCL, которая в винде враппится в win32, в линуксе, в окружении KDE враппится в Qt, в окружении гнома враппится в GTK, в окружении андроида в андроид, и так далее. И всё это создано и отполировано ещё в нулевых. Я не перестаю охуевать от того, что замшелым дидам-паскальщикам это всё доступно искаропки, а молодые шутливые шарпобоги не имеют возможности одним росчерком пера одной распальцовкой клавиатуры создать универсальное окно и нахуярить в него универсальных контролов/виджетов, которое система автоматически встроит в целевую платформу, юзая нативные интерфейсы этой платформы.
Воспользуюсь советами второму анону. Изучу приведённые варианты.
это сахар чтобы не лепить калбэки или цепочки методов в простых случаях когда обычная асинхронщина
Я не знаю какая асинхронщина обычная, а какая нет, у меня нет такого опыта.
Вот, посмотри этот урок. Лично я только после этого видоса этого хача разобрался с асинками-эвэйтами
https://www.youtube.com/watch?v=oGxZuq2Ye2Q
мимо
у меня голова ломается когда я пытаюсь в этом разобраться, есть какие-то учебники которые этообьясняют?
Я бы начал с википедии, а дальше по ссылкам на АИ.
async-await избавляет тебя от необходимости контролировать всё что связанно с потоками и их выполнением, упрощают работу с ними и делают твой код намного читабельнее.
Проблема вот этого кода:
https://ideone.com/zCEfZ4
В том, что каждый вызов Thread.Sleep блокирует поток, в то время как он мог бы выполнять полезную работу и не занимать место в памяти без пользы. Если заменить всё на async await и Task.Delay, то весь код может выполняться в рамках одного потока. Т. е. помимо меньшего потребления памяти за счёт отсутствия необходимости создавать дополнительные потоки, улучшается и производительность за счёт меньшего переключения контекстов между потоками.
await (в любом языке) позволяет переписать цепочку калбеков/продолжений в линейный вид
например псевдокод
(посади дерево).continueWith(построй дом).continueWith(роди сына)
в линейную
await посади дерево
await построй дом
await роди сына
коих 95 методов
но если тебе нужно запустить несколько (посади дерево) одновременно, то тебе уже понадится заводить объект Task
но и там для вместо continueWith для ожидания результата каждой таски поможет await.
но это уже не полноценная замена. ведь await ожидает в данном месте и пока не дождется дальше не пойдет.
например запустил ты 3 таски (посади дерево)
и у тебя 3 таски task1, task2, task3
и ты делаешь
await task1
await task2
await task3
то он остановится и будет ждать task1 и даже если task2 уже все, то оно об этом не знает. потому что это эквивалент
task1.continueWith(
task2.continueWith(
task3.continueWith(
}
}
)
но даже тогда continueWith приходится редко.
await (в любом языке) позволяет переписать цепочку калбеков/продолжений в линейный вид
например псевдокод
(посади дерево).continueWith(построй дом).continueWith(роди сына)
в линейную
await посади дерево
await построй дом
await роди сына
коих 95 методов
но если тебе нужно запустить несколько (посади дерево) одновременно, то тебе уже понадится заводить объект Task
но и там для вместо continueWith для ожидания результата каждой таски поможет await.
но это уже не полноценная замена. ведь await ожидает в данном месте и пока не дождется дальше не пойдет.
например запустил ты 3 таски (посади дерево)
и у тебя 3 таски task1, task2, task3
и ты делаешь
await task1
await task2
await task3
то он остановится и будет ждать task1 и даже если task2 уже все, то оно об этом не знает. потому что это эквивалент
task1.continueWith(
task2.continueWith(
task3.continueWith(
}
}
)
но даже тогда continueWith приходится редко.
Вот мои поиски все тоже ведут в основном к Avalonia. Понятно, что придётся самим контролы писать и у devexpress не взять. Но, боюсь, что вариантов других нет, ибо компании нужна кроссплатформенность. В идеале, конечно, в веб это всё перенести, но приложение слишком нетривиальное и я боюсь представить сколько на переписывание уйдёт лет.
>нахуярить в него универсальных контролов/виджетов, которое система автоматически встроит в целевую платформу, юзая нативные интерфейсы этой платформы.
ну это хамарин формс такой. хотя вряд ли мауи (что идет ему на замену) будет такой же в плане работы на десктопах. Я хз как можно решить проблему шаблонов, ведь хамл создает визуальный вид контрола, а нативные контролы они не такие гибкие. Авалония вот использует свой рендер.
Используются с перечислениями которые помечены атрибутом Flags, если не понимаешь побитовые операции, то будет сложно понять как работает переключение флагов. Поэтому на базовом уровне знать нужно, иначе соснёшь.
Сук(( Понел спс.
> мыльность шрифтов в авалонии под винду нет лечения
Получается, предпоследний пункт на пикче - ложь?
Или там просто WIP и надо просто подождать, затянув пояса?
>>840886
> Я хз как можно решить проблему шаблонов, ведь хамл создает визуальный вид контрола, а нативные контролы они не такие гибкие. Авалония вот использует свой рендер.
Я понемногу начинаю просекать фишку. Если бы WPF не прошёл бы мимо меня стороной, я бы уже давно фишку сёк и даже сомнений бы не было. Потому что это реальный прогресс по сравнению с классическими формо-ориентированными тулкитами. Я уже неделю плотно изучаю вопрос и понимаю, что возврата назад для меня уже не будет. Ни ГТК, ни КТ, ни ВХ не обладают и 10% той гибкостью, что дают хамл-ориентированные тулкиты.
Я не знаю что означает предпоследний пункт. но за рендеринг шрифтов отвечает бэкенд Direct2D и я хз как его заставить рендерить не мыло.
WPF точно такое же мыло рендерит, но там это можно обойти и получить четкий шрифт.
у меня даже встроено вот такое
TextOptions.SetTextFormattingMode(window,
Dpi >= 144 ? TextFormattingMode.Ideal : TextFormattingMode.Display);
TextOptions.SetTextRenderingMode(window, TextRenderingMode.ClearType);
https://files.gitter.im/AvaloniaUI/Avalonia/dmOJ/Core2D-Wiring.gif
вот сделано на авалонии и даже на этой гиф видно шрифты беда
Сорян, я отношусь к противоположному лагерю людей, ради которых и было сделано это всё, мне наоборот режут глаз шрифты без сглаживания. То есть, на этой гифке мне всё видится нормальным. Никакой беды не вижу. Но, я тебя понимаю, возможность включить или выключить сглаживание по запросу пользователя должна быть.
сглаживание есть всегда. вопрос в том какое оно.
Thread.Sleep в том коде это у меня не просто ожидание чего-то, а симуляция работы.
вот на моем экране при моих настройках Clear Type
надеюсь двач не пережмет
1 WPF без ничего
2 Display + Clear Type
3 Avalonia
Так это понятно, только я сомневаюсь что у тебя там вычисления на несколько секунд. В любом случае нужно использовать async/await и класс Task, особенно если речь идёт о IO операциях, таких как обращение к диску или сетевому адаптеру.
Работу нужно не симулировать, а делать )
await это точка, где "уходит в ожидание" и освобождает поток дав поработать кому то другому кому нужнее, пока ждет. Когда await дождется, то его продолжение станет в очередь в текущем контексте синхронизации (тредпул например)
Воспринимай await как тот же ContinueWith только переписанный иначе, где тело продолжения это от await и до конца метода.
Сахар же чтобы уйти от калбэков
в котлине же вон вообще код с корутинами не отличить без них без подсказки редактора.
> освобождает поток дав поработать кому то другому кому нужнее
Сам по себе поток не занимает процессорное время, т. е. Thread.Sleep не тратит процессорное время, он тратит память в котором хранит все данные о себе.
>Сам по себе поток не занимает процессорное время
он занимает сам поток. И если у тебя 1 поток (например гуи) - у тебя лаги или все висит. Количество потоков пула тоже конечно. займешь их все и остальные задачи станут в очередь дожидаясь реального освобождения потоков.
как же мне этого не хватало. В андироид студии давно есть, а тут черт знает что.
Потому что SocketAsyncEventArgs более низкоуровневая концепция чем TcpListener. Т. е. ты вырыл тоннель которым пользуешься только ты и спрашиваешь почему по этому тоннелю ты добираешься из пункта А в пункт Б быстрее, чем по общественной дороге.
Либо твои тесты хуйня.
Шапка треда тебе для чего?
Зумер с конца тред читает..
Как я понял, для получения GetHashCode будет использоваться адрес памяти, где расположен объект.
Но если GC начнёт утрамбовывать память, то адрес объекта может измениться.
Как тогда это будет работать?
>Можно ли сделать HashSet из объектов ссылочного типа, для которых не переопределен GetHashCode.
Можно.
>Как я понял, для получения GetHashCode будет использоваться адрес памяти, где расположен объект.
Откуда ты это понял? Обращаться к памяти при вызове GetHashCode было бы весьма затратно, особенно учитывая, что GC перемещает объекты в памяти со временем.
>Как тогда это будет работать?
Не переопределенный GetHashCode всегда возвращает одно тоже значение для объекта n на протяжении всей жизни приложения. Сборщик мусора никак не влияет на это поведение.
>Не переопределенный GetHashCode всегда возвращает одно тоже значение для объекта n на протяжении всей жизни приложения
А как оно берется-то? Откуда?
Или при инициализации объекту добавляется автоматически поле в памяти со значением хеша?
Если например, поля объекта - такие же ссылочные типы, без данных типа значения.
>А как оно берется-то? Откуда?
Зависит от хеш-функции. При первом вызове GetHashCode CLR генерирует хеш-код и помещает его в синхронизационный блок объекта, дальнейшие вызовы GetHashCode возвращают данное значение.
1. Стоит ли резать основной класс на подклассы. Чтобы было понятно. Допустим это текстовый редактор. Я беру и режу его на FileReader, FileSaver, TextFormatter и т.д. внутри основного класса уже создаю инстансы этих вот подклассов.
2. Насколько стоит думать о близасти конвенциональным понятиям "читаемого" кода? Допустим, ведь можно написать вот так вот:
async Task<ReadOnlyMemory<byte>> ReadData(byte[] buffer, CancellationToken cancellation) => buffer[..(await this.StreamReader.ReadAsync(buffer, cancellation))]
Как по мне оно все еще читаемо, но при этом в 1 строчку вышло, в противовес стандартным примерам где:
async Task<ReadOnlyMemory<byte>> ReadData(byte[] buffer, CancellationToken cancellation)
{
int count = await this.StreamReader.ReadAsync(buffer, cancellation);
return buffer[..count];
}
Ну или если с циклами так вообще смотрите как удобно:
int i = 0;
while( (i = await ReadData(buffer, cancellation) > 0)
{
что-то делаем с данными из буфера
}
и как это будет в классическом примере? А как-то так:
while(true)
{
int items = await ReadData(buffer, cancellation);
if(items == 0) break;
что-то делаем дальше
}
Как по мне первый пример проще понять(сразу видно условие выхода из цикла, например, да и вообще сразу ясно что это за цикл: читаем, пока есть данные которые можно читать) и читается он легче, но почему-то в среде шарпистов я его только в исходниках самого .net вижу, а гитхабы и прочее места где другие люди пишут код - перегруженные конструкции используют, которые длинные, и часто больше с толку сбивают.
А, ну и последнее. В исходниках на гитхабе постоянно вижу эти if(condition) throw new Exception("!!!Some condition happened!!!");
На кой оно надо? Почему не писать так, чтобы такой вот херни не происходило? Ты же сам блин пишешь, зачем кидать эти исключения, вызывая падения там, где можно было бы просто не допустить его возникновения? Нет, блядь, каждый метод как поехавшие проверяют на null, будто он возьмется из воздуха само по себя, если ты сам его туда не передашь, а если передал, ну, сам дурак, все равно программа упадет при и ты увидишь где, а следовательно просто сделаешь так, чтобы не передавался null.
1. Стоит ли резать основной класс на подклассы. Чтобы было понятно. Допустим это текстовый редактор. Я беру и режу его на FileReader, FileSaver, TextFormatter и т.д. внутри основного класса уже создаю инстансы этих вот подклассов.
2. Насколько стоит думать о близасти конвенциональным понятиям "читаемого" кода? Допустим, ведь можно написать вот так вот:
async Task<ReadOnlyMemory<byte>> ReadData(byte[] buffer, CancellationToken cancellation) => buffer[..(await this.StreamReader.ReadAsync(buffer, cancellation))]
Как по мне оно все еще читаемо, но при этом в 1 строчку вышло, в противовес стандартным примерам где:
async Task<ReadOnlyMemory<byte>> ReadData(byte[] buffer, CancellationToken cancellation)
{
int count = await this.StreamReader.ReadAsync(buffer, cancellation);
return buffer[..count];
}
Ну или если с циклами так вообще смотрите как удобно:
int i = 0;
while( (i = await ReadData(buffer, cancellation) > 0)
{
что-то делаем с данными из буфера
}
и как это будет в классическом примере? А как-то так:
while(true)
{
int items = await ReadData(buffer, cancellation);
if(items == 0) break;
что-то делаем дальше
}
Как по мне первый пример проще понять(сразу видно условие выхода из цикла, например, да и вообще сразу ясно что это за цикл: читаем, пока есть данные которые можно читать) и читается он легче, но почему-то в среде шарпистов я его только в исходниках самого .net вижу, а гитхабы и прочее места где другие люди пишут код - перегруженные конструкции используют, которые длинные, и часто больше с толку сбивают.
А, ну и последнее. В исходниках на гитхабе постоянно вижу эти if(condition) throw new Exception("!!!Some condition happened!!!");
На кой оно надо? Почему не писать так, чтобы такой вот херни не происходило? Ты же сам блин пишешь, зачем кидать эти исключения, вызывая падения там, где можно было бы просто не допустить его возникновения? Нет, блядь, каждый метод как поехавшие проверяют на null, будто он возьмется из воздуха само по себя, если ты сам его туда не передашь, а если передал, ну, сам дурак, все равно программа упадет при и ты увидишь где, а следовательно просто сделаешь так, чтобы не передавался null.
>1. Стоит ли резать основной класс на подклассы.
Зависит от того, как ты будешь с этими подклассами взаимодействовать, за что конкретно они будут отвечать. Если ты эти части менять будешь редко, то не стоит, потому что это только раздует твой код. Если у тебя предполагаются различные реализации условных FileReader, FileSaver, то стоит.
>Как по мне оно все еще читаемо
Так можно про любой код сказать, который ты написал пару минут/часов назад. Попробуй разобрать эти однострочники через неделю/месяц и поймешь почему так делать нельзя.
>Ну или если с циклами так вообще смотрите как удобно:
>while( (i = await ReadData(buffer, cancellation) > 0)
А зачем тебе вообще i объявлять? Оно здесь лишнее.
Отдельные переменные нужно объявлять если собираешься их считывать и исходя из значения что-то делать, в случае с чтением потока байт это может быть изменение размера буфера.
>В исходниках на гитхабе постоянно вижу эти if(condition) throw new Exception("!!!Some condition happened!!!");
>Ты же сам блин пишешь
Гитхаб - опенсорс. Опенсорс - твой код помимо тебя будет использовать кто-то еще. И чем он его дополнит, как допишет, как будет использовать - тебе неизвестно, поэтому если случилось что-то критическое, то нужно бросать эксепшн, а не ждать пока пользователь твоей библиотеки обнаружит, что с его данными какая-то хуйня неведомая творится.
>
1 резать нужно всегда ибо SRP, но они не будут подклассами же. Хз о чем ты
2 ну можно ведь пойти дальше и принимать не byte[] buffer, а вообще Span
ну или вообще yield
3 если пишет значит ожидает что может пойти не так и что внутри не будет исключений, а значит сам обязан кинуть исключение
Имеется html форма в которую через инпут заливается картинка, далее это дело отправляется POST запросом в Контроллер в виде параметра IFormFile.
Тут возникает вопрос: как мне из этого IFormFile'а сформировать что-то, что я смогу отправить методом Http.PostAsync в API в виде (опять же) POST запроса? Я пытался упаковать эту картинку в StreamContent, StringContent, но на всё один ответ - "Unsupported media type".
>>840838
> А я ищу замену устаревшему морально
Я НАШЁЛ!
И это... Eto!
Нашёл его, изучая предложенную мне аноном авалонию, в которой Eto в ряде случаев юзается, как бэкэнд. Я загуглил, а там! Полноценный ЮИ-фреймворк, да ещё есть возможность описывать формы на JSON. Это второй бурный оргазм, нахуй!
Мне просто нравится язык, я не хочу шлепать формы.
А что ты на нём писать собрался, если не wpf/winforms и не вебформы? Игры еще есть на юнити и не только.
Ну ты показал, как это отправить в соответствующую функцию на API пост-запросом, но на API должен быть код, который это откуда-то достанет. Я пытаюсь несколько часов это достать, как параметр принимающей функции, но в результате либо null, либо Unsupported media type
Есть просто бек. Есть бек с микросервисами. Есть бек с лютой скалабельностью, параллелизацией и хайлоадом.
Наверное, есть еще тысяча и одна область, о которых я не знаю. Но я хочу верить, что программисты это не только формошлепы и веб макаки. Лучше уж тогда пинать хуи на мамкиной шее, чем пиздовать на такую работу.
>Есть просто бек. Есть бек с микросервисами.
Как видишь - нет. Либо ты фуллстэк, либо фронтенд-макака.
>Есть бек с лютой скалабельностью, параллелизацией и хайлоадом.
Это уже больше к С++ относится и серверным частям на нём, а не к шарпу.
>Это уже больше к С++ относится и серверным частям на нём, а не к шарпу.
Та бля, в каждой шарпо презентации говорят насколько он крут и быстр. Да и структуры с указателями в нем точно не просто по приколу.
> с лютой скалабельностью, параллелизацией
TPL дает охуенные фичи для паралеллизации, а скалабельностью славится даже скала с ее акторами.
Мне кажется, плюсы нужны только ты пишешь что-то под комп клиента- игру, сложную программу типа фотошопа и тд. А на сервере хоть на питоне пиши, просто пиши так чтобы можно было без напрягов просто добавить еще один сервер, если один не вытянет.
>Та бля, в каждой шарпо презентации говорят насколько он крут и быстр.
Ну да, в сравнении с петухоном, пыхой и даже жабой, он довольно быстр. Вот только на нём написано мало, поэтому и мало чисто бэкендных позиций. Новый код на нём писать выгодно только в том случае, если его будет писать разраб-фуллстек. Вот поэтому мы и имеем вакансии с акцентом на фуллстеков.
>TPL дает охуенные фичи для паралеллизации
В TPL нет ничего нового и сверхъестественного, это просто удобная часть стандартной библиотеки, которая в других языках, в той же жабе, существовала в виде пользовательских библиотек.
Я о такой не знаю. Мидло-щарпо-работа без фронта есть.
https://www.youtube.com/watch?v=kX0eX5tDGgc
У нас фронта под дотнет в принципе нет, поэтому даже джуны клепают серверную часть, не трогая фронт-енд. Но HTTP1/2 протоколы знать всё равно нужно вместе со всякими куками, Etag'ами, request/response'ами.
А что ты подразумеваешь под джуноработой? Просто интересно. Вот когда я пришел на дужна за 11к рублей, мне сказали: Смотри, Вась, тут заказ есть, нужно разработать решение на микросервисах, вот тебе требования, вот пожелания, - пиздуй делать, через месяц не будет MVP с фронтом на ангуляре - досвидос. Я за это время выпил энергетиков на большую сумму чем мне платили, благо все еще на шее мамки сижу. Потом правда до 20к подняли зп, теперь доволен как слон, на энергетики и даже сигареты хватает.
>Вот когда я пришел на дужна за 11к рублей,
пришел когда? даже джун не может зарабатывать меньше чем грузчик.
а я думал крепостное право давно отменили. Вижу ошибался
Привык к тому что джуну 800-1000 долларов
а зачем?
11к платят трейни, джунам я считаю минимум 25к, либо 20к на три испытательных месяца, а дальше нормальная зп
Имеется ASP net core приложение.
Пользователь в инпут формочку загружает картинку, эта картинка POST запросом отправляется в функцию, обрабатывающую POST запросы по данному адресу. В этой функции картинка появляется в виде IFormFile интерфейса в качестве параметра функции. Теперь нужно как-то отправить эту картинку по известному Uri в другой контроллер и как-то эту картинку в нем прочитать
1ый пик - Функция извлекающая картинку из формочки и пытающаяся отправить картинку по другому адресу при помощи PostAsync
2ой пик - функция, которая должна принять картинку, но вместо этого если указать у нее какой-либо параметр, то возвращает код Unsupported Media type, если не указывать параметры, то не понятно, как получить отправленную картинку
ну так посмотри что там за хидеры и вообще как шлет данные это твой api.PostAsync
твой new StreamContent хз какие хидеры передает, ты их не ставишь, а дефолтное там хз
и на принимающей стороне хз чем должен думтаь фреймворк чтобы впихнуть полученные данные в object photo
Если ты про множество Headers, то что у StreamContent'a, что у HttpClient'a api оно пустое
>то что у StreamContent'a, что у HttpClient'a api оно пустое
потому и отбивает его фремворк как "я не знаю какой Content-Type у того что мне шлют и я хз че с ним делать". Это первая проблема
>Хедеры
Кажется у нас новый председатель
Поставил стрим контенту контент тайп application/octet-stream, вопрос как прочитать это остается открытым
да точно так же
или запрос не стримконтент, а полноценно
MultipartFormDataContent в котором уже стримконтент и которое неотличимо от "отправляю форму" и на получении тот же IFormFile
или на клиенте [FromBody] но вряд ли там можно получить стрим как IFormFile (все таки апи), тогда [ReadableBodyStream] к action и вычитывать тело запроса самому
В принимающей функции Request.Headers["Content-length"] итак 26838 возвращает, без моей помощи
Мне принять картинку надо в API, можешь написать как это сделать?
Что значит "[ReadableBodyStream] к action" я не понимаю
MultipartFormDataContent для API мне видится как костыль, но если вариантов не будет, то попробую его, спасибо
>[ReadableBodyStream]
да хз. увидел тут
https://stackoverflow.com/questions/40494913/how-to-read-request-body-in-an-asp-net-core-webapi-controller
но возможно это кастомный аттрибут того, кто это писал. а остальные перепостили и размножили
так что просто читай тело запроса - оно и есть содержимое картинки
public IActionResult SomeAction()
{
using (var reader = new StreamReader(Request.Body))
{
....
}
...
}
Ну как, меня сразу взяли в штат и дали работу, которую потом отдали заказчику и заказчик доволен был. Вот.
Сейчас, спустя 2 года - 20к получаю. Вот.
> бел. рублей?
Российских
> как это 20к спустя два года?
Ну, если сравнивать с 11к и учитывая что я на мамкиных котлетках с макарошками - нормально.
> или гос. контора?
Внезапно - лидер в своей области, причем мировой, мать его(там даже пару лет назад скандал был, дальше не буду распространяться, т.к. еще узнаете где я работаю, а тут за очернение репутации фирмы и выпизднуть могут). Просто те кто управляют - предпочитают себе выписывать каждый квартал премию с 6 ноликами в долларах, а за проебы все на кодеров сваливать, и за это тут постоянно говорят про то что кодеры не справились, ну да, блядь, штат 20 человек - 50 проектов, сука, конечно не справились, у вас же всяких продажников 500 человек и у них продвижени по службе - охуенные идеи, которые скидывают на кодеров, и потом кодеры виноваты что не выстрелило, ведь охуенная идея по всяким рассчетам должна была миллиарды денег принести, а это кодеры такие вот хуевы и похуй что даже на джуна вешают полноценные проекты, похуй что на кажодом челе по несколько - расширять штат мы не будем, это вы как-то работайте быстрее. Благо хоть понимают, что таких вот дураков не много и просто так не выгнать.
> таких вот дураков
Воистину при капитализме капиталист платит ровно столько, за сколько готовы работать. Как же они рады, что у них в штате 20 дурачков, которые работают за зарплату дворника и не увольняются.
А просто некуда идти. Тут знания специфичны очень и соотвсетственно ты будешь вынужден с позиции максимум мидла начать на другом месте, единственный конкурент - платит столько же, но по договору, который нужно было подписать после скандала, идя конкретно к нему ты должен выплатить штраф в размере всех ЗП которые ты получал пока работал тут. Это многих напрягает, особенно тех кто работает лет по 15.
> по договору, который нужно было подписать после скандала, идя конкретно к нему ты должен выплатить штраф в размере всех ЗП которые ты получал пока работал тут
И кстати, осторожнее с такими подробностями. По такой юридической практике контору уже принципиально возможно вычислить. А двач славен шерлоками комнатными.
Не нужно радоваться за меня. Лучше себя пожалей. Джун не должен получать меньше 1000(не рублей) тем более через 2 года.
Скажи честно ты поехавший или просто траль? Почему ты не ищешь работу в норм компаниях? Есть скайп, есть зум, нет хочу за 11к хуй сосать, нахуй переезжать куда-то?
Такс, Repository Pattern используемый над EF Core официально полнейшее говно по многим причинам, но есть ли более-менее адекватные альтернативы?
https://lostechies.com/jimmybogard/2012/10/08/favor-query-objects-over-repositories/
Вот один из примеров на что его можно заменить, как минимум плюшки IQueryable не теряются, но блять, под каждый пук определять отдельный класс, это как-то сомнительно. Кто-то пробовал придумать универсальное решение, или может нактыкался на него?
Лол, я без опыта вообще первую работу нашел на ЗП 60к+, просто не надо в себе сомневаться и надо пробовать влетать всюду куда предлагают. Если ты завалишь собес тебя никто не покусает, а если пройдешь то на реальном проекте можно быстро дотянуть то чего не знаешь, и это понимают и те кто собеседуют, на собесах чаще смотрят просто на то как ты мыслишь и рассуждаешь, чтобы понять что ты из себя представляешь.
зря ты лезешь в эту тему. спокойствия теперь никогда не найдешь
а так вот читани https://habr.com/ru/post/259829/
А так одних только QueryObject куча вариантов
и тут уже фломастеры ибо нет идеала
Тебе показать выписку по ЗП? 20к после вычета налогов, стаж 2 года.
>>844719
Вангую что ты ДСоблядок. Конечно, у вас и в макдаке каждый хуй по 300к получает, что удивляться-то, сосете кровь из регионов. А тут вот кодеры с 15 летним стажем получают 50к и довольны как не знаю кто, я с 20к тоже вроде доволен, только вот хочется видеокарту обновить(770 уже не тянет), но видимо подожду следующего поколения.
просто тебе нужно уйти в другую контору. Для программирования иметь зарплаты 1000-3000 енотов это нормально ожидаемо
да в этой же теме обсуждали вакансию, где мелькала сумма от 100к для мидла (+ переиндексация)
> Repository Pattern используемый над EF Core официально полнейшее говно по многим причинам
Да как раз нет. Если тебе действительно нужны фишки IQueryable снаружи - делаешь интерфейс для репозитория который этот твой IQueryable возвращает и этот интерфейс просто расширяет другой интерфейс обычного репозитория, банально вот у тебя IAsyncRepo<T> вот у тебя IQueryableRepo<T>. Другое дело, что нахуй оно надо-то? Вот серьезно. На высоком уровне ты просто инжектишь сервис который уже все под капотом сам сделал, даже с репозиторием не работаешь напрямую. А внутри этих сервисов - просто делаешь что тебе надо.
Ну и да, сами майки почему-то в своих примерах с архитектурой используют репозиторий над EF. И норм у них, красивенько все удобно.
Опять же, если нужно будет затестить саму бизнес-логику, тебе не нужно париться с наполнением БД и прочей залупой, ты просто замокал репозиторий и можешь нормально проверить работу сервиса на соответствие бизнес-задачам.
А чтобы такой вот аналог запросов получить - берешь https://github.com/ardalis/Specification и используешь
Проблема в том,что не работает команда:
using (var connect = new NpgsqlConnection(someConnectionString))
{
connect.Insert(dataSet);
}
Класс примерно такой
public class DataSet
{
public int data_count_1 { get; set; }
public int data_count_2 { get; set; }
}
>Другое дело, что нахуй оно надо-то?
Это все выглядит как лишний уровень абстракции, который не служит никакой цели, кроме как чтобы Unit тесты было писать якобы проще при том, что в EF Core уже есть абстракция IDbSet, которая по сути и есть репозиторий, в инете в целом, легко найти статьи о том, почему утверждение что тестить EF Core напрямую сложно или невозможно - это не совсем правда, так еще такой подход закрывает плюшки ORM. То что майки сами его используют в каком-то туторе, и то что его используют во многих примерах "Best Practicies" - еще не значит что его надо пихать абсолютно везде. Я ищу альтернативы, потому-что, к примеру, если мне не нужны Unit тесты в каком-то маленьком-простеньком проекте, то репозиторий по сути только мешает, но при этом я бы не хотел иметь прямые зависимости от EF Core в сервисах или контроллерах, шобы все было по DIP.
Вообще, на базовом уровне, еще давно когда я читал по нему туторы меня смутила необходимость определять методы навроди "GetHuinyaWithZalupa" в репозиториях, при том что существует IQueryable, тогда я забил, но сейчас мне это не дает покоя. Очень сомнительная хуйня, ты по сути сам себя сознательно ограничиваешь при этом можно сказать что ты в некотором смысле даже нарушаешь OCP, и не понятно какие реальные профиты от этого получаешь. Я придумал реализацию Generic Repository на основе IQueryable, которая не требует определять отдельные интерфейсы под каждую отдельную сущность, на западных ресурсах буржуи сказали что вариант интересный, но использование репозитория вместе с EF Core раскритиковали, в целом, указав на то что этот функционал уже есть искаропки. Вот решил еще у соотечественников спросить.
Clean code, все дела. С репозиториями и GetHuinyaWithZalupa() методами у тебя получается больше кода, но каждый кусок отвечает только за свой функционал. Репо хорошо ложатся в CQRS. С репо ты напрочь закрываешь какие-либо зависимости: сегодня Dapper, завтра EF, там у тебя постгрес, тут у тебя монго. А то ведь данные и с какого-нибудь сервиса прилетать могут. Через репо ты абстрагируешься от источника данных и отдаёшь бизнес логике только удобовариваемые контракты, по которым она работает с данными.
Кода больше, но поддерживать и расширять такой проект, когда он перевалит за 1кк строк, просто. Каждый девелопер может свой кусок менять не боясь за то что поломает чужую логику или наделает кучу merge conflicts.
> Или можно как-то запихать все принциплы в свойство юзер?
Я уверен, что с помощью ООП-полиморфизма можно.
Пишет что не ключа для name_spase.table
Если сделать поля без _ везде, то он нормально работает.
Я так понял нужно сделать
public class DataSetMap: DommelEntityMap<DataSet>
и как то ее инициализировать, но возможно просто использовать атрибуты для полей класса, правда я не понял каких.
abstract class SobachiyZvuk : AudioComponent;
class SobachiyLai : AudioComponent;
class SobachiySkuliozh : AudioComponent;
class SobakaGeneric<T> {
public T Zvuk { set; get; }
public SobakaGeneric<T>()
{
if (T is AudioComponent) Zvuk = new T();
}
}
И НАКОНЕЦ
var SkuliashyaiaSobaka = new SobakaGeneric<SobachiySkuliozh>();
var LajushyaiaSobaka = new SobakaGeneric<SobachiyLai>();
Как-то так, я полагаю
Ты вообще про что?
Хорошо а в первом случае почему true ?
Ведь там по идее будет сравнение по ссылкам на объект в они будут отличаться потому что будет выполняться метод Join. Или я не прав ?
Строки это иммутабельный тип и сравнение у них происходит как у значимых типов т. е. по значению.
Вот есть такой язык VBA (бейсик для MS офиса).Есть программы сделанные в MS Access - окошки через формы, логика на VBA.
Мне дали задачу - сделать морду-интерфейс (фронтэнд) на шарпе
Так вопрос - можно ли из C# вызывать функции написанные на VBA?
Потому что переносить весь старый бейсиковский код на шарп - легче застрелиться.
Можно, но только при условии, что код на VBA является CLS-compliant кодом, т. е. в нём не используются фишки конкретно VBA, в шарре например если использовать uint тип в коде шарпа, то этот код не будетс cls compliant.
Админил в начале нулевых софт, написанный в этой чудовищной среде (MS Access + VBA). Админил несколько лет. Что я могу тебе посоветовать? Беги оттуда, глупец, пока не поздно!
Несмотря на то, что ты пишешь:
> Потому что переносить весь старый бейсиковский код на шарп - легче застрелиться.
Я рекомендую именно с этого и начать, чем раньше, тем лучше.
Можешь, как советует этот >>846019 анон, завести в солюшене два комплиантных проекта, один на ВБ.Нет с перенесённой в него логикой из акцес-формочек (и пожалуй в нём же организовать доступ к БД), собирающийся как библиотека, второй на шарпе, с первым в качестве зависимости, и он содержит фронтэнд.
Как-то так.
Замечу ещё, что просто так ты код из VBA на VB.Net не перенесёшь. Там работы будет дохуищща! И проще сразу на шарпе всё переписывать.
И ещё, у МС есть функционал для запила дотнетных расширений к офису, в том числе к акцессу. Я его никогда не пробовал в работе, но в принципе вся эта идея выглядит сомнительно. Нирикаминдую, хоть и Пастернака не читал.
Во втором случае строки приводятся к объекту, после чего идёт сравнение объектов, а не строк, чего ты тупой то такой?
в четвертом тоже строки приводятся к объекту, после чего идет сравнение объектов.
И какой логический вывод ты можешь сделать, глядя на переменные из второго сравнения и четвертого? Будут ли одинаковыми объекты полученные из строк? Если да, то почему? Если нет, то почему?
ну вывод там прост
в 4 случае сравниваются 2 интернированные строки и это вообще 1 объект (компилятор постарался)
в первом сравниваются строки, потому что интернированная строка это тоже строка
а во втором объекты и значит string не перегружает object.Equals, вот только он перегружает
Хотя, если их когда-нибудь будет ещё сотня, то можно будет и прикрутить.
жуть какая то.
тут же выше обсуждалось Let котлиновское и аналог в шарпе.
он и то лучше выглядит
но имхо автор другое просил
Делай, почти как анон выше предложил, только без горожения безумных интерфейсов и фабрик. Заведи одну функцию, которая принимает аргумент и коллбэк, если аргумент = нулль, дёргает коллбэк. Просто, быстро, говняно, неподдерживаемо.
Если переменные нескольких типов, это же очевидно, что надо сделать: скопипастить функцию с другим типом аргумента.
>Let котлиновское
Можно и как в котлине. И даже лучше! Потому что котлин обосрался как всегда (пик2).
потому что правильно исползовать в котлине
str?.let {и тут не нужно сравнение на нулл}
но это еще дальше уходим от проблемы автора
>потому что правильно исползовать в котлине
Ага, потом нам понадобиться чтобы при null выполнялось отличное действие от того, когда у нас не null и в котлине мы схватимся за голову и соснём.
>но это еще дальше уходим от проблемы автора
Никто никуда не уходил, всё то что ему нужно - если переменная null, то ничего не делаем, если у неё значение, то выполняем метод.
>Ага, потом нам понадобиться
Если бы у бабушки были....
Каждой задаче свой инструмент. Нет задачи - не нужно хвататься за голову.
>всё то что ему нужно - если переменная null, то ничего не делаем, если у неё значение, то выполняем метод.
а я понял что ему не только нужно чтобы выполнялся метод если очередная переменная нул, а чтобы дальнейшие нулл переменные не обрабатывались
на что я запихал бы все переменные и методы в List<KeyValuePair<object, Action>> и проходил бы по ним.
Посоветуйте учебник для новичков в этой технологии или же материалы, которые помогут мне хоть немного наверстать упущенное время и пробелы в знаниях.
>Каждой задаче свой инструмент. Нет задачи - не нужно хвататься за голову.
В инструменте ценится универсальности, если нет универсальности, значит должно быть выше качество. У котлиновского let нет универсальности, при этом оно и качеством ниже чем шарповский аналог.
> я понял что ему не только нужно чтобы выполнялся метод если очередная переменная нул, а чтобы дальнейшие
Так перечитай. Я тоже не правильно понял, ему нужно выполнить действие, если переменная null, т. е. заменить:
if (var1 == null) method1();
if (var2 == null) method2();
if (var3 == null) method1();
На что-то более лаконичное.
для любителей web forms сделали razor pages
А вообще ASP.NET Core MVC он как и тысячи ROR-подобных фреймворков - разобрался в общем устройстве одного и вкатится в другие (даже на других языках) просто, ведь понятно что где лежит и зачем
>В инструменте ценится универсальности
у меня молотком плохо шурупы закручиваются. только заколачиваются и потом не выковырять. Выходит молоток говно? )
>если переменная null, т. е. заменить:
признаю. он запутал меня этим
if((string1 ?? int2?? string3 ?? double4?? string5 ?? string6) == null)
>у меня молотком
Вторую часть манямирок отказался воспринимать?
>если нет универсальности, значит должно быть выше качество выполнения задачи, чем у более универсального инструмента.
>для любителей web forms
Я не любитель, а застрявший в этой технологии из-за места работы. Несколько лет поддерживавал древний проект, теперь приходится срочно переучиваться на самое новое, что есть в .Net по части вэба. А это, насколько мне известно, Core MVC.
ну так ?.let отлично выполняет ту задачу, которую он выполняет. Просто сверхотлично, без дополнительных if если что.
В том и дело, что не выполняет var?.let не выполнится если var == null, а ему как раз нужно чтобы выполнился если var == null и не выполнился, если иначе.
>var?.let не выполнится если var == null,
угу. потому что его задача делать другое
а вообще есть же универсальный if. зачем еще что то городить )
> всё то что ему нужно - если переменная null, то ничего не делаем, если у неё значение, то выполняем метод
Выполняем метод всегда, а у метода в начале if (argument == null) return;
Всё гениальное - просто.
Во-первых.
>Я тоже не правильно понял, ему нужно выполнить действие, если переменная null
Во-вторых
>у метода в начале if (argument == null) return;
Хуевое решение, потому что условия могут поменяться для каких-то определенных переменных, либо в каких-то случая понадобится проверка на что-то еще, тогда тебе придётся пилить костыль, либо переписывать уже существующий код.
все еще проще
void ExecuteForNonNulls(params Tuple<object?, Action> foo){
foreach(var (obj, action) in foo){
if (obj!=null)...
]
}
и вызов
ExecuteForNonNulls(
(var1, Action1), //а можно и лямбду если параметры есть
(var2, Action2),
(var3, Action3)
)
О да! Точно! Двачую кортежи!
Не, самое новое - это Blazor и gRPC. Вот где придётся полностью переучиваться :)
Razor Pages тоже новее Core MVC.
Ещё нынче принято "котлеты отдельно, мухи отдельно". Пишешь API, а морду делаешь на всяких Vue/React/Angular. Но я бы Blazor выбрал.
>Razor Pages тоже новее Core MVC.
для любителей web forms создан или для простых случаев. Так то он хуже чем MVC.
>Но я бы Blazor выбрал.
каждой задаче свой... а задачи бывают разные.
Алсо, можете плес пояснить что я делаю не так? В резюме кратко описал все свои пет проекты, основные проблемы с которыми в них столкнулся и что из них изучил/ что в них юзал. Но ссылок на исходники кидал только для одного проекталан, для двух, но второй не на шарпе, да и в нем я не овнер, просто сделал всю архитектуру и большинство коммитов. другие проекты уж слишком говнокодисты, чтобы я ими на гитхабе хвастался
В этом ли проблема? Кинул резюме уже на две вакансии, а меня по-просту проигнорили, даже на собес не позвали.
Есть типы вроде int?, которые будут упаковываться при передаче в метод который принимает тип object.
>описал все свои пет проекты
Стену текста никто читать не будет, особенно связанную с пет-проектами. Резюме читает не программист, а человек из отдела кадров знания которого весьма поверхностны, поэтому ему в хуй не уперлось читать твои истории и тем более смотреть что там на гитхабе.
>В этом ли проблема?
Откуда нам знать? Мы твоего резюме не видели.
Так а что тогда в резюме писать? Коммерческого опыта у меня хуй да нихуя, остаются только пет проекты и гитхаб.
>>>1846448
> че написать на микросервисах для резюме
Напиши систему управления авиаперелетами. Чтобы все чин по чину, сервисы для просчетов маршрутов, сервисы определения по оптимизации закупок топлива, сервисы для составления отчетностей и т.д. При этом следи чтобы все по солиду было и соблюдай DRY. Про тесты не забудь. Все должно собираться одним кликом и сразу деплоиться куда скажут.
> что я делаю не так?
Вангую много текста, мало тегов. Надо наоборот как раз. Тебя на собес позовет хрюша, а не тимлид или кто-то из тех кто шарит. Хрюша, это как тупой гугл, она просто видит ключевые слова и зовет на собес тех кто подходит. Гитхабы и прочее уже будут на собесе смотреть, если конторе интересно, обычно ограничатся разговором что тебе интересно, что делал, что умеешь, если не совсем мудаком покажешься и будет своя система управления авиаперелетами - возьмут.
>object?
object по определению нулабелен, поэтому "?" излишен, разницы нет.
>впрочем, нет разницы, работать будет
Работать будет, но медленнее и с большим потреблением памяти, т. е. не без разницы.
>object по определению нулабелен, поэтому "?" излишен, разницы нет.
все реф типы нулабельны по определению, а ? пишем, чтобы подчеркнуть факт нулабельности для анализатора.
>т. е. не без разницы.
я к тому, что упаковка не влияет на работоспособность. А разница в потреблении памяти и прочем - так она во всем. Хочешь скорость - пиши 100 этажные if и за каждым боксингом следи. Хочешь меньше писать - жертвуй.
правда тут жертв то....немного боксинга (переменных то несколько...хотя можно в цикле ага да), но только на значимых типах, коих может не быть. да и делегат еще аллокацию сделает
всё. хватит. всем срочно писать как в GO - простыни ручного говнокода. Нахер сахар. Только соль
> пиши 100 этажные if и за каждым боксингом следи
Только что загуглил боксинг. Возможно я понимаю неправильно, но боксинг это упаковка переменной в object и она у нас появилась только после того, как мы всем тредом начали от 100-этажных if-ов уходить. Не?
>а ? пишем, чтобы подчеркнуть факт нулабельности для анализатора.
Какого анализатора? Нормальная IDE тебе предупреждение выдаст и попросит удалить лишний символ.
> Хочешь меньше писать - жертвуй.
Так жертвовать и не надо, для того чтобы не жертвовать придумали обобщения.
боксинг появился из-за каста к object значимого типа. Если у тебя не высоконагруженный код не парь мозг. Больше проблем от того, что тип теряется и если тебе нужно его передавать в делегат, то придется обратно кастовать
и хоть это работоспособно но выглядит ущербно.
>>846488
>Нормальная IDE тебе предупреждение выдаст и попросит удалить лишний символ.
значит Visual Studio плохая IDE (скрин зри). зопесал.
>Так жертвовать и не надо, для того чтобы не жертвовать придумали обобщения.
есть такое, но баланс "короче if/оверхед" не такой хороший. И я бы выбрал if, чем множественный вызов обобщенного метода.
>Напиши систему управления авиаперелетами.
Звучит конечно круто, но проблема та же, что и с бд лабами в универе - я понятия не имею, как на самом деле авиаперелеты устроены. И я уверен, что закупки авиатоплива на миллионы долларов для кучи лайнеров устроены гораздо сложнее, чем я могу представить.
Хотя, ты натолкнул меня на мысль сделать свой аналог убера - вполне реалистичный стартап, который способен реализовать один программист. Хз правда, как на сервисы разделить точно будет сервис для клиента, сервис для таксиста и мб сервис для поиска оптимальных путей, да и в андроид разработку я не очень хочу вкатываться.
>Вангую много текста, мало тегов. Надо наоборот как раз. Тебя на собес позовет хрюша, а не тимлид или кто-то из тех кто шарит.
Ок. Вырежу почти все из "опыта", и удвою колличество скиллов., говоря даже о том, в чем не шарю. Надеюсь, проактит.
Спасибо за ответ, анон.
>значит Visual Studio плохая IDE (скрин зри). зопесал.
Вычеркивай.
> И я бы выбрал if, чем множественный вызов обобщенного метода.
А потом переписывал бы код, когда проверки перестали ограничиваться одним if-ом. Либо когда в if нужно добавить еще какое-либо условие.
>Вычеркивай.
ты не используешь <Nullable>enable</Nullable> ?
ты мазохист? али старообрядец? Надеюсь на неткоре хоть пересядешь)
>когда проверки перестали ограничиваться одним if-ом.
тогда и обобщенный метод не поможет.
да и в обоих случаях можно запилить Predicate<bool> но читабельность от этого не вырастет
а переписывать СТОЛЬКО ЖЕ
>гораздо сложнее, чем я могу представить
так и есть. неважно сколько у тебя опыта программисткого за плечами, но если ты не понимаешь тему, которую нужно закодить, то считай, что ты джун
Лучше опиши технологии с которыми сталкивался и как их использовал. Будет много и честно.
А один хер все на собеседовании будет выясняться
>ты не используешь <Nullable>enable</Nullable> ?
Нет, я ведь не восторженная макака, которая тащит всё новое в код, независимо от пользы.
>старообрядец
Когда по умолчанию будет enable, тогда и приходи.
>тогда и обобщенный метод не поможет.
Создаешь метод-расширение ExecuteIfNull<T>(this T value, Action action), в нём у тебя будут все нужные проверки, код который использует его не будет меняться если нужно будет сделать дополнительную проверку.
> независимо от пользы.
NRE, та которую назвали ошибкой на сколько там долларов, бесполезна
так и думал )
>Когда по умолчанию будет enable
он не может так быть. это вам не котлин, где это с самого начало и как положено. Тут это новая фича и включать по дефолту анализатор, когда весь написанный до этого код, не следует этим правилам - никто небудет
>код который использует его не будет меняться если нужно будет сделать дополнительную проверку
как это не будет если будет
если мне нужно будет вместо if(val!=null) сделать if(val!=null && val !="foo") то что обжект метод, что этот обобщенный сразу пойдут лесом.
В предикатный метод
ExecuteIfNull<T>(this T value, Predicate<T, bool> pred, Action action)
еще можно добавить проверку, но сам такой метод не сильно лучше голого if (даже хуже)
>>846019
>>846041
Спасибо. Но оказывается есть решение, через библиотеку Interop офиса.
using Access = Microsoft.Office.Interop.Access;
access = new Access.Application();
access.OpenCurrentDatabase(@"bd.accdb", true, null);
string ret = access.Run("func", myarg);
access.Quit();
(но блин, оно только для .net framework. Для .core нихрена, нет рабочей Interop... Хотя решение тоже нашел, руками вписать ссылку на com либу в .csproj (скопировав из проекта на нетфреймворке)
Так вот, есть ли что-то про архитектуры кроссплтформенных решений? Ну, скажем, я представляю чего мне нужно в конечном итоге получить с точки зрения пользователя движка и под винду я точно знаю как это сделать, а вот как сделать так чтобы оно на линуксе, и андроиде, как минимум, работало одинаково - уже нет. Я ради примера смотрел исходники всяких SDL/SFML(да-да, С/С++, но оно действительно кроссплатформенно), и там все выглядело примерно так: Вот мы зафигачили дефайнов затем прошлись #ifdef, там подключили под одним и тем же именем разные файлики с конкретной платформой и дальше фигачим. Так вот, как я понимаю в шарпе такой подход не будет работать, банально потому что тут препроцессорные директивы не делают таких вот крутых штук. А как тогда? Делаем разные реализации для каждой платформы(допустим обработку работы клаивиатуры), они имплементируют один интерфейс(допустим IUserInputProvider), а при настройке контейнера таки проверяем #IF где мы там запущены и запихиваем это в контейнер, ну а дальше просто фигачим на интерфейсах? Или как? Или что? Довольно сумбурно получилось, просто не имел опыта с написанием кроссплатформенного кода, обычно выбирал всегда то на чем мне нужно и фигачил.
Почему это тут спрашиваю? Очевидно же - буду делать на шарпике.
Этот видос кусок говна.
>GetHuinyaWithZalupa()
А если у меня не две сущности, а 15, или мне нужно чтобы сущности из нав. свойств вернулись с каким-то нав. свойством определенном в них? Прикольный выйдет метод GetHuinyaWithZalupaWithPizdaWithAnusWithGovno().
Чем больше погружаюсь в эту тему, тем более сомнительно этот паттерн выглядит.
А если в результате этой вашей рефлексии, проявляется детерминированность алгоритмики психики, которую можно автоматизировать и захардкодить кодингом кодерским?
Это копия, сохраненная 2 апреля 2021 года.
Скачать тред: только с превью, с превью и прикрепленными файлами.
Второй вариант может долго скачиваться. Файлы будут только в живых или недавно утонувших тредах. Подробнее
Если вам полезен архив М.Двача, пожертвуйте на оплату сервера.