Вы видите копию треда, сохраненную 31 октября 2022 года.
Скачать тред: только с превью, с превью и прикрепленными файлами.
Второй вариант может долго скачиваться. Файлы будут только в живых или недавно утонувших тредах. Подробнее
Если вам полезен архив М.Двача, пожертвуйте на оплату сервера.
1. Ресурсы:
— https://dotnet.microsoft.com/learn
— https://ru.stackoverflow.com/a/416585/422180
— https://metanit.com
— https://professorweb.ru
2. С# для веб
— https://docs.microsoft.com/ru-ru/aspnet/core
3. C# для десктопа
— WPF ( https://docs.microsoft.com/ru-ru/dotnet/desktop/wpf )
— WinForms ( https://docs.microsoft.com/ru-ru/dotnet/desktop )
4. С# для игр
— Unity-тред в /gd/, а так же учебники: https://ru.stackoverflow.com/a/609901/422180
5. С# для мобильной разработки
— https://docs.microsoft.com/ru-ru/dotnet/maui
Шапка: https://pastebin.com/HT7Hi6FD
Прошлый тред: >>2399284 (OP)
Для Windows — Visual Studio ( https://visualstudio.microsoft.com/ru/downloads ). Также есть версия для macOS.
Кроссплатформенный IDE Rider ( https://www.jetbrains.com/rider ).
Если в C# хочется, но пк уж слишком хуёвый: https://docs.microsoft.com/en-us/dotnet/core/tutorials/with-visual-studio-code
7. Что нужно знать, чтобы взяли работать?
— TPL, Linq, DI, интеграционные тесты. Преимущество перед такими же вкатунами даст парочка интересных пет-проектов где вы делаете всё максимально правильно и точно следуя архитектуре.
— [Архитектура] — DDD, микросервисная архитектура. Так же необходимо ознакомиться с паттернами проектирования. Обязательны к изучению: MVVM, MVC.
— Базы данных — PostgreSQL + Mongo. Из ORM: EFCore обычно достаточно, но есть более быстрый, но менее удобный Dapper. Тратить время на ADO.NET не стоит.
— Алгоритмы — сортировка, поиск, оценка сложности алгоритмов, рекурсия, алгоритмы на строках.
— Структуры данных — связанные списки, деревья (бинарные, красно-чёрные), хеш-таблицы, графы.
— Системы контроля версий — обычно гита достаточно.
Блять, обосрался со вторым постом. Похуй, учту при перекате.
Наконец-то аниме в шапке.
Да не плачь ты
Пиздец, видимо он настолько затаил обиду, что аж месяц только и думал что бы такого написать в шарпотред в итоге сдался и написал тоже что и какой-то анончик в их треде.
Ну же вижу что ты разрыдаться готов. Не огорчайся так, ещё вкатишься в нормальный яп
Справедливости ради, ждал он не месяц, а только пять дней.
Пойти вслед за кораблём в компайлтайме? Да нехуй делать.
Даже в крестах это антипаттерн. Фичу ввели в те времена, когда всем было похуй, и теперь не будут выпиливать, потому что много говнокода сломается.
Когда завезут нормальные женерики, а не то недоразумение с темплейтами; нормально реализуют модули; и сделают хотя бы одну адекватную систему сборки, а не вот это вот ебантяйство с Make и ручной линковкой всего и вся; нормальное апи для работы со строками и сетью; реализуют нормальную работу с асинхронщиной и многопотоком - тогда и приходи.
Но ебантяи из комитета по стандартизации - лучше будут всякое ненужное говно пихать в стандарт, чем хотя бы что-то из этого сделают; а ебантяи из C++ коммунити - будут руками до последнего линковать, рассказывая, как это охуенно и что это один раз сделал и навсегда(угу, только потом попробуй собрать чужое говно сам и посмотри как это охуенно и один раз и навсегда).
Я бы и обычное наследование только по паспорту сделал.
А то понаделают цепочек, заебывает потом их распутывать при дебаге.
Так можешь или нет не пойму? Твёрдо и четко, да или нет?
Шарп не для индусов создавался, чтобы там сложные родственные связи выстраивать
В шарп не боятся добавлять новые фичи, да и даже в древнем C# 5, который на любой винде из коробки, больше фич, чем в самой новой жабе. Шарп сам по себе охуеннн, если забыть про легаси для винды.
И сразу же умер.
Короче как развиваться в плане языка я понял, а вот как поступить с общими знаниями разработчика? Меня если спросят чет связанное с процессом, но не напрямую с кодом, типа шо такое rsa и gpg, сертификаты какие-то, что-то из сисадминского типа джамп хоста или какого-то ебучего протокола, который подразумевается, что ты знаешь, я жидко хрюкну и пойду гуглить отдельные вещи. Как фиксить? Или единственный путь - слышать что-то незнакомое и гуглить? Хотелось бы все же заранее в более общем виде усвоить тему и не обсираться, только не в абстрактном университетском стиле, иначе ниче не запомню.
>Или единственный путь - слышать что-то незнакомое и гуглить?
Да, всё так. Но есть еще один способ: начни вкатываться в незнакомые тебе темы, например подрочи неделю c++/c/ассемблер, ты толком-то нихуя понимать в нем не будешь, но апнешься в понимании железа и как работает память, к примеру. Или попробуй развернуть свой сервак, купи домен хуё-моё и на дебиан каком-нибудь по гайду из интернета начинай развертывать. Там прикрутишь ci и какой-нибудь контейнеризатор, хуё-моё и через месяц таких вот потуг уже парочку команд в терминале будешь знать, будешь знать как там что настроить примерно. Никто от тебя как от разработчика не будет требовать глубокие знания до момента пока ты не станешь сеньёром/лидом, но там уже всё само собой будет, твоя задача просто быть в курсе и в случае чего метнуться в гугл и не тупить полчаса над тем как бы сформировать запрос на поиск какой-то проблемы.
Разные вопросы относятся к разным областям IT и тут главное поиграться с этой областью недельку-две
>В шарп не боятся добавлять новые фичи
Проблема в том, что из него старые фичи боятся удалять. И еще в том, что работы на нем нет. И в том, что асинхронность имплицитно по имплицитному пулу потоков размазывается. И в том, что его майкрософт пилит, и СПЕЦИАЛЬНО делает исользование селф-хост решений невыносимым. Типа, пили бойлерплейт монолит в 21-м веке, или страдай. Что, сука, не хочешь монолит, а хочешь микросервисы и горизонтальное масштабирование? На, сука, держи микросервисы размером в джва гигабайта одного лишь шаблона. И еще чтобы развернуть - пиши 20 килобайт конфигураций. И 10 классов бойлерплейтов, чтобы оно нормально коммуницировало. И все граничные случаи не забудь, мы это во фреймворк не добавляли. А ты что, сука, думал в попенсорс попал? В одну строчку все разворачивать собрался? Ты что, не мужик, ты что, ноджс-бомж? Наш попенсорс для состоятельных джентельменов, деньги мне заплатил за ажур быстро нахуй, там можно все в одну строчку, как вы, сраные хиппи, любите, только денег заплати. И хули вы рожу скорчили? Нате, подавитесь своим хотрелоадом, уебки немытые, фанаты столмана недоделанные.
>Проблема в том, что из него старые фичи боятся удалять
А что? где то удаляют? Вон в питоне решили все переделать и уже 14 год пошел как "переходят с 2 на 3"
>И в том, что асинхронность имплицитно по имплицитному пулу потоков размазывается
Тут то в чем недостаток? Почему вдруг ДЕФОЛТНАЯ реализация контекста должна быть явная?
>На, сука, держи микросервисы размером в джва гигабайта одного лишь шаблона
шта?
ну и про осталььное ШТА?
Работа на шарпах даже в моей мухосрани есть, а насчёт микро сервисов вообще не выкупил, сейчас студия за тебя и докер файл сделает и оркестрацию только кнопочки потыкай
да да. после 14 лет то.
1 многие либы поддерживают обе версии. в итоге "(цензура) тебе, а не type hints". "Пиши код в IDE как в блокноте". Романтика
2 "все есть" это слишком абстрактное понятие. Для тебя может все есть, а для другого чего то нет.
3 поддержка 2х версий то еще занятие. И почему то по прошествии стольких лет не наблюдается чтобы все выбросили поддержку. А из этого пункт 1
А вообще примерно что то такое и сделали когда нет кор делали. Кучу всего зарубили и создали кучу проблем при переходе. Уже сколько лет ему и почему еще куча народу сидит на 4.8 если ерунда переходить
Всё шарпогалеры в моей мухосрани на нет коре 6 сидят, хотя продуктам их по десятку лет
а я разве спорю
просто вырезая старые фичи несомненно получишь ситуацию где работают на старье ибо тупо перейти не могут / дорого стоит / долго.
И потому желать бринкинг ченжи что не приносят нового, а тупо удаляют старое,...ну вы поняли.
Ооот спасибо!
Жерстко конечно, но спасибо.
Type это вся возможная информация о каком-то типе данных: структура, класс, рекорд, делегат, событие итд, а объект - это экземпляр конкретного класса, структуры или рекорда.
нормальное направление? Слышал, что юнити подыхает
>Слышал, что юнити подыхает
Пиздаболы ебаные. Сейчас наоборот дефицит в геймдеве лютый т.к никто не хочет им заниматься
Как же, дефицит, заходишь на условный хедхантер а больше нет ничего и видишь там всего 100 вакансий, и везде надо быть сеньором.
Заниматься хочет много кто, дохуя народу начинает изучать программирование именно с мечтой писать игры, но как увидят, что в вебе тысячи джунских вакансий, а в геймдеве нихуя, желание пропадает моментально.
Юнити не подыхает. Подыхает сам геймдев.
>а в геймдеве нихуя
Просто программисты в геймдеве не особо и нужны сейчас. Сейчас гораздо больше ценятся геймдизайнеры, сценаристы, художники.
>и везде надо быть сеньором.
У меня год назад не было опыта, позвонили из Кефир + написали на почту с просьбой пройти собес, лол. У меня даже опыта в геймдеве не было вообще (в резюме только десктоп был)
Чтобы те, кто его поподробнее не изучал, не могли читать твой говнокод?
source.dot.net - исходники
sharplab.io - декомпилятор в IL, ASM и так же то, что делает компилятор С# под капотом
гугли еще что такое IEnumerable и IEnumerator.
Мне в общем
Выручайте. как сделать форматирование строки прально?
Стоит visual studio 2022 с Resharper. В Visual studio 2019 такой проблемы не было, я там пересмотрел все настройки по шарпу, но чет вообще не нашел.
Очистка профиля стоит при сохранение файла.
В предыдущем треде, хотел реализовать хранение хэш-таблицы (key-value) так, чтобы она могла вместить BigData.
Запилил вот эту еботу: https://github.com/username1565/KeyValue/tree/SimpleTXTStorage
но чёт она серанула с биг-датой, потому что string.Length там гигабайт где-то, а файлы читаются в строчки.
Анон предлагал всякое, юзать провайдеры для других баз, вроде mongo, portgresql, хуй знает что делать.
Но один анон написал это:
>даже в sqlite даже можно загрузить 281 ТБ (а еще можно сделать attach таких же 125 баз)
Короче, блядь, расчехлил свою PISDA.cs и заебенил это https://github.com/username1565/KeyValue/tree/SQLite3Storage
Можете потестить.
Хуй знает сколько эксабайт оно сможет вместить, но вроде робит.
>хотел реализовать хранение хэш-таблицы (key-value)
Ты че ебанутый? Хранить несколько гигов говна в памяти? Юзай бля Redis и не еби мозги
- public void Authenticate(Action<SignInStatus> callback)
- public enum SignInStatus { Failure, Success, Pending, AccountBanned }
Вопрос насчёт Pending. Этот статус возвращается в случае, если ты обратился к методу Authenticate, а он ещё не завершил прошлый запрос.
Правильно ли называть такой статус Pending? Или это скорее AlreadyInProgress?
Нет блять, капрон
многочисленные response.Content.ReadAs*, в том числе и расширения, например
response.Content.ReadAsMultipartAsync()
или расширения более высокого уровня вида
client.GetFromJsonAsync(...
очистка чем? чем чистишь то. у решарпера свой механизм, у студии свой.
>Как вы относитесь к #region в коде?
положительно.
>Используете?
когда тяжелые классы с кучей методов.
Спасибо
Если это какой-нибудь запрос к БД или какой бойлерплейт, то да
https://hh.ru/vacancy/68273729
>Вакансия опубликована 3 августа 2022 в Новосибирске
>Откликнулся уже 1081 человек
Вкатуны, ебало ваше можно?
Негативно Обычно если тебе хочется по какой-то причине завести region в теле класса, то скорее всего твой класс просится, чтобы его нужно разбили на несколько.
Плюс у меня первый тимлид очень сильно загонялся по тому, что все члены класса должны быть разбиты по регионам по их типу и модификаторы доступа (public constructors, public properties, protected properties, public methods и т.д.) На ревью МР-ов всегда доебывался. Читаемости это файлам не добавляло, зато бесило знатно. Благо я быстро допер , что можно поставить и настроить CodeMaid и прожимать его автоформатирование перед комитетом.
> все члены класса должны быть разбиты по регионам по их типу и модификаторы доступа
Ну это уже совсем шиза. Хотя это можно встретить даже в коде .NET Runtime, типа пикрелейтед.
Общался с ними года два назад, когда был переиюнем-недомидлом и искал работу. Предложили тестовое на 16-24 часа ещё до собеседования, из-за чего вежливо были посланы куда подальше.
Знаешь точно сколько данных тебе чего нужно - массив. Не знаешь - List
Все просто.
List - по факту в шарпе - обертка над массивом, которая буквально все что делает - хранит положение "курсора", при вставке происходит проверка вида:
if(Length + 1 > Capacity)
{
var temp = new T[Capacity * 2];
Array.Copy(_array, temp);
_array = temp;
}
... остальная логика вставки
Чтобы ты этой хуйней не занимался - сделали List
Тимлида случайно не Денис звали? У меня был такой, требовал выделять region-ами каждую группу вроде properties, events, fields, methods, а в каждой группе еще и отдельные регионы по модификаторам доступа
Все это если в классе есть хотя бы два экземпляра чего угодно
Его звали Роберт Полсон.
1 раз по рофлу сделал
Нахуя вообще нужны массивы когда есть списки? Единственное где я их встречал, это собес в Яндекс да, там был C#
Мимо 3 годика
А как же массивы byte?
Для того чтобы реализовывать свои списки и другие структуры данных, вестимо.
Плюс для случаев, когда приходится применять ArrayPool, чтобы не шатать GC.
Но и это не конец проблемы. В зависимости от ситуации, иконка может представляться в различных размерах, например диспетчере задач иконка маленькая, в панели задач она крупнее, в проводнике вообще может быть какой угодно. Можно как-то указать набор иконок под различные ситуации?
У меня иконка в режиме огромных значков не хочет масштабироваться (пикрил самая правая, ток не надо тут политоты, это не про то вообще), даже если попытаться впихнуть иконку размером 512х512 (кстати на этом этапе у меня поломалось обновление иконки). Я уж не говорю какой кромешный пиздец получается, если загрузить даже 256х256 и ужать до размеров 16х16.
При этом я наблюдаю как это сделано у других приложений и там иконки не то что успешно масштабируются, но и еще могут перейти в режим превью (например видеофайлы и изображения)
В сети хуета какая-то с предложением загрузить через свойства проекта.
Я думал в куче создается еще один итем, а в предыдущем вставляют указатель на него. А у тебя не список а динамический массив какой-то.
Положительно отношусь. Для меня это как логическе группы и порой лучше, чем создавать Partial Class.
К тому же автоколлапс удобно все складывает.
Правда я веще люблю дописывать прочерки, типа
#region "-- My method --------------------------"
#endregion "-- My method --------------------------"
>то скорее всего твой класс просится, чтобы его нужно разбили на несколько.
У меня постоянно возникает дилемма с неймингом partail классов:
1) ты называешь файл так же, как класс и тогда у тебя куча:
MyClass, MyClass, MyClass, MyClass в которых хуй проссыш что где.
2) ты называешь в соответствии с логикой блока, но тогда получаешь вермишель из названия MyClassEhalGrekaCherezReku, при этом:
2.1) Название вкладки отжирает полэкрана и вообще нечитабельно
2.2) Нарушается синхронизация между фактическим названием класса и названием файла.
ДЖАВИСТЫ ПРИДУМЫВАЮТ SPRING
@
ПЕТУШАРПЕРЫ КОПИРУЮТ И ДЕЛАЮТ SPRING NET
@
ДЖАВИСТЫ ПРИДУМЫВАЮТ HIBERNATE
@
ПЕТУШАРПЕРЫ ДЕЛАЮТ РЕВОЛЮЦИЮ В ООП ПОД НАЗВАНИЕМ NHIBERNATE
@
В ЖАБУ ДОБАВЛЯЮТ ЛУМ
@
ЧЕЛЯДЬ, НОВШЕСТВО! ЗЕЛЁНЫЕ ТРЕДЫ! ЖРИТЕ!
@
ДЖАВИСТЫ НАЧИНАЮТ ПЕРЕКАТЫВАТЬ ТРЕД КАЖДЫЕ 500 ПОСТОВ
@
ПЕТУШАРПЕРЫ НАЧИНАЮТ ПЕРЕКАТЫВАТЬ ТРЕД КАЖДЫЕ 500 ПОСТОВ
@
В ДЖАВА ТРЕДЕ В ШАПКЕ СНОВА АНИМЕ
@
В ПЕТУШАРП ТРЕДЕ В ШАПКЕ СНОВА АНИМЕ
>SPRING NET
>NHIBERNATE
Эту хуйню никто не использовал и никогда не станут юзать, залетный дебил
Ну так стандартный List<T> и есть по сути динамический массив. Хочешь трушный связный список - юзай LinkedList<T>
Ну когда есть методы, которые можно логически обособить, но которые не нужны за пределами использования одного конкретного класса. Когда есть общие поля.
Просто класс? Ну допустим я хочу вынести все подписки на UI-элементы в отдельный блок. Это превратится в дополнительный гемор. И мне все равно нужно как-то указать, что этот класс принадлежит к конкретному классу окна и он не применим к другим. И в итоге получим Partial Class через жопу и для которого еще надо создавать экземпляр, и как-то передать 20 полей. Нахуй надо.
Что еще? Использовать наследование по моему мнению нужно, когда вариаций наследников больше одного. А когда у тебя ровно один наследник, то это ничто иное как partial class.
Разобрался. Оказывается в .ico можно хранить стак изображений разной величины, а шиндовс потом автоматом оттуда берет нужный объект. И все это можно тонко настроить в стандартном редакторе студии, если нужно, чтобы под кажыдй размер была своя уникальная картинка, а не просто скейлинг.
А "не обновлялось" у меня раньше потому, что конвертер за каким-то хуем сделал в формате 32бита, несмотря на исходник, а студия переваривает цветовую градацию максимум в 24 бита. даже в редакторе студии 32 бита недоступны, изображение просто лочится.
Есть три типа клинических уебанов, которые перекладывают свои проблемы с ОКР на плечи окружающих:
графические дизайнеры, гопники и программисты.
Перед нами совершенно конченый подвид уебана, который помимо общепринятых в их ссаных кругах триггеров, выдумал свой собственный: видите ли методы с большой буквы писать нельзя, охуеть вообще.
>мне страшно представить ваши ёбла, уроды
Мое ебало совершенно нейтральное, ведь я пишу без шифта, а студия сама исправляет регистр, ведь в моем любимом бейсике нет чувствительности к регистру и большая буква служит только лишь для эстетической красоты.
И то, что ты тут горишь — исключительно последствия особенностей твоего языка и класть болт на читабельность ради удобства, это высшая мера уебанства.
Не рассказывайте додстеру про линтеры и форматтеры
Вышка это как цвет кожи.
Вот если ты белый, то вопросов к тебе минимум. Если же имеешь оттенок, то сразу будут вопросы, а не пушишь ли ты наркоту, не роббишь ли дома и т.д. И похуй, что будучи белым, ты можешь оказаться тем еще маньячилой насилующим котят, главное, что при первой встрече к тебе меньше вопросов будет.
Точно так же и с вышкой. Есть диплом - проходи, дальше разберемся. Нет, ну тогда готовь анус - сейчас будем проверять тебя за всю хуйню.
>>26312
>Без вышки есть смысл скуфу вкатываться в С#
Да есть, но ты должен быть достаточно энергичным, чтобы успевать за тенденциями. В шарпе сейчас много. чего меняется и надо быть на волне.
> В шарпе сейчас много. чего меняется и надо быть на волне.
Зочем майки ето делают? Вот в goвне наоборот топят за минимум фич, и он сейчас очень в вебе популярен стал
Майки еще в нулевые создали шарп для того чтобы он был заточен под асп.нет - джава дебилы делают спринг спустя 10 лет который позволяет делать то же, что и шарп.
Майки придумали linq еще в нулевые - джава через 15 лет спиздила и назвала хибернейт.
Да да. Так и было
Ну всякие мелочи что хибернейт вышел наполгода раньше чем появился шарп, но то наговаривают
Ну так то LINQ разный бывает
ОН МОЯ КОНКУРЕНТ. ORACLE JAVA. БОЛЬ В МОЯ ДЫРКА ЗАДНИЦА. Я ДЕЛАЙ LINQ, ОН ДЕЛАЙ STREAM. Я ДЕЛАЙ ДЖЕНЕРИК, ОН ДЕЛАЙ ДЖЕНЕРИК. Я ДЕЛАЙ ASYNC/AWAIT. ОН НЕ СМОГ. РАДОСТНО!
>Я ДЕЛАЙ LINQ, ОН ДЕЛАЙ STREAM.
Я делай LINQ Expression, он делай ?????
>Я ДЕЛАЙ ДЖЕНЕРИК, ОН ДЕЛАЙ ДЖЕНЕРИК
Говорят, дженерик то НЕ НАСТОЯЩИЙ
>Я ДЕЛАЙ ASYNC/AWAIT. ОН НЕ СМОГ. РАДОСТНО
Кстати да. Возможность писать асинхронный код как синхронный это не мелочь по карманам тырить. Киллер фича
>Зочем майки ето делают?
Так исторически сложилось. Чтобы обогнать жабу по популярности им пришлось впиливать новые фичи тоннами. И что самое смешное, обогнать жабу так и не смогли, увы, потому что поздно пришли в линукс.
Но зато у шарпа есть какой-то процент рынка, что уже неплохо.
>>26634
>создали шарп для того чтобы он был заточен под асп.нет
>придумали linq еще в нулевые - джава через 15 лет спиздила и назвала хибернейт
Толсто.
Понял, нельзя
512x512, 0:02
Как же джавистам "похуй". Они даже в каждом ОП-посте обязательно указывают C# в уничижительном ключе.
Двачую, уже не выдерживают у них нервы, не знают что бы такого написать. А ведь всё началось с того, что я один раз написал в их треде, сейчас они уже в трёх-четырёх перекаченных тредах пытаются что-то там высрать про шарп
>SPRING
Ненужное говно. Срсли. ASP - пижзе.
> HIBERNATE
Туда же. EF - пизже
> ЛУМ
В чем профиты, кроме того что внешне это выглядит как поток, а не как Task - я так и не понял. Может быть тупой.
А в остальном. Я не понимаю, хули жавистам так печет. Типа заебало сидеть на легаси, а для новых проектов таки берут либо котлин либо шарп? Ну, звиняйте. Никто не хочет ваше добро на новые жаватехнологии переписывать, а старая жава - пиздец ужасна. Еще и наворотили зоопарк систем сборок такой, что старый проект хуй соберешь без мастера некроманта. Так что да.
Я хочу чтобы ООП - был вариантом, а не намертво приколоченной хуйней.
Ну серьезно, я надеялся, что с введением Top level statements - оно пойдет в том направлении. Но что-то я не вижу больше сподвижек.
А ведь как удобно было бы какой-нибудь простенький граббер пилить как на сях. Просто пару функций заебенил и доволен. Начала программа разростаться - ну, пора об ООП задуматься. Не. Это не наш путь. Давайте ООП будет приколочено намертво.
Как же я бы хотел, чтобы деды на работе так не хейтили F#. Так удобно многие штуки на нем делать. Но не. Дедам не нравится ЕЩЕ ОДИН ЯЗЫК!!! И я как-бы понимаю. Но фишек там прикольных слишком много.
>Когда в шарп завезут мультипарадигмальность?
Никогда, надеюсь. Для этого есть F#. Я вообще думаю через лет 5 перекатываться в F# и функциональщину, а то меня эта ебатория с ООП, паттернами, правильными правилами просто настоебенила. Скукота...
А ты и сейчас десктоп? Я молодой джунишка-вкатунишка, сейчас тоже сижу на десктопе. Как грамотно подойти к самообразованию, чтобы потом в веб перекат сделать? P.S. Изначально вкатывался на жабу со спрингом, но в последний момент подвернулся варик с норм работкой на шарпе.
>А ты и сейчас десктоп?
Я начал с десктопа, но потом насильно перекатился в веб поскольку в моем провинциальном городке тяжко с работой. Планирую в ближайшие 2-3 года съебаться в ДС2 и уже заниматься формошлепстов на WPF.
>Я молодой джунишка-вкатунишка
Да я тоже, всего лишь год опыта коммерческого.
>Как грамотно подойти к самообразованию, чтобы потом в веб перекат сделать?
Нужны скорее более общие знания, чем непосредственно глубокие в ASP.NET Core, тебя скорее всего в вебе заставят клепать веб-апишки первое время, прям как меня. Если обобщить, то знания архитектуры приложений DDD/CHO и DI даст тебе больше, чем углубленные знания в самом ASP.NET Core. Это конечно не означает, что надо совсем забить хуй на платформу и идти дрочить сетевые протоколы
Че по зэпке? Мне про сотыгу через год говорят, но 2 друга жабиста по 160к с годом попыта в вебе имеют, хочется примерно также присосаться
А я вот надеюсь, что таки завезут.
И я вот за время работы с TS и JS парралельно - полюбил кучу фишек оттуда. Мне больше нравится как в ES6 сделаны импорты чем как оно в шарпе. Мне кажется удобным как сделаны экспорты. Мне хотелось бы чтобы я так же мог спокойно определить пару служебных функций не создавая статический класс с ними. Вообще - JS, если бы не был так сильно привязан к вебу - был бы топовым языком как по мне. Очень удобный. Очень гибкий. И штуки которые внедряются - действительно хорошие. При этом он не ушел в ту шизофрению, куда пошли плюсы, и не остается на месте как Си.
50к выход после налогов, ну это еще норм т.к я примерно 4 месяца на текущей работе, до этого пинал хуи на заводе программистом где пытался самобучаться, так что можно сказать, что коммерческого опыта - год, а нормального - 4 месяца.
Считаю не стоит переносить, как на 3.
>ты должен быть достаточно энергичным
Я начал с фронтенда про быстроту наслышан, заметил что на шарпе много фуллстек вакансий с фронтом, в основном на ангуляре, поэтому заинтересовался, на джаве к примеру таких вакансий не замечал особо.
Получается можно в соло что то пилить на шарпе ? Или просто экономят на фронтендерах.
Если (открывающая скобка на новой строке)
{
тогда закрывающая тоже на новой;
неважно, какая это скобка(
фигурная,
круглая,
квадратная,
угловая);
}
>Или просто экономят на фронтендерах.
А зачвем много фронтов? Быстро делать дизайн по фигме любой даун сможет
И всё же на это надо тратить время. ещё и переключаться между двумя проектами, в одном бэк, в другом фронт. Когда можно сосредоточиться на бэке, как белый человек, а всю чёрную работу отдать вебмакакам.
>Когда можно сосредоточиться на бэке, как белый человек, а всю чёрную работу отдать вебмакакам.
Ну тащемта всё так и есть. Даже у меня на аутсорс галере есть блядина и еще пара долбоёбов которые верстают дрисню, а я и еще пара бравых ебашут бэк.
А зачем дс2. Удаленно же можно найти. Ну через годик.
>любой даун сможет
Анон я же не просто так написал про ангуляр и нест, у вас какие то понятия о фронте из 2000-х где с сервака шаблон отдаешь с формочкой. Посмотри проект на несте тс, там по типу спринга архитектура, это же не бутстрап.
Да похуй мне чем там во фронте. Я перекладываю жсоны и мне норм.
Если тебе надо всё делать в одном файле - то .NET 6, если тебе надо юзать сабжи в разных файлах - то ни в какой. Алсо если ты в VS то можешь нажать комбинацию клавишу "Ctrl + .", откроется окошко и можно будет выбрать подключение юзинга, если требуется.
Я просто не понял какого хуя я залетел щас в вижлу и могу спокойно юзать Linked list и Console без подключения пространств имён
Аж трисёт при написании using.
Ну это новый синтаксис класса Program, Ты можешь опять сделать структуру Program { Main() {}}, такой синтаксис сейчас вообще во всех проектах на .NET 6+
Только почему из вижлы нельзя посмотреть какие глобальные юзинги используется в проекте?
MemoryMappedFile sharedMemory = MemoryMappedFile.CreateOrOpen("MemoryFile", size * 2 + 4);
то все работает норм, но если я это оберну в using, то при попытке чтения пишет, что не удалось найти указанный файл.
Thread thread = new Thread(delatHuetu);,
когда мы руками раскидываем методы по разным тредам.
На ютубах почему-то вообще ничего по теме нету, только античные видосы 8-10-летней давности, остальная выдача вся про async/await. Может новый способ теперь какой-то более модный есть?
Делаю консольный блекджек на C#, и у меня есть класс-рисовальщик карт.
В зависимости от типа карты он отрисовывает её.. Так вот, как избавиться от кучи if-else(я слышал что это плохой код)
у меня что-то типа
if (card== 'A')
...
else if (card=="K")
...
else if(card=="10")
....
Уйди блять.
>В зависимости от типа карты он отрисовывает её
Плохой подход, у тебя 30 карт (или скока там хз) и ты под каждую рисуешь отдельную хуйню, так нельзя.
>Так вот, как избавиться от кучи if-else(я слышал что это плохой код)
Всё так, это пиздец а не код. Во-первых не используй строковые константы для сравнения чего-либо, для этого есть enum, во-вторых используй switch-case если у тебя действительно дохуя условий. В-третьих если у тебя выходит так, что код строится на дохуя условиях - он спроектирован неправильно бывают исключения, например MSIL инструкции, они обрабатываются по разному и для них switch-case уместен.
Сделай массив карт и отрисуй их в самом начале, а потом уже используй только те, которые на столе. Я не шарю в карточных играх, но если у тебя есть определенные "типы" карт, то ты можешь сделать класс который будет содержать нужный тебе тип карты, в таком случае количество условий уменьшится.
Никто треды не юзает потому что они нахуй не нужны. С ними слишком много ебатории, всякие дедлоки хуёки и прочее, легче юзать await Huita() и всё норм.
Оракл не осилил в синтаксический сахар?
Асинхронность и сейчас в жабе есть, правда на уровне CompletableFuture, но тем не менее.
А так, зачем нужны async и await, когда есть виртуальные треды и любой блокирующийся код можно превращать в неблокирующийся?
>А так, зачем нужны async и await, когда есть виртуальные треды и любой блокирующийся код можно превращать в неблокирующийся?
РЯЯЯЯЯЯЯЯЯЯЯЯЯЯЯ!!!!! НУ ТЫ НАПИШИ АСИНК, НАПИШИ))) НЕ МОЖЕШЬ)))))) ААХАХАХАХАХАХАХАХААХАХАХА))) ТУПАЯ РУСНДЖАВА))))))))))))) ЧТО ЗНАЧИТ ЗАЧЕМ???? ЛОЛ ВАТНИК)))) А Я МОГУ ПИСАТЬ ГОВНО))) ЭЭЭ БЛЯ ОТКУДА ДЕДЛОКИ(((((((((((((((((((((((((((((((((
АХАХХААХААХ ТУПАЯ ДЖАВА))) НУ УТЕБЯ НЕТУ ГОВНА! ТОЛЬКО В ПЕТУШАРПЕ ЕСТЬ КАКАШЕЧКИ! ПЕТУШАРП - ТОП ПО КАКАШЕЧКАМ! КОПРОБРО, ПОДТВЕРДИ!
>причем тут async/await и дедлоки
Дедлоки вряд ли просто так возникнут, а вот data race уже более вероятна, и тут уже нужно синхронизироваться грамотно, иначе хуев за шиворот легко получить.
Вообще в чем прикол async/await? В том, что мы просто пишем await Govno() и говно неблокирующе где-то запускается под капотом на особом тредпуле?
Один раз было. Когда из-за стирания типов пришлось методы с разными дженериками по разному называть.
Какую документацию? Уже в какой раз вижу этот аргумент, но никак не пойму. У нас огромная книга msdn, что не так? На каждый чих-пук есть пример, который с недавнего времени можно еще и на самом мсдн запустить
Как реализовать отправку сообщения от треда X таким образом, чтобы все N тредов не в бесконечном цикле крутились и жрали ресурсы ЦПУ, а просто были приостановлены планировщиком до тех пор, пока к ним сообщение не прилетит.
Так стоит учесть, что тред X может отправлять любые сообщения, но вывод стоп и прекращение работы нужно делать только в том случае, когда в тред прилетит конкретное сообщение, на которое были изначально подписаны N тредов.
>Петушарп даже в обратную совместимость не смог?
Смог вроде, при переносе с .net 5 на .net 6 нихуя не сломалось кроме 1 строки которая пофиксилась примерно за 15 секунд.
А ты можешь просто писать код и просто по итогам написания кода тыкнуть на кнопку генерации доков в идее и просто открыть сайт уровня https://docs.oracle.com/javase/8/docs/api/java/lang/String.html ?
>>28043
АХАХАХАХАХАХХАХАХАХАХАХАХАХАХАХАХАХАХАХАХААХАХАХАХА БЛЯТЬ ПЕТУШАРПЕР ГОРДИТСЯ ТЕМ, ЧТО У НЕГО ПРИ ПЕРЕЕЗДЕ НА НОВУЮ ВЕРСИЮ ВСЕГО ОДНА СТРОКА СЛОМАЛАСЬ???????????????????????????????????????????????????????
почему джависты всегда срут на дотнетчиков а дотнетчики просто пишут код?
>Смог вроде, при переносе с .net 5 на .net 6 нихуя не сломалось кроме 1 строки которая пофиксилась примерно за 15 секунд.
А теперь представь, что ты делаешь что-то больше калькулятора и у тебя есть куча скомпилированных .jar (или что у вас там, .cs?) файлов, каждый из которых от разных разрабов, и доступа к исходникам для фикса этой одной строки у тебя нет к половине этих .jar. Что будет делать? Будешь ждать, пока все 300 разработчиков выкатят перекомпил? Или скажешь "нинужна" и обойдёшься без половины жарок? Или останешься на старой версии дотнета, и будешь терять новые багфиксы и фиксы уязвимостей?
>2. Невозможность использовать async, если ты пишешь либу для стороннего приложения.
Что? В петушарпе есть проблемы при использовании внешних библиотек? Они работают не как твой собственный код?
>Если у тебя не хватает мощны, то ты хоть усрись с асихронностью, но у тебя будут лаги, потому что это все еще один поток.
Разве await не стартует задачу где-то в отдельном потоке на внутреннем тредпуле?
Для этого и существуют интерфейсы.
У тебя все карты реализуют один интерфейс. И тогда тебе не надо кучу ифов делать, а ты обращаешься напрямую к карте.
А если наоборот нужно узнать в какой карте произошло что либо, то делаются события.
Смотря как у тебя реализованы эти потоки.
Можно сделать TaskCompletionSource, дать N потокам его Task, чтобы они его await, потоку X дать сам сурс. Когда надо, в сурсе юзаешь SetResult, и евейт закончится. Но это одноразовая тема.
Можно поискать разные классы синхронизации. Я знаю Monitor и SemaphoreSlim, но они вроде не подходят. Семафор сработает, если ты знаешь, сколько у тебя поток N. Но их дохуя разных, если зайдёшь на msdn в описание одного из этих, рядом будут ещё другие. Или ещё как поищи, хз.
У меня был (есть) случай, когда нет контроля над сторонним приложением. Есть встроенный скриптовый язык, который может вызвать функцию нейм из условной библиотеки. Я не могу там установить await, поэтому приходилось работать через потоки, например для вызова окна, чтобы оно не фризило скрипт.
У меня есть класс Gambler(От него наследуются крупье и игрок) И у этого гэмблера есть свойство Hand которое является массивом карт.
И у меня есть класс-отрисовщик, который отрисовывает кол-во фишек, например, или вот руку(карты) чела. Не думаю, что мне нужен интерфейс ICard, у меня класс Card. Или я просто тебя не понял)
>чтобы они его await
Как эта штука под капотом работает? Там какой-то аналог wait/notify будет или бесконечные циклы aka spinlock?
Так же не понял этого дроча со значимыми и ссылочными типами: допустим, есть у меня две переменные инт со значением 10. Получается, у меня в памяти существуют два независимых числа 10?
Если тип ссылочный, например, два стринга со значением "Hello". Это значит, что "Hello" существует только в одном экземпляре? А если я этот стринг решу запихнуть в метод аргументом и изменить его там? Я получу на выходе совершенно другую переменную? Или что?
Barrier?
Ну выглядит не очень что в классе Suits есть информация о том как его отрисовывать
>Во-первых, нахуя это разделение нужно и на что это влияет при работе
Ну смари, у тебя - недержание кала, твои обосранные труханы маман кидает в специальный стек где лежат только лишь твои обосранные трусы, потому что стирать всё, что лежит в куче, например носки сестры, штаны бати, с твоим говном - не рационально, ибо всё будет вонять. Однако, это не отменяет того факта, что обосранные трусы бати можно закинуть в твой стек.
>допустим, есть у меня две переменные инт со значением 10. Получается, у меня в памяти существуют два независимых числа 10
Да
>Если тип ссылочный, например, два стринга со значением "Hello". Это значит, что "Hello" существует только в одном экземпляре
Не обязательно.
string str1 = "Hello";
string str2 = "Hello";
object.ReferenceEquals(str1, str2) //false
Однако,
string str1 = "Hello";
string str2 = str1;
object.ReferenceEquals(str1, str2) //true
>А если я этот стринг решу запихнуть в метод аргументом и изменить его там
Смотря как передашь. С этим можешь сам потыкаться, там много моментов которые описывать лень
Тебе голову ломает ситуация со стрингами, а все потому что они, как это сейчас говорят, третьего гендера.
Стриг это по сути класс (ссылочный), который ведет себя как структура (значимый).
А все для твоего удобства, чтобы к примеру когда ты сравнивал две текстовых переменных, то сравнивались их значения, а не ссылки.
Иначе вот эти вот шутки никогда бы не были равны
string MyValue1 = "Hello"
string MyValue2 = "Hello"
Конечно же, все остальные классы сравниваются по ссылке, а не по своему содеражанию.
>А если я этот стринг решу запихнуть в метод аргументом и изменить его там?
В качестве аргумента передается ссылка (ты уже понял почему)
Стринг это полный набор исключений из всего обыденного.
Любая манипуляция со стрингами рождает новый экземпляр стринга.
Почему, да потому что стринг это массив определенной длины. А у тебя новые данные с бОльшим или меньшим размером.
Че делать тогда?
Вот есть у тебя стринг (A) и ты решил в него вписать конкатенацию двух слов "Hello"(B) + "World"(C), так вот будет создано две новых переменных, которые (B) и (C), плюс еще одна (D) как результат соединения первых двух.
Далее ссылка на твой оригинальный стринг (A) будет заменена на ссылку третьей переменной (D).
А что же будет с (A), (B) и (C)? Ну они будут тупо валяться, пока сборщик мусора их не удалит.
Поэтому не стоит в каких нибудь циклах с большими объемами данных вот так просто манипулировать стрингами. Застрет оперативу знатно.
НО тут у тебя возникнет вопросик. Если манипуляции рождают новый экземпляр стринга, то изменив стринг, переданный как аргумент в функции, снаружи этой функции не изменится. Ну вообще-то изменится, как будто менялось само содержание стринга.
Но это опять вот такой вот стринг. Если ты попытаешься переданный из нативной библиотеки стринг изменить, то ХУЙ она увидит изменения, перейдя по тому же адресу. Это только в C# у тебя будет некая иллюзия.
Если я правильно понял, то:
string str1 = "Hello";
string str2 = "Hello";
object.ReferenceEquals(str1, str2) //false
Мы создаем две ссылки и два значения, а третья строка проверяет, одинаковые ли ссылки и выдает фолс.
string str1 = "Hello";
string str2 = str1;
object.ReferenceEquals(str1, str2) //true
Здесь мы создаем одно значение и одну ссылку и str2 присваиваем ссылку str1, и поэтому третья строка выдает тру. Правильно же?
Алсо, я не понял этого объяснения с труханами. Разве если бы стринг был значимым типом и лежал бы в стеке, он как-то влиял бы на инты?
Слушай, а как по твоему устроен Image? В нем и хранится информация.
В нем есть информация о своих габаритах, о локальной позиции, и главное там есть массив пикселей в виде Bitmap.
Ты наверно боишься, что если у тебя будет тысячи карт, то это сожрет ресурсы.
Ну так у тебя же в Suits будет ссылка на этот массив. А сам массив либо хранится отдельно в каком-то твоем месте для ресурсов, либо если у тебя реально файл с изображением, то добавляешь его как стандартный ресурс.
0000000
0001000
0010100
0111110
0100010
0000000
a = new Int
a.Number ....
По объяснению показалось, что это жабатред
>Если я правильно понял
Да, правильно
>Алсо, я не понял этого объяснения с труханами. Разве если бы стринг был значимым типом и лежал бы в стеке, он как-то влиял бы на инты?
Стринг не может лежать в стеке, в стеке лежат только value-types. Смари, в C# есть value-types и reference-types. value-types могут храниться как в стеке, так и в куче, а reference-types могут храниться ТОЛЬКО в куче. Операцией boxing мы можем value type -> reference type, операцией unboxing мы можем reference type -> value type.
Если непонятно откуда взялся боксинг/анбоксинг, то объясняю. C# код компилируется в CIL (иногда называют MSIL или просто IL). Нужен чтобы любой язык в платформе .NET запустился в другом языке. Например VBA можно запустить в C# и наоборот поскольку они оба компилируются в CIL. Так вот как раз таки в этом CIL есть две инструкции: boxing и unboxing о которых я и рассказал.
Небольшой пример когда value-types лежат в куче - это массив чисел, например int[]
Пример boxing:
int a = 10;
object boxed = a;
int unboxed = (int)boxed;
В CIL это будет выглядеть вот так:
IL_0000: ldc.i4.s 10 //a = 10
IL_0002: box [System.Runtime]System.Int32 //boxed = a
IL_0007: unbox.any [System.Runtime]System.Int32 //unboxed = (int)boxed
вот этим
a = new Int
Ты не вызываешь, а создаешь новый экземпляр.
Если ты хочешь вносить какие-то стартовые значения при создании экземпляра, например свойству Number, то ищи что такое конcтруктор класса или структуры.
В итоге у тебя будет так: a = new Int(150)
Можно одно из свойств класса установить дефолтным, например так сделано в классе List, когда ты можешь писать так:
a = new Int()
a(20) = 150
вместо того, чтобы:
a = new Int()
a.Number(20) = 150
но нельзя реализовать это: a = 150, потому что "a" это всегда ссылка на твою "обертку".
Напиши пример, это как?
Т.е. анон может использовать
a = new Int
b = a
как если бы это было
a = new Int
b = a.Number
Так что ли? Не верю.
>>28232
Забыл добавить почему это работает. Вообще операторы explicit и implicit - это просто приведение типов, но при перегрузке этих операторов неявно переопределяется assignment operator, который явно нельзя переопределить. Именно поэтому возможно сделать так:
public readonly struct MyNumber
{
private readonly int _number;
public MyNumber(int number) => _number = number;
public static implicit operator int(MyNumber number)
{
return number._number;
}
public static implicit operator MyNumber(int number)
{
return new MyNumber(number);
}
}
Ну и теперь создадим небольшую хуиту:
public MyNumber Pizdec(int a, int b) //ТУТ ВОЗВРАЩАЕМ MyNumber
{
return a + b;
}
int myNumberResult = Pizdec(5, 5); //А ТУТ Int32
>>28232
Забыл добавить почему это работает. Вообще операторы explicit и implicit - это просто приведение типов, но при перегрузке этих операторов неявно переопределяется assignment operator, который явно нельзя переопределить. Именно поэтому возможно сделать так:
public readonly struct MyNumber
{
private readonly int _number;
public MyNumber(int number) => _number = number;
public static implicit operator int(MyNumber number)
{
return number._number;
}
public static implicit operator MyNumber(int number)
{
return new MyNumber(number);
}
}
Ну и теперь создадим небольшую хуиту:
public MyNumber Pizdec(int a, int b) //ТУТ ВОЗВРАЩАЕМ MyNumber
{
return a + b;
}
int myNumberResult = Pizdec(5, 5); //А ТУТ Int32
>Так что ли? Не верю.
Ага, я когда это нашел - просто ахуел. Прикол в том, что это ведь даже на msdn написано: https://docs.microsoft.com/en-us/dotnet/csharp/language-reference/operators/assignment-operator#operator-overloadability
>user-defined type can define an implicit conversion to another type
спасибо, анончик!
У тебя _images = null, не объявил где-то.
После слов вызвано исключение, для тебя пустой неинформативный газ? Понимаю.
Так а нахуя чето придумывать если уже всё придумано? Джун должен знать о паттернах и архитектурах. Миддл должен уметь их применять. Сеньёр должен знать, когда их применять, а когда нет.
Ну вот хочу я консольную игру сделать, например. Начинаю продумывать сущности и тд. а выходит хуйня какая-то говно тупа куча классов кала, интерфейсы хуйни и ещё всё куча зависимостей
Сейм щит. Все начинается логично и структурировано, пока не превращается с помойку, которая заставляет применять все больше помойных решений.
Ну видимо шутки про бесконечное переписывание кода взялись не с потолка. Недавно смотрел видео, где менеджер жалуется, что программист вместо написания условного калькулятора начинает придумывать новую механику перетягивания окон.
Так получается что даже самые сеньеристые сеньеры рано или поздно в помойку кодовую скатываются что же это за хуйня такая
Ну видимо поэтому и придумали солид принципы. Боль неизбежна, но зато с ней можно как-то справиться.
>что программист вместо написания условного калькулятора начинает придумывать новую механику перетягивания окон.
Обосрался
Пробовал MemoryMappedFile и это говно может потерять файл в любой момент.
1. Кто-то пишет, что сборщик мусора удалил (у меня экземпляр все еще активен, вряд ли).
2. Кто-то пишет, что сбой может произойти, если чтение произошло в момент записи. Более реалистичный вариант, действительно теряется файл при высокой частоте обращения.
Ну и как второе фиксить? Я для этого и собсна их и использую, что я не знаю че там и когда второе приложение мне отправило. В ЭТОМ СУТЬ! Я пытался использовать булевый флаг как идентификатор для чтения записи, но это только снижает вероятность, а не устраняет проблему.
Ну у тебя будет очень простой TCP сервер на локалхосте, который будет принимать и отправлять нужные данные.
>>28437
>>28436
Посмотрел вот это
https://www.youtube.com/watch?v=QohqDyTjclw&t=222s
Короче причины по которым точно не Сокеты:
1. Нужно запускать хост от имени администратора (пользователь нахуй пошлет)
2. Импорт библиотек. Тоже нет. Дело в том, что мой проект — это плагин в виде библиотеки для стороннего приложения, а ублюдочный .NET ищет импортируемые либы по месту запуска exe, а не по месту запуска dll. Я не имею права скидывать что либо за пределы своего загона для плагинов. Решения этого вопроса я пока не нашел.
Именно из-за множества ограничений я принял решение, чтобы моя библиотека запускала еще одно приложение (уже мое), в котором можно использовать все что угодно (пикрил схема).
смысла нет использовать такой неудобный синтаксис. Есть унифицированный подход TPL и то, что бОльшей части задач хватает пула. А если даже и нужен выделенный поток, то даже там есть LongRunning
Так что такой старый подход нужен если хочется к ядрам поприбивать или Abort(но его вырезали, так что причин поубавилось)
хуй знает, вопрос не изучал, но когда делал свою модульную хуйню, мой длл подсасывал херню возле себя из своей папки.
Может exe, который запускал твой длл, находился в той же папке? В большинстве случаев так и происходит.
Или ты тоже плагины делал?
> игру сделать
Для игр идеально подходит Entity Component System (ECS). Игровой движок Unity3D как раз сейчас переходит на эту систему. Тот же Overwatch написан на ECS:
https://www.youtube.com/watch?v=zrIY0eIyqmI
>а ублюдочный .NET ищет импортируемые либы по месту запуска exe, а не по месту запуска dl
Для старого дотнета там вроде событие было нужно определить. Для нового AssemblyLoadContext
Я же написал, что из своей папки. Да, свои плагины делал.
не ну динамическая загрузка это не тот функционал какой есть через imports, когда тебе доступны все методы и посдказки и intellesence. Это больше похоже на импорт нативных библиотек.
Это поможет для критичных ситуаций, но это не то тэффект, когда ты просто в конфиге указываешь папку для подхвата библиотек.
не знаю о чем ты.
объявляешь контракты (интерфейсы) и пишешь себе со всеми подсказками и проектами.
А в рантайме будет загружена нужная реализация.
Именно так плагины и пишут (и по другому никак, ведь тут вам не питон чтобы можно было компилить код не зная типов, а динамик не для этих случаев)
Можно подробнее? Вот я загружаю либу
Assembly asm = Assembly.LoadFrom("Plugins/MyApp.dll");
И дальше я должен получить конкретный метод
MethodInfo? square = t.GetMethod("Square", BindingFlags.NonPublic | BindingFlags.Static);
Вот оно так и работает. Какие интерфейсы?
Ебош казуально dependency injection и катайся еблом по клаве
Ну эта жи ниудобна. Проще dll юзать как мост, а всю логику выполнять в рядом лежащем exe (так, кстати, многие плагины для той приложухи и сделаны).
Мне только осталось найти годный метод обмена информацией.
Та ты заибал. Просто подключи свою хуйню к проекту как dll, References -> Add reference и не еби мозгу. Если проект на C++ - используй маршаллинг.
>И дальше я должен получить конкретный метод
А какова причина ей работать именно так?
У тебя либо полная динамика (то есть ты не можешь знать в рантайме типов, а значит и IDE нечего подсказывать - он тоже не может знать), либо ты типы знаешь, а значит никаких MethodInfo просто нет - работает обычный cast и все плюшки
Не изобретай велосипед. Делаешь интерфейсы с которыми и работаешь в IDE а в рантайме связываешь. Так все делают даже если плагины не пишут.
с плагинами же различие только в том что рефлексией инстанцируешь класс плагина после загрузки длл, а дальше работаешь как обычно
Лютый примитив примерно так
1 делаю интерфейс IPlugin
2 Реализую его в длл
3 гружу длл
4 ищу класс реализующий IPlugin
5 инстанцирую
6 вызываю его методы.
можно наплодить сколько угодно интерфейсов вида IFeature
можно сделать IPlugin.Run(context)
Свобода же. И при этом типизация.
то есть никто вот такие MethodInfo не плодит
объявляются контракты, а дальше какой то механизм типа MEF/IoC/велосипед находит нужные реаизации и затыкает эти контракты в рантайме.
Можно все найденное в IoC пихать для унификации резолвинга, можно не пихать.
все способы верны
Вот, например, аспнеткор - там всякие OWIN
так он просто объявляет кучу фич, которые могут быть реализованы, а могут и нет
IFeatureCollection,
IHttpRequestFeature,
IHttpResponseFeature
IHttpRequestBodyDetectionFeature
...
их там много, то есть буквально каждый чих
и потом в нужном месте получать реализации через такой код
context.Features.Get<IHttpRequestFeature>()
где Features просто коллекция, которую при тестах можно заполнить заглушками, а в рантайме ее заполняет механизм работы с плагинами. (и даже там можно не рефлексировать, а что то типа IPatform.GetFeatures)
Ты думаешь я не пробовал так? Только ищет он эту либу по пути exe основного приложения.
Все стандартные либы нормально импортируются, а вот все что требует референса — пишет, что файл не найден.
>А какова причина ей работать именно так?
Ну хз. Я когда через референсы подключаю управляемую библиотеку, то у меня как будто все содержимое библиотеки рядом лежит, вся иерархия, как будто это часть проекта.
Когда ты подключаешь нативную библиотеку, то ты точно должен знать название метода и какие аргументы принимает.
>Делаешь интерфейсы с которыми и работаешь в IDE а в рантайме связываешь. Так все делают даже если плагины не пишут.
Начиная с этого момента я совсем не понимаю о чем речь. Вероятно ты ожидаешь немного другое от того, что я называю плагином.
На самом деле есть некое приложение, у которого есть свой скриптовый язык
и там есть функция, способная вызвать метод из библиотеки, выглядит это так
[Function_Name, Library_Path, argument1_string, argument2_float, argument3_memoryMap]
Собсно и все возможности коммуникации с моим "плагином". Даже типы аругментов строго обозначены.
Далее в своей библиотеке у меня есть метод
public static float MyFuncton(string argument1, double argument2, intPtr argument3)
{
return 0
}
И да, эта библиотека мимикрирует под нативную, с экспортом функций.
> нативную библиотеку
Ну если речь идет о нативных библиотеках, то можешь забыть все что я написал
Там да, есть проблема вида "не могу найти загрузить нативную часть", что бывает с некоторыми нюгет пакетами врапперами над нативом и я хз как это решается.
У меня только функции экспортированы.
Обычно же, когда ты используешь управляемую библиотеку, то ты должен сначала обратиться к неймспейсу, классу, а потом к методу. А мне нужно было, чтобы функции уже были точками входа — как это работает при [DllImport("")]
Я не думаю, что это делает код в моей библиотеке неуправляемым, ну по крайней мере я наблюдал работу сборщика мусора.
Но проблемы есть с асинхронностью, с референсами библиотек.
>когда ты используешь управляемую библиотеку
с управляемой библиотекой я могу загрузить ее явно откуда угодно. Или переопределить механизм резолва через AssemblyLoadContext
с нативными библиотеками можно использовать для загрузки длл
https://docs.microsoft.com/en-us/dotnet/api/system.runtime.interopservices.nativelibrary
но я его не пробовал
вообще тебе нужно
[DllImport("kernel32.dll", CharSet = CharSet.Auto, SetLastError = true)]
static extern bool SetDllDirectory(string lpPathName);
если платформа позволяет
Просто думали о том, чтобы использовать этот ваш кор для написания служебного приложения. Рулило бы там очередями задач, логи работы вело, собирало какие-то данные и писало бы в SQLite. Но так оно жрало все ресурсы. Решили - ну, хули, будем только небольшие программулины в духе юникса: запустили - оно в stdout результат дало мы его дальше на сях используем. И тут - проблема в том, что оно тупо долго стартует. Пока оно стартанет - такая же хуйня на си - уже завершит выполнение.
Как, блядь, быть? При учете, что сишника нормального - хуй найдешь, а шарповода - хуй научишь писать нормальный код на си.
>Сколько понадобиться времени если заниматься по 4-5 часов в день
Конечно смысл есть. Вкатишься за полгода.
>Сколько понадобиться времени если заниматься по 4-5 часов в день?
Если самостоятельно, то от полутора до двух лет. Если с чьей-то помощью, то можно за год уложиться. Если мозги варят и ты дышишь темой, то можно за полгода все выучить, но это скорее всего не твой вариант.
Винформы, впф, мауи и прочий десктопный шлак сразу забудь - пустая трата времени. В геймдев, если раньше с ним дела не имел, тоже не суйся.
Изучай сам шарп (начиная с Core 3.1, ниже нет смысла).
Параллельно ООП с паттернами (на это сильно можно не налегать, главное понять, а остальное с опытом придет), структуры данных.
Далее учишь ASP.Net Core WebApi (только WenApi, всякие MVC и прочее нахуй) и остальное связанное с вебом (HTPP, REST и т.д.).
Далее (вернее параллельно с предыдущим пунктом) базы данных и ORM (Entity Framework Core, Dapper)
После этого учишь Html, CSS, чистый JS и какой-нибудь фреймворк на нем. Либо ангуляр, либо реакт (я бы посоветовал второе, но не настаиваю). Учишь на уровне, чтобы понимать особенности самого языка и чтобы если пришлось залезть во фронт просто понимать, что и как там крутится, чтобы можно было увязать с бэком. Ну или так, чтобы хотя бы мог простенький компонент накидать.
Это примерный путь бэкэндера, на данный момент с таким стеком реально с нуля устроиться в офис или на удаленку на з.п. 40...60К и где-то через полгода-год удвоить эту сумму. Через год-два это все так же будет актуально (с примечанием только, что нужно будет хорошо шарить в .Net6)
Все остальные пути в шарпе - хуета и потеря времени.
Всё не придёшь в себя после вчерашнего набега жабоблядей/шарпоблядей в треды друг друга? Хорошо, что репорты работают, и шизиков потёрли.
Есть что-то легче байта? Мне нужно вписать нолик и единичку.
Это тебе кто такое сказал? bool весит 1 бит. Можешь загуглить или сам в консоли написать Console.WriteLine(sizeof(bool))
Какая разница, всё равно alignment сожрёт сэкономленные байты.
Согласен.
Легче байта для единичного значения не выйдет. У тебя цп адресует память побайтово. Если нужно хранить несколько булевых значений - гугли битовые векторы
>киберфорум
Нашел блять кому верить. Оператор sizeof возвращает число байт, выделяемых средой CLR в управляемой памяти. В управляемой памяти будет 1 байт, а в не управляемой - 1 бит.
Когда у тебя появляется вопрос по кишкам CLR - иди на MSDN, а не на какие-либо другие форумы. Но на двач можешь, не зря же я разбирался в этом говне, надо хоть где-то знания применять эти
>Винформы, впф, мауи и прочий десктопный шлак сразу забудь - пустая трата времени.
Исчх, WinForms до сих пор топ для Windows-only десктопа. В конторе юзаем паралелльно с вебом. Да и петы набросать можно. Недавно видел вакансию на 6к$, а зумеры всё никак не могут похоронить деда.
>В управляемой памяти будет 1 байт, а в не управляемой - 1 бит.
sizeof возвращет для управляемой, Marshal.SizeOf для неуправляемой.
Нет. Просто, внезапно, местные вузы выпускают людей, которые относительно нормально знают шарп-жаву-питон и совсем не знают плюсы/си. На заводе нужны программисты. Руководство не готово держать людей, пока они освоят плюсы на уровне нормально - нужно чтобы они что-то полезное делали. Плюс трубы горят - нужно много чего для железа писать.
Писать на шарпе - было бы очень удобно. Но пока что все изученные сценарии показывают, что чтобы оно нормально работало - нужно минимум гиг оперативки иметь и процессор помощнее. Но это ведет к удоражанию железа. А никто не будет покупать сами устройства, если они будут даже на 30% дороже, а тут оно будет раза в 2 дороже.
Вот я и хотел узнать. Может быть кто с подобным сталкивался и знает как можно было бы на вот таком, относительно слабеньком железе заставить если уж не летать, то хотя бы приемлемо стартовать программулины, чтобы пока с такой платформой живем - хотя бы какие-то мелкие программулины служебные можно было на шарпе писать, ну, допустим какую-то программку, которая бы опрашивала бы состояние датчиков устройства и отдавала в стандартный вывод и ее раз в 100ms бы уже программа на плюсах дергала. Или программулина бы которая бы сидела и в последовательный порт отдавала бы что-то полезное, чтобы можно было по rs232 почитать.
А пока выходит - что ну совсем-совсем на шарпе под что-то кроме серверов дорогущих, да десктопов - ничего и не попишешь.
>А никто не будет покупать сами устройства, если они будут даже на 30% дороже, а тут оно будет раза в 2 дороже.
Пентиум дуал кор 2 гига 2 ядра - 3000 рублей в худшем случае, 2 гб ОЗУ - 1000 рублей.
Чел, вот давай без инсинуаций про слабые компьютеры. Если ты хочешь шарп на микроконтроллерах использовать, то ты ебанутый. Если у вас компьютер на заводе на ARM Cortex-A7, то вы ебанутые.
Да и то, речь идет про стартовый запуск, а не про скорость работы в целом. Ебать привереды у вас там, подождать 30 секунд в падлу.
Все устройство целиком стоит 2к рублей, няша. Это уже произведенное.
>>28744
Не на микроконтроллерах. Это вполне себе сейчас компьютер. С линуксом, пусть и кастомным. По производительности - что-то в районе малинок первых поколений.
Про первый запуск идет речь, потому что в контексте long-running - шарповские приложения - нещадно жрут оперативу и хрен как с этим бороться. Изначально как раз идея была в том, чтобы core-приложение переписать на шарпы, но в таком случае - оно через пару дней работы при активной загрузке - просто уходило на флешку, а это уже пиздец как больно.
Соответственно, если для постоянной работы оно так себе - было решено посмотреть со стороны unix-вея, пусть быстро что-то делает полезное. Но тут - как раз внезапно долгий старт даже мелких приложений.
Делай интересный проект какой-нибудь. Я уже заебался смотреть все эти интернет-магазины, канеш тема не должна меня ебать, должен ебать только лишь код, но это не отменяет, что смотреть интересный проект - интереснее.
Пример - сделай мини-аналог sharplab.io, юзай Mono.Reflection для получения IL кода. Наебаш там ООП всякого поверх кода который будет идти из услового TextBoxну или <area>, не имеет значения
Еще можешь сделать просто рофельный проект. Алсо советую купить домен какой-нибудь eblan-anon.dev и арендовать сервак, 3к в год будет выходить где-то, и развертывать туда свою парашу, покажешь еще и скиллуху по CI/CD, ваще цены тебе не будет тогда.
>sharplab.io
https://sharplab.io/#v2:CYLg1APgAgDABFAjAVgNwFgBQUBMitZQCcCAbAHQBKArgHYAU9AlHALwB8CiR9ARAC4BTAM79eTJhkxA\
Какая же дрисня под капотом у этого асинк-эвэйта...
Есть доклады где подробно разбирают кишочки state machine, которую компилятор высирает?
1136x584, 0:05
Включи какой нибудь проигрыватель видео, запусти короткое видео, чтобы указатель на таймлайне двигался быстро, и попробуй в режиме воспроизведления видео пошевелить окном. Там таймлайн тоже зафризится или будет идти рывками.
Графика это вещь дорогая, и если не хватает мощны, то луше окно будет двигаттся стабильно, но внутри все тормозить, чем и то и другое. Это результат оптимизаций.
Еще любят всякие анимации и передвижения вешать на таймеры, которые сами по себе выдают нестабильную частоту.
Недавно тоже боролся с реалиями GUI. Видеорил, там два колорпикера и тут интересно смотреть за передвижением цветопробы за куросором. Вариант слева — это из программы CorelDraw, реализовано достаточно очевидно т.е. прямоугольничек движется за куросором при событии MouseDown, но шо мы видим? А у него фпс с гулькин хуй (еще и намеренно залочили).
А справа — это как сделано в фотошопе. Они всю эту хуйню реализовали посредством иконки курсора и на время движения мыши, тупо делают цветопробу невидимой, при этом создается иллюзия, что ты так же как и слева передвигаешь эту пробу курсором. Зато смотри как максимально отзывчиво.
Я к чему, даже в фотошопе могли бы заморочиться на специальной механикой, но они пошли на уловки и иллюзии. Они пытались любыми способами разгрузить перерисовку UI. А уж все стандартное от майков не годится для чего-то, что выходит за рамки блевотных презентаций. Поэтому делай свои анимации, свои перетаскиватели окон.
Вот шутки >>28325 про
>программист вместо написания условного калькулятора начинает придумывать новую механику перетягивания окон.
как говорится, имеют долю правды.
Первым делом скажу, что обычный цикл в асинхронной функции работает куда быстрее и ровнее таймеров.
Ну или забей (но частично), потому что так везде и даже большие компании, как из моего видоса, собсно кладут болт.
все немного не так.
Дело тут совсем не в мощности компа.
Сделай окно с десятком бесконечных прогрессов.
открой немодально несколько таких окон - все будет плавно
Но если ты откроешь второе такое окно в другом UI потоке, то сразу заметишь что в первом окне начались фризы.
Даже на слабом компе типа core i9 + 1080ti
В qml контент даже растягиваться не успевает вслед за окном, видно черную полосу, что уж про полноценные анимации говорить.
Так а зачем сравнивать виджеты с впф? Виджеты аналог winforms, это говно не пригодно для современных приложений.
Ты сказал?
Современные приложения - это веб. И нет разницы, юзать qml, wtf или борланд, всё равно надо копаться в легаси.
>Какая же дрисня под капотом у этого асинк-эвэйта
Двачую, можешь еще глянуть в че превращается yield и dynamic
Нахуя, если есть удобный браузер?
Гуй сказал.
Больше нечем гордиться.
Иронично что традиционно виндовый язык имеет тулсет в винде хуже чем на линуксе
Я так и сказал - юзерам "традиционной" платформы кроме как говном на лице похвастать и нечем.
Двачую, разработка под виндой это какой-то кромешный пиздец.
Если с WSL, то еще куда ни шло для мелких хуевин, а вот если без него, то это поминки...
После консоли в убунте виндовая кажется совсем уж убогим поделием.
Не плакай
У майков есть какая-то своя реализация именованных каналов посмотри в них, может поможет.
Да, вот прям щас это смотрю.
Сначала нашел анонимные каналы, потом перешел на именованные.
В целом, это как мемори маппинг, только без гемора.
Только там какая-то магия на этапе чтения, непонятная для меня.
Все работает, просто я это не могу осознать шо там происходит.
Что-то, что запускается из середины кода без эвейтов и событий, как будто GoTo какое-то.
Завтра разберусь и напишу.
вот и завезли.
https://github.com/Kinnara/ModernWpf
Короче НИХУЯ непонятно че там происходит.
Ну допустим я установил соединение с сервера с клиентом.
Вот я посылаю клиенту 3 сообщения
BinaryWriter bw = new BinaryWriter(pipeServer);
bw.Write("Иванов");
bw.Write("Иван");
bw.Write("30");
Далее клиент пытается считать данные
BinaryReader br = new BinaryReader(pipeClient);
temp = br.ReadString();
temp = br.ReadString();
temp = br.ReadString();
Что происходит? На самом деле данные записываются в массив в примерно таком порядке: "ИвановИван30", а ридер передвигается по байтам, зная размер символа и длину сообщения.
При каждом ReadString() "каретка" сдвигается, пока не упрется в конец и не возникнет исключение о конце потока.
Так вот у меня ВОПРОС. Правильно я понимаю, что если я снова впишу
bw.Write("Петров");
bw.Write("Петр");
bw.Write("25");
То у меня будет уже "ИвановИван30ПетровПетр25" и так будет расширяться до конца страницы, потом далее и далее пожирая оперативу? Эти данные не очищаются?
Так вот. Если я не хочу, чтобы это говно разросталось, я просто прекращаю существование экземпляра BinaryWriter. Например окутываю его в Using.
Но тогда тогда у меня разрывается канал и все, я более не могу наладить связь.
Пишет: Не удается получить доступ к закрытому каналу.
Я не могу сдвинуть каретку, я не могу узнать длин, потому что
BinaryWriter.BaseStream.Position
BinaryWriter.BaseStream.Length
недоступны.
с чего вдруг каналам вести себя не так же, как ведут себя обычные сетевые соединения. Точно так же ведут.
ну там много тумана, но образно - есть входные и выходные буферы. Запись заполняет, чтение очищает.
Вопрос в том, что будет если пишем и пишем, но не читаем. Тут система попробует расширить буферы (и заблокирует Write на это время). Ну а если исчерпается пул буферов - видимо Write просто замрет.
Я не очень понял использует ли он просто буфер для всего или для каждого запроса берет из пула (а-ля ArrayPool.Shared.Rent) но исходя из рекомендации, что размер буфера должен быть достаточно малым чтобы не исчерпывать пул буферов, но достаточно большим чтобы поместился запрос - видимо второе
хотя я хз как помещаются очень большие данные тогда.
Конкретно что ты не осилил сказать можешь?
>Я с сетью никогда не связывался
Ты делаешь запрос на сервер. Сервер должен послать тебе данные в сокет. Он может буферизировать данные перед отправкой.
Так вот на клиенте свой буфер - он заполняется данными из сокета и как только заполнился, то сокет лочится пока клиент не заберет данные из буфера. А сервер в это время ждет пока сокет станет снова доступным для записи.
Этакий блокирующий back pressure. На этом основана ддос атака "медленное чтение", когда открывают коннект и мееееееедлееееено читают, а сервер вынужден держать коннект и связанную с ним память все это время.
Так работают все - Stream, Pipelines, Channel, сеть, пайпы.
Разница есть в подходах работы с памятью - запись может быть заблокирована при заполнении буфера (Stream), а может быть попытка увеличения буфера (MemoryStream), а может смело жрать всю память (Channel.CreateUnbounded) или же иметь лимит (Channel.CreateBounded), который заблокирует запись (back pressure) до освобождения места.
Да и вместо расширяемого через удвоение буфера (который может расширить до безумного размера один большой кусок данных, а потом он зря такой и будет висеть) могут использоваться мелкие буферы, с которыми работа идет как с "одним большим куском" (Pipelines)
то есть пайпы это не файлы. Stream же не значит FileStream и никакого сдвига каретки попросту нет.
Конкретно по пайпам можешь почитать тут https://docs.microsoft.com/en-us/windows/win32/api/winbase/nf-winbase-createnamedpipea
там в Remarks про буферы пишут. Хотя опять же - все по верхам.
Ну вот про буферы непонятно. Буфер заполняется при каждом write? Или сообщение не отправится, пока я не заполню буфер врайтами?
Джун, отвечай, что выведется?
Вопрос с подъебом. Зависит от архитектуры на которой ты это будешь запускать.
Но ведь дотнет рекламировался как архитектурно-абстрактная управляемая платформа. Как же так-то?
Очевидный false
Если оставаться в пределах абстракций, то да. Если начинать лезть в биты-байтики и ансейф, то уже не очень.
Все по канону: «C# was built to give the developer a gun but leave the safety turned on».
>>30460
Да не трясись ты, говно.
>Че за даппер, че за ефкор
Ну первая позволяет быстро + некрасиво SQL синтаксис обращаться к БД, вторая позволяет красиво + не так быстро LINQ, IQueryable, но всё равно достаточно быстро.
>хибернейт и спринг
EFCore, спринг был спизжен с ASP.NET.
>Sleep
Не используй. Есть асинхронный Wait(). Как отменить? Просто. Буквально недавно в .NET 6 добавили метод для Task-ов, называется WaitAsync(), где мы можем передать время, через которое выполнение задачи нас не интересует. Через заданный промежуток времени, ожидание результата выполнения задачи будет прекращено, а также будет сгенерировано исключение TimeoutException
Wait и WaitAsync - разные по назначению, хоть и схожи по названию. https://docs.microsoft.com/en-us/dotnet/api/system.threading.tasks.task.waitasync?view=net-6.0
Ещё есть CancellationToken. Если твоя функция принимает такой, можешь сделать свой сурс токена, и отменить его через время. Только учти, что сурс нужно диспоузить.
>недавно в .NET 6
А в netFramework?
>Sleep
>Не используй.
Дело не конкретно в этой функции. Есть другая, например у сервера WaitForConnection. А что если подключения никогда не случится?
При чем на стороне клиента есть асихронная функция, а на стороне сервера нет. Я понимаю, что к серверу вообще могут не подключиться и это норм, но я все же ожидаю, что клиент подключится в течение N времени, иначе у него проблемы.
Ну вот, не робит
https://pastebin.com/v1w86eTJ
>Обосрался.
По техническим причинам не могу, ILDASM и ILASM не работают с core. Или распаковать в IL можно, но нельзя упаковать, не помню.
Тэк. А где ты токен из сурса токена юзаешь то? Ыхых. Ну отменил ты сурс, токен то где проверяется? Если ты юзаешь функцию, которая его (токен) принимает, она этот токен в ходе своей работы проверяет. И ес чо выкидывает как раз таки ошибку. Ты никуда токен не положил. Так что ты сам и должен проверять. Вообще, у тебя сурс доступен в Sleep, но было бы логично, чтобы Sleep принимал Токен (не сам сурс), и в цикле после Thread.Sleep его проверял. Ну или перед.
Ну вот я как будущий джун вообще нихуя в этих темах не понял. И еще больше не понял, нахуя они нужны. Автор учебника тоже не понял и честно об этом написал.
Ты не можешь запустить асинхронный метод в новом потоке, первый же await остановит поток. Потоки - они для синхронных задач, для асинхронных - Task. Выбирай либо async/await и отмена через токен, либо Thread'ы которые не поддерживают отмену, но есть вот это https://docs.microsoft.com/ru-ru/dotnet/standard/threading/canceling-threads-cooperatively
>>30546
Про bitwise операторы будут, unsafe и dynamic могут спросить просто по приколу, знаешь ты что-нибудь или нет, но там не так много изучать, можешь глянуть вообще что делает dynamic в sharblab.io, а еще через unsafe ты можешь изменить readonly/const
>dynamic
Нужен когда ты работаешь с COM объектами, например ебучем экселем или когда ты подключаешь условную либу 1997 года написанную на Visual Basic 3.0
>unsafe
Ну тут ваще всё просто. Например StringBuilder, он внутри имеет просто char[] который во время Append "удлиняет" в памяти. Вот тут посмотри внимательно на неизвестные тебе методы и погугли что они делают. https://source.dot.net/#System.Private.CoreLib/StringBuilder.cs,3afde4d6a6a867f9,references
>bitwise operators
Тут тоже просто, они используются в алгоритмах зачастую и при оптимизации и так уже десять раз оптимизированного кода. Почему? Да потому что большинство процессоров для bitwise operator имеют свои инструкции которые выполняются на 0.000000001 наносек быстрее, чем условные 3 инструкции подряд которые дадут такой же результат, как и та одна инструкция. Пример - гугли что быстрее / или * там затронута тема будет >> для степени двойки.
>https://source.dot.net/#System.Private.CoreLib/StringBuilder.cs,3afde4d6a6a867f9,references
Ссылка правильная, прям так и скопируй, джвачь не сожрал её правильно.
Имхо сообщение отправляется сразу же, а буферизация используется для помещения сообщения в буфер перед отправкой, чтобы сразу вернуть тебе управление
То есть получится ситуация,что ты просто положил в буфер и думаешь оно уже отправлено, а это не так (если на той стороне малый буфер)
Пока тестировал на консольном приложении, не заметил, что если ридер выходит в конец потока, то он ждет, пока сервер не отправит новые данные.
Так вот в WPF у меня интерфейс к хренам фризится, пока не поступят новые данные. Хз, то ли консольное приложение работало иначе, но мне выдавало исключение (я его использовал как детектинг конца)
Пришлось ридер выносить в отдельный поток, но теперь если я закрою приложение и не закрою перед этим поток, то это говно заставляет мой кулер в компе вращаться со скоростью света.
>вторая позволяет красиво
ага, если работает. а если что то не так то приходится чесать тыковку чтобы понять что не так и как сделать так.
имхо правильнее Dapper + Linq для генерации SQL для этого даппера чтобы стринги не конкатенировать
так, чтобы что то заставляло кулер вращаться
учитывая что чтение (а уж тем более ожидание) пайпа это I/O операция, то есть даже проц не занимает
>Вообще, у тебя сурс доступен в Sleep
Бля, да я для примера Слип показал. На самом деле этот слип не мой, я не могу туда влезть, понимаешь?
Я блять показываю стандартынй слип, мне пишут "Не используй слип", да как вам показать АБСТРАКТНО?
Вот есть функция WaitForConnection, которая ожидает коннекта клиента. Она запустилась и заморозила поток, но клиент так и не подключился. Как мне эту хуйню теперь отменить? Это не моя функция.
Если у тебя невнятная функция, которую ты не можешь изменить, и она сама не подразумевает отменяемость (через тот же токен), то тебе пизда.
В смысле, но люди же эту хуйню придумали? Как с ней работать?
>>30697
Я уже обернул, и я только избавился от проблемы локинга.
А теперь ситуация: похожая функция ReadString ожидает сообщения от сервера. Я могу сервером послать условную команду выхода из цикла, но что если мой сервер крашнулся и не может послать команду?
Поток убить не могу, я могу туда просто послать команду отмены. А дальше что? Внутри поток меня залочен ожиданием ответа от сервера.
И вот это вот все надо знать джуну? Я думаю его даже близко не подпустят ко всем этим вещам, там на каждом шагу можно обосраться.
>Поток убить не могу, я могу туда просто послать команду отмены. А дальше что? Внутри поток меня залочен ожиданием ответа от сервера.
А дальше делаешь Join потоку
Поставил Join(100) и вроде теперь не виснет в диспетчере задач, но я так и непонял что это. Уже поша какая-то магия.
какая магия?
ты запустил в потоке свой WaitForConnection и он повис
ну делаешь ты Join к этому потоку из основного потока, Join блокирует и основной поток но выходит по таймауту и основной поток оживает, а WaitForConnection так и остается жить в своем мире
никакой магии. смысла только нет
>а WaitForConnection так и остается жить в своем мире
В смысле поток не убивается?
Статус потока AbortRequested, клиент сообщает, что канал связи нарушен.
>И вот это вот все надо знать джуну
Нет, всё что тебе нужно знать: dynamic для совместимости, unsafe, bitwise для оптимизации. Но знания которые я привел выше удивят лида с которым ты будешь проходить собес, что какой-то гой без опыта знает такие детали.
>Можно ли так делать
Можно. Только чтобы вызвать этот метод тебе нужно будет сделать следующее:
IMove movable = new Car()
movable.Move()
Если хочешь иначе - пиши public void Move(), или оставь две реализации.
Join это метод синхронизации. Он ничего не делает с потоком к которому Join. Ну разве что сообщает о результате "закончился ли поток или таймаут вышел"
Ебать ты накодил.
Во первых, интерфейсы созданы для того, чтобы... определять интерфейс классов, то есть то, как с ними взаимодействуют. Поля и методы интерфейса и должны быть паблик. Если ты хочешь сделать протектед метод, то тебе скорее нужен абстрактный класс с абстрактным методом.
Во вторых. Ты в своём классе Car объявил метод void IMove.Move без модификатора доступа, а дефолтный модификатор доступа в шарпе private. Ты не можешь получить к нему доступ из наследников.
В третьих. Ебать, ты до переопределения методов не дошёл, а уже код пишешь? Побойся бога, назови их по разному, если они делают разное, или прочитай про наследование до конца.
В четвёртых. ебать, что у тебя с проперти CarName происходит.
да, так и думал, но до конца надеялся, что обойдётся без экземпляра класса. Странна штука, вроде в интерфейсе метод protected, а в классе он уже private....
я эту залупу чисто для примера высрал. Насчёт private...если я явно реализую интерфейс, то по дефолту, в классе, ставится модификатор private и его нельзя изменить...
А бля у тя интерфейс протектед, да и поху. Нахуя тебе сейчас вообще протектед методы и интерфейсах? Ты их предназначение понимаешь?
Про переопределение в курсе. Ещё раз, это чисто для примера. Я щас на интерфейсах сижу, вот и захотел понять, что тут за херь такая. Про абстрактный класс, да, буду иметь ввиду.
>Во первых, интерфейсы созданы для того, чтобы... определять интерфейс классов, то есть то, как с ними взаимодействуют.
Описал, шо хуй поймешь.
Представь, что Петя делает машину БМВ, а Коля делает машину Жигули. Потом Дима должен прикрутить ручки к дверям БМВ и Жигулям. Но вот беда, Петя сделал дверь в днище автомобиля, а Коля вообще посчитал, что двери не нужны.
И что делать Диме теперь? Он мог бы все машины запихнуть в массив и обращаться к функции Door, не взирая на марку автомобиля.
Это я к чему, интерфейс дает предварительной пизды Пете и Коле и говорит, шо ваши классы не будут работать пока вы не сделаете <вот эти вот> функции из списка, которые должны быть обязательно на выходе.
Это да, это понятно. Кстати, а часто используется реализация метода прямо в интерфейсе? Так сказать по дефолту
В интерфейсе ничего не реализуется. Ты пишешь, что понял, но ничего не понял.
Интерфейс содержит перечень методов и свойств, которые должны быть в обязательном порядке у реализующих этот интерфейс. Это как мамка тебе пишет список че купить в магазине.
Это в абстрактных классах можно.
У меня тоже. Там в именах файлах ссылочку оставляют, тыкай и перекинет на гитхаб пасиб дядьпыня
о, пасиб
Блять, да сказали же тебе - не трясись, хули ты устраиваешь? Да, шарп поддерживает, но кто так делает - дебилебаныбля
Це плохо или что? Я просто слышал, что это неоднозначная фича гавно короче, и что её лучше не использовать. Иначе появляется возможность множественного наследования как в цпп
Тащемта данный сабж завезли только лишь как подготовку к generic math ящитаю, ты можешь вот тут source.dot.net посмотреть кишочки интерфейсов INumber, IAddable и прочих, увидишь почему добавили static в интерфейсах. В реальности же данные фичи вообще нигде не используются как по мне. Даже привести пример не могу.
> Я щас на интерфейсах сижу, вот и захотел понять, что тут за херь такая.
Интерфейс - это контракт, по которому класс, реализующий интерфейс обещает иметь нужные методы.
Я хоть и зеленый, но когда щупал дженерики не понял одной штуки - как, блять, сделать мат операцию между двумя параметрами типа Т. Я сначала срр учил не доучил, там чисто в шаблонах можно с кайфом все складывать умножать и тд. А тут, насколько я понял, даже ещё окончательно не завезли данный сабж
>А тут, насколько я понял, даже ещё окончательно не завезли данный сабж
Да, но можно подрубить .net 7 preview и там можно будет это юзать
>Не, я до этого ещё не дожил
Анончик, а ты бы хотел в реале взять свою какашечку и начать её разгребать палочками там всякими, лопатками чтобы посмотреть что внутри?
Интерфейс для реализации возможностей стандартных коллекций: добавить, удалить, обратиться по индексу.
Дебил ебаный, это что по твоему, если не рефлексия?
>T is int
Мамку твою на спене твоего бати ебал кароч
>рефлексия
Сучка крашеная, значение знаешь? Рефлексия никакого отношения к Generic types не имеет
не, не хотел бы. Пускай этим занимаются спецы, там лаборатории всякие по анализу испражнений, двачеры и тд
Нет, просто в 99% юзелес хуйня без которой можно обойтись, но с помощью рефлексии можно сделать почти всё, что душе угодно. Доступ к private членам, получение byte[] кода тела метода, например
звучит так, что если я её буду использовать, то я обязательно где-то проебусь/что-то сломаю
>то я обязательно где-то проебусь/что-то сломаю
Да, почти. В основном главный проеб - это в целом использование рефлексии, так же зачастую это нарушение инкапсуляции итд итп. Но если интересно будет начать копаться в этом кале - будешь пытаться её засунуть куда только можно.
>>30892
Вот этого двачую. Еще рефлексия ахуенна для создания библиотек, например создание модульной архитектуры, а так же генерация методов js которые вызывают ajax запрос к методу api контроллера.
Сойдет для того чтобы ознакомиться с синтаксисом языка, но про глава про паттерны и архитектуры - полная хуйня. Тут лучше гугли и задавай вопросы на ruSO, мы тебе с пацанами ответим если на чем-то застрянешь
Спасибо, про паттерны я отдельную книженцию приготовил. Паттерны проектирования для C# и платформы .NET Core[2021] Джеффри
plati ru продают jetbrains all product pack за 600 рублей примерно, подписка на 3 месяца
Ну лично я наеба не вижу, лучше искать продавцов с большим количеством отзывов и продаж
https://plati.market/search/jetbrains
Еще на авито чекни, там вообще некоторые на год продают лицензии, но там хз, могут и наебать.
Других адекватных способов покупки лицензии для продуктов джетов не нашел, официально в РФ они больше не продают свои поделия
мож это сами жб продают типа "все равно ведь не купят норм подписку, так продадим дешевле, лишь бы не кряки юзали"
Чем не пользовался - нигде через сервак не работало. А так раз в месяц на временную почту акк зарегал и радуешься жизни.
раз в год вообще то и то можно просто не сразу накатывать мажорное обновление (и жить на текущей мажорке хоть вечность), а подождать чуток
но тебе да - лучше каждый месяц мыло регать
Потому что работает как часы уже несколько лет. А серваки и ключи вечно отваливаются.
согласен
лучше регать каждый месяц мыло, чистить профили - романтика
чем "разобрался как устроено и один раз настроил" - что уныло, фу такое
WPF/UWP не смогли убить винформы, а мауи так вообще никому не всрался.
Ага, чудесное творение, из которого намеренно выкинули поддержку линукса прошивки для роутеров.
бамп
Мне нужно в 50 часах видео найти движение одного обьекта.
Очередной недо-высер майков. Он его уже все кто могут поносят
> WPF/UWP не смогли убить винформы
Что характерно, эти тулкиты копируют подход веб-дизайна, когда интерфейс слабо связан с кодом, который бихайнд. В вебе это логично, потому что интерфейс - это браузер, один из нескольких конкурирующих, и код веб-страницы физически не может быть связан сильно.
Что ещё забавнее, конкурирующие оверлейные кроссплатформенные тулкиты (такие как Eto.Forms или Avalonia) тянут тот же самый веб подход, со слабым связыванием через бинды.
Наблюдая это, я в который раз убеждаюсь в том, что массы выбирают самые говняные решения, как те миллионы мух из знаменитой присказки.
Щас набигут миллионы мух и начнут убеждать меня, как я не понимаю профита слабого связывания.
Но ты ведь реально не понимаешь. Такой подход упрощает разработку и разделение обязанностей. Все современные фреймворки основаны на данном подходе.
>Что характерно, эти тулкиты копируют подход веб-дизайна
натягивание совы на глобус.
>тянут тот же самый веб подход, со слабым связыванием через бинды.
этот самый "веб подход" стал распространенным в вебе после выхода WPF, так что он никак не мог копировать
ну а то что паттерн MVVM вообще к вебу отношения не имеет...ну в общем ты понял.
а тебя кто то заставляет?
никто не запрещает писать в манере "спаггети-код мое все, я пилю программы для себя сам, в соло, на галерах не гребу, в коллективе работать не умею и не желаю уметь". Это можно ВЕЗДЕ и даже в WPF
Ебашить обработчики событий и внутри их хардкодить говно. Не использовать биндинги а напрямую привязывать к элементу указывая ему x:Name, ну всё как в винформах вобщем.
мимо
что показать? что можно писать жопой?
или что можно без MVVM?
так это очевидно. в WPF можно писать как будто в винфорсмах пишешь. Биндинги там сверху добавлены - не хочешь, не юзай ни биндинги, ни шаблоны, нихера
> Ебашить обработчики событий и внутри их хардкодить говно.
Ну это ты кроме хардкода говна ничего не умеешь, за себя и пиши.
>>31308
> что можно писать жопой?
Выше жопа уже показала. Даже в пост трясущимися лапками не попало.
> или что можно без MVVM?
Да, и чтобы мне не пришлось лесть в хамл-файл-разметки и какие-то х-нэйм там вручную прописывать. Хочу мышкой формошлёпить.
>Ну это ты кроме хардкода говна ничего не умеешь, за себя и пиши.
Да не трясись ты бля. Если анонче по кайфу говнокодить ради своих проектов - его дело, всем похуй. Всё равно это говно никогда не выйдет в свет. Или у тебя травма детская на почве отказа из ООО Рога и Копыта из-за отсутствия знаний паттернов?
> Или у тебя травма детская на почве отказа из ООО Рога и Копыта из-за отсутствия знаний паттернов?
Зыс.
Ладно, пойду поплачу в подушку. Всем пака!
>Да, и чтобы мне не пришлось лесть в хамл-файл-разметки и какие-то х-нэйм там вручную прописывать. Хочу мышкой формошлёпить
Во-первых разметка и дизайнер в IDE это разные вещи.
А во-вторых (хоть это никакого отношения к в WPF не имеет) - формошлепство мышью было доступно в визуал студии с самого рождения WPF
Ну из того, что это пул, понятно что он позволяет не создавать новые инстансы контекста, а переиспользовать.
Вот только при помещении в пул контекст закрывает коннект, то есть без пула коннектов все равно жить не может.
Все уже написано, просто натягивай на старый код новые карты и героев и на каждом шагу предлагай купить за донаты золотые монеты, на которые можно купить йоба мечь который всех порешает
https://pastebin.com/sQ8asCCn
>Я нашёл в интернете нужный мне код, как из него сделать программу
Без задней мысли
>Правильный ли код
Хуй его знает, протести.
F5
в итоге польза от пула только если неявная инициализация из всяких конфигов или в самом контексте и поэтому дорого типа каждый раз делать.
А если опции в контекст передаешь снаружи, то инициализация контекста куда дешевле и польза пула не видна (о чем я и спросил)
На со куча вопросов на эту тему, мол зачем нужен пул
Оттуда же и узнал что контекст при возвращении в пул делает ресет который заодно и коннект закрывает. То есть нужен еще пул коннектов.
А если пул коннектов все равно нужен, то целесообразность пула контекстов перестает быть очевидной
В чем профит использования пула контекстов, если коннект он все равно не сохраняет, а инициализация контекста может быть вынесена из контекста, чтобы не делалась каждый раз в самом контексте - тем самым сделав создание контекста дешевым
собственно services.AddDbContext<> это и делает позволяя задать конфиг который будет передаваться готовый в конструктор этих контекстов лишая смысла постоянно выполнять OnConfiguring
Гугли чем отличается событие от делегата. А по поводу CommandManager.RequerySuggested - https://ask-dev.ru/info/174019/what-is-the-actual-task-of-canexecutechanged-and-commandmanagerrequerysuggested
OnConfiguring можно не выполнять при каждом сосздании DbContext, а может быть выполнено единожды
>аналогично как и в свойствах get и set
Ну не совсем аналогично, скорее синтаксис одинаковый. А так да, просто добавляет/удаляет элементы в "коллекцию" вызовов
https://sharplab.io/#v2:EYLgxg9gTgpgtADwGwBYA0AXEUCuA7AHwAEAmARgFgAoIgZgAJT6Bhe6gb2vu/oAcoAlgDcAhhhiMySejCEw8GSSXoBBMBgDcXHqWXbunKj2Or19ANQBeegAoAlPUsA+SQE4bZO1qMnuaxVa2Ds5uNiRe+ib+Ftb2ji5EZO60ET6+kcaiUPQCeEIQANZiAhB4ADICAM6K1v4AdADiMBgAknkQYMWlFdX23r7cGTwAZtAwImAAFjZZOeIAtjl4S/lFGCXlVRh2Q76J7gILqQNsaVHqdW2rMH2RAL7Ud0A
Я провел сравнительный анализ взяв за референс книги из шапок тредов посвященных этим языкам.
А ты читал книги из шапки?
читал
именно там написано в коментах с 14 лайками что коннект закрывается при возвращении в пул
мультредовость это не аргумент для использования пула
а " Pooling has some performance gains. " являются абстрактной фразой, которую я и спрашиваю А МОЖНО КОНКРЕТНЕЕ???
В каком месте создание DbContext является тяжелой операцией, что "только пул может помочь"?
Я вот вижу выполнение OnConfiguring при каждом создании экземпляра DbContext (дока так пишет). Но этот OnConfiguring можно выполнить единожды на все экземпляры, так что незачет.
При создании контекста инициализируются новосозданные разные там словарики, списки, но разве это такое тяжелое что ему пул нужен?
Самое тяжкое в объяснении это то, что вы бля ищете скрытый смысл там, где его нет.
https://docs.microsoft.com/ru-ru/ef/core/performance/advanced-performance-topics?tabs=with-di%2Cwith-constant#dbcontext-pooling
https://docs.microsoft.com/ru-ru/ef/core/performance/advanced-performance-topics?tabs=with-di%2Cwith-constant#managing-state-in-pooled-contexts
Читай две статьи следующим образом: прочитал абзац - пошел полчаса думать над ним, как понял - приступаешь к следующему.
Актуальна ли на данный момент книга CLR VIA C# ? Почитываю Албахари , он достаточно глубоко описывает синтаксис на современном стандарте , или Рихтер неизменная классика ?
Ну вот и отлично
Сам сайт: www.cbr.ru/scripts/XML_daily.asp
>Кодировка на сайте windows-1251
Кто тебе сказал? Алсо ты передать кодировку можешь следующим образом:
Encoding.RegisterProvider(CodePagesEncodingProvider.Instance) //регаешь провайдер который содержит дохуя кодировок
var encoding = Encoding.GetEncoding(1251); //"windows-1251"
и этот encoding можно в Stream передавать. Возможн будет работать. Ну или попробуй UTF8 передать, что вероятно как раз будет работать.
Шутник.
Потребление памяти моё почтение, настоящее унижение нищих бомжей без хотя бы 16 гигов оперативки.
Когда тебе нужно, чтобы классы-наследники могли наследовать поведение родительского класса и переопределять поведение, где нужно. Самый явный пример - иерархия UI-компонентов в WPF. Если делать ее чисто на интерфейсах, то придется либо поддерживать гору копипасты, либо городить переусложненную архитектуру.
BitConverter.GetBytes(int)
BitConverter.GetBytes(double)
BitConverter.GetBytes(boolean)
и так далее
Можно как-то мне обойтись кучей перегрузок и сделать что-то универсальное?
1. Серез Object, это привет упаковка\распаковка
2. Дженерики не знаю как запихнуть
3. If Else это вообще бред
Что еще есть?
Можно. Подключаешь .NET Preview хуй знает какую и пишешь следующее:
public static SmthGovno GetBytes(INumber number)
{
}
После того, как в интерфесы можно запихивать код, я даже не знаю зачем.
Давай трястись вместе?
Нельзя. Посмотри в исходниках шарпа почему source.dot.net
this
>Encoding.RegisterProvider(CodePagesEncodingProvider.Instance)
Если кому надо, вот решение ещё exception для наглядности:
Вечно забываю про этот идиотизм пока багреквест не прилетит
Простите за глупый вопрос, а что это за консоль отладки? У меня выводит через окно интерпретации.
Обычная дебаг консоль. Окно интерпретации - это что-то типо питоновской херни, где можно числа складвать там и тд
Я ее всегда использовал как окно вывода данных. Как еще во всяких WPF выводить данные?
А где находится консоль отладки?
Странно, она вообще по дефолту для консольных приложений стоит, типо нажимаешь на Debug(или F5) и она автоматом вызывается, так что хз.
А, ну консоль выводится, но обычная.
У тебя наверно стиль виндовс синюшный, выглядит как часть интерфейса студии.
>Ты че ебанутый? Хранить несколько гигов говна в памяти?
Там по коду только такой https://github.com/username1565/KeyValue/blob/SQLite3Storage/KeyValue.cs#L72
огрызок в памяти хранится.
Остальное - на диске.
>>24600
>А редис где гранит?
Двачую этого. Тоже интересно, каков лимит у редиса.
>>24628
>Сука ты меня уже доебал
То залётный, так что он тебя ещё доебать не успел.
А если ты ко мне, то я тебя не то что ещё не доебал, я тебя ещё даже голым не видел.
>>24370
>Юзай бля Redis и не еби мозги
>>24652
>Просто используй редис, чел. Это топовое решение.
>>24661
>золотой молоток (с)
Тогда, надо поднимать redis-сервер, а значит надо инклюдить его код, а он на Си.
>>25507
>Юзай Ignite чел!
Ну хуй знает, код на Java, и ещё и сервер там...
Пока смотрю вот здесь: https://nugetmusthaves.com/Tag/key-value
нарыл LMDB
но оно чё-то не конпелируется, падлюка.
Ещё варианты?
>Ты че ебанутый? Хранить несколько гигов говна в памяти?
Там по коду только такой https://github.com/username1565/KeyValue/blob/SQLite3Storage/KeyValue.cs#L72
огрызок в памяти хранится.
Остальное - на диске.
>>24600
>А редис где гранит?
Двачую этого. Тоже интересно, каков лимит у редиса.
>>24628
>Сука ты меня уже доебал
То залётный, так что он тебя ещё доебать не успел.
А если ты ко мне, то я тебя не то что ещё не доебал, я тебя ещё даже голым не видел.
>>24370
>Юзай бля Redis и не еби мозги
>>24652
>Просто используй редис, чел. Это топовое решение.
>>24661
>золотой молоток (с)
Тогда, надо поднимать redis-сервер, а значит надо инклюдить его код, а он на Си.
>>25507
>Юзай Ignite чел!
Ну хуй знает, код на Java, и ещё и сервер там...
Пока смотрю вот здесь: https://nugetmusthaves.com/Tag/key-value
нарыл LMDB
но оно чё-то не конпелируется, падлюка.
Ещё варианты?
только тред давно переехал, так что тут никого
Означает ли это, что в скором времени .NET платформу использовать в России будет невозможно/никто не будет, и, соответственно, джуну найти работу с этим стэком будет нереально?
Если проще сформулировать, то повлияет ли полный уход Microsoft на C#/.NET разработчиков в России?
Как я понимаю, C#/.NET сейчас open-source и ограничения Microsoft могут повлиять разве что на недоступность Visual Studio, но хотелось бы почитать мнение шарящих людей.
>string str1 = "Hello";
>string str2 = "Hello";
>object.ReferenceEquals(str1, str2) //false
Тут true будет интендация жи.
Вы видите копию треда, сохраненную 31 октября 2022 года.
Скачать тред: только с превью, с превью и прикрепленными файлами.
Второй вариант может долго скачиваться. Файлы будут только в живых или недавно утонувших тредах. Подробнее
Если вам полезен архив М.Двача, пожертвуйте на оплату сервера.