Этого треда уже нет.
Это копия, сохраненная 12 июля в 00:33.

Скачать тред: только с превью, с превью и прикрепленными файлами.
Второй вариант может долго скачиваться. Файлы будут только в живых или недавно утонувших тредах. Подробнее

Если вам полезен архив М.Двача, пожертвуйте на оплату сервера.
17112255797110.png37 Кб, 1000x1000
2 3097774
Теперь это тоже Blazor тред.
3 3097859
>>097774
Кто такой, чем известен?
4 3097884
>>097760 (OP)
Ох, ебать. Дождались таки нормального переката, слава Биллу.
9011267.jpg48 Кб, 460x460
5 3098049
Положняк по пикрилу?
6 3098088
>>097884
На самом деле - я помню времена, когда первым постом была еще доп лит-ра. Но я не могу списочек найти. Воооот. Так что да.
ПОЛОЖНЯК ПО UI 7 3098140
Авалония - говно мокрописечное, зумерское, с прибитыми гвоздями темами.
Eto.Forms - годный нативный гуй-фреймворк для взрослых сеньоров.
8 3098146
>>098140
Хороши твои ето формс но порой хочется просто поредачить ксамлы. Не надо свое фанбойство несколько перекатов продвигать
9 3098187
Кто-нибудь реально нашел применения для MinimalAPI?

Просто я вот как не пытался. В результате - я вместо Startup - делаю класс ConfigApp.cs в котором делаю литерли то же самое, что было в Startup. Плюс, если отхожу от контроллеров - просто делаю классы, которые называю хендлерами-сервисами, и они те же контрллеры, просто без ASP'шной фигни, а в остальном - так же - в минимал апи стиле описал роутинг, а работа в этих хендлерах-сервисах.
В общем. Я не понимаю, чи я тупой и не знаю как готовить, чи годится это только для совсем узкого круга задач. Поясните, кто реально в проде использует, как вы их готовите?
10 3098193
>>098187
Я думаю это чисто для микросервисов фича. Типо описать всю приложуху в одном Program.cs файле в меньше чем 500-600 строчек. Удобно жеж
11 3098205
Шарпаны, есть кто в вскоде сидит?
Что хочу: сделать новый конфиг dotnet new для вскода, в котором будет лежать сопутствующий launch.json при создании.
Читал https://learn.microsoft.com/en-us/dotnet/core/tools/custom-templates
Но чёт не понял что там именно в template.json надо написать чтобы в итоге получался файл с кастомной инфой.

1. Как после dotnet build получить путь собранного бинарника? Verbosity выставить и парсить ответочку чтобы путь оттуда выковырнуть, а-ля dotnet build --verbosity n и оттуда брать CopyFilesToOutputDirectory? Есть что-то лаконичнее (кроме явного указания самому билдеру куды пихать output)?

2. Можно ли потом в вскодовской launch.json конфигурации как-то автоматически вписывать путь к бинарнику сразу в "program":?
12 3098212
>>098193
Ну, это какие-то совсем микро-микро-сервисы.
Обычно у тебя все же там надо к БД подключаться, надо какие-то обработчики сообщений из очереди и это в рамках одного микросервиса, плюс всякие модельки и прочее. Да даже взгляни на то что майки как пример микросервисной архитектуры(eshop) показывают, если все делать это в одном файле - будет лютая каша.
13 3098237
>>098187

>Поясните, кто реально в проде использует, как вы их готовите?


В проде нет. Только для тестовых стендах для каких-то совсем микрописечных моков или прототипов. И то, если это используется более чем одного раза, то проще свой нормальный шаблон взять и там сделать норамльно.
14 3098242
Где в editorconfig убрать перенос на новую строку в конце файла?
15 3098243
>>098193

>Я думаю это чисто для микросервисов фича.


Суть микросервисов, совсем не в том, что они маленькие.
16 3098249
>>098146

> порой хочется просто поредачить ксамлы


В формсах есть хамл.

> Не надо свое фанбойство несколько перекатов продвигать


Это не моё фанбойство. Это - баланс. Как только прибегает авалония-фанбой и заявляет, что авалония - единственный UI-фреймворк, мне приходится восставать из мёртвых и показывать мимокрокам, что есть альтернативы.
17 3098292
>>098243
Это точно, их смысл в том, что они оверблоу.
18 3098362
>>098242
Не надо его убирать.
19 3098375
>>098292
Не придуривайся.
Суть микросервисов, в том что они являются минимальной денницей деплоя, и в случае, если какой-то из них сломается, упадет и прочее - вся остальная система продолжает работать и большая часть пользователей даже не заметит, если какой-то сервис лег. В идеале, они еще горизонтально масштабироваться могут, но так не всегда выходит из-за бизнес-требований и требований к надежности.
А размер - у них может быть и вполне жирненький. Средний микросервис - это где-то 3-4к строк кода, если мы что-то реально полезное делаем.
20 3098417
>>098249

>В формсах есть хамл.


ну а чем бы ему не быть. это ж просто описание кода в виде хмл

другой вопрос - а чего можно добиться этим описанием? а ровно столько же сколько и кодом.
А чего можно добиться кодом? являются ли контролы ето.формса lookless по природе как оно в WPF?
в авалонии да, а в формсах? а в формсах я должен все вручную.
21 3098426
>>098362
Почему? Он меня нервирует.
22 3098429
>>098417
В 90% случаев на шарпе пишется стандартный КРУД со стандартными гридами, и вся мощь луклеса нахуй не нужна. Нормальным, адекватным людям нахуй не нужны в быту круглые кнопки со встроенным калёндарём.
23 3098455
>>098429

>Нормальным, адекватным людям нахуй не нужны в быту круглые кнопки со встроенным калёндарём.


Ой как же ты не прав. В текущей конторе - тоже так думали долго, пока конкуренты не сделали красивенько и более удобно, в результате - отжали дохуя клиентов, а эта контора потеряла просто дохуя денег.
24 3098461
>>098455
А, ну... Тогда знаешь... Походу действительно, наверное... Ты прав...
25 3098471
>>098461
Ну, рил. Миллионы долларов убытков, потому что сделали в 2001м приложуху, и просто добавляли в нее вичи по клиентам, когда приходили и говорили бизнесу, что ну, типа, надо ОСВЕЖИТЬ, люди говорят что уже в монстра превратилось и сложно даже простые вещи делать, а интерфейс времен XP вызывает отторжение у новых пользователей, че бизнес говорил: Да-да, это все конечно важно, но куда они денутся.
И появляется конкурент, который сделал то же самое, но красиво и выпилив тот функционал, который залетал и нужен был одному клиенту из 1000, и все - теперь конкурент получает эти миллионы денег, а бизнес кричит, что вы долбоебы, все просрали, вообще, надо было вчера сделать красиво и удобно, а вы такие растакие ебаньтяи.
26 3098477
>>098471
Компания?
27 3098485
>>098477
Меня уволят, если я про нее напишу, няша. Но с вероятностью 95% у тебя в доме их прибор имеется.
28 3098509
>>098471

> бизнес говорил: Да-да, это все конечно важно, но куда они денутся.


> риходили и говорили бизнесу, что ну, типа, надо ОСВЕЖИТЬ


> бизнес говорил: Да-да, это все конечно важно, но куда они денутся.


> теперь конкурент получает эти миллионы денег, а бизнес кричит, что вы долбоебы, все просрали


Охуительно кабан нашёл виноватых.
Вот именно поэтому я - индюк.
29 3098533
>>098485
Какиони узнают что это ты написал?
30 3098565
>>098187
Когда надо сделать простенький Api с минимумом логики. Например вернуть простую строку.
31 3098865
>>098509

>Вот именно поэтому я - индюк.


Ну т.е. ты и кабан и исполнитель в одном лице. Т.е. в любом случае за свой проеб "кабан" будет винить "исполнителя"
32 3099010
>>097760 (OP)
Пасаны. Thread или Task ? И почему?

Бонусный раунд: когда вы вообще последний раз использовали Thread ? (Подразумевается не копание в каком-то легаси, а написание чего-то нового.)
33 3099049
>>099010
Thread когда точно знаешь что тебе нужен Thread, Task когда ты задаёшься вопросом что выбрать Thread или Task.
1711361008325.png268 Кб, 1250x1199
34 3099081
Кто-нибудь знает рабочие способы нормально спиратить лицензию на ReSharper/Rider, без нужды жонглировать ключами всяких университетов, которые банят каждые два-три дня? JetBrains слишком серьёзно за это дело взялись в последнее время.
35 3100146
>>099081
Нахуя тебе райдер? Что конкретно в нём ты используешь в своей работе постоянно такое, что тебе не хватает бесплатной студии / бесплатного коде?
36 3100176
>>100146
Он мне нахуй не нужен, мне нужен ReSharper, но это всё один пакет dotUltimate. Без решарпера студией пользоваться просто менее удобно, в нём куча всяких удобных гибких штук для кастомизации правил выравниваний, переносов, отступов и т.д. на каждый тип структур кода. Ну и человеческий Solution Wide Analysis, конечно же, без него в целом жить больно очень, как и без решарповского запускатора юнит-тестов.
В общем, это буквально база для работы над любым крупным проектом.
37 3100181
>>100176

> база для работы над любым крупным проектом


Ну раз у тебя крупный проект, то пусть руководство и закупает.
38 3100184
>>100176

> куча всяких удобных гибких штук для кастомизации


НЕНУЖОН

> Solution Wide Analysis


НАХУЙ

> запускатора юнит-тестов


ПЕРЕБЬЁШЬСЯ
39 3100189
>>100181
Закупает где? Вот он и спрашивает про покупку
20240109040934.png156 Кб, 294x430
40 3100208
>>100181
Где купить-то, ебалай? Напомнить, где живём? Нахуя ты вообще написал мне всё это, как это относится к изначальному вопросу? Ты долбаёб? Отвечай!

>>100184
А всё, а я уже разобрался, я просто на бесплатную лицензию EAP перешёл, которую постоянно сбрасывать можно и по новой активировать.
41 3100360
Платиновый вопрос по асп - где перфоманс?
Проект на 7 дотнете, простой get который возвращает json в котором по сути самое жирное это картинки в base64 строках.
Сначала была ебическая просадка когда я доставал из базы EF'ом async'ами, в стековерфлоу сказали что это кривизна особенность реализации EF'а и потому нужно просто забить хуй и лучше доставать данные синхронно.
Сейчас в данном примере находится 4 картинки общим весом под 7МБ.
Само доставание из базы через EF и формирование json'а отрабатывает около секунды (область в stopwatch'е) (что вообщем-то тоже мне кажется дохуя, хотя я могу быть не прав). Это не первый запрос, потому все инициализировано, база ms-sql в локалхосте.
Вопрос следующий - почему у меня в локалхосте идет загрузка 7МБ - 10-13 секунд? То есть в дебагере сам метод в контролере какбэ отработал и дальше 10-13 секунд идет передача данных.
Что я делаю не так и как с этим совладать?
Или обязательно нужно делать отдельное апи которое будет возвращать Content-Type: Image? Но с загрузкой все равно какая-то нездоровая ебала.
42 3100371
>>100360
Можешь скинуть пример запроса к БД?
43 3100446
>>100371
Вообще меня сейчас волнует именно загрузка, а не запрос к бд.
44 3100461
>>100208

> я просто на бесплатную лицензию EAP перешёл, которую постоянно сбрасывать можно и по новой активировать


Что и требовалось доказать. Жетбренсовский пиарщик бегает по российским форумам (и бордам) и прогревает гоев, что можно пока что бесплатно пользоваться.

> Главное, не забывайте нас


Как бы говорит нам жетбрейнсовский пиврщик.

Нахуй иди, нам и на вскоде норм.
45 3100467
>>100461

> и на вскоде норм


Как сказать, что ты никогда в жизни не писал код на шарпе за деньги, не говоря о том, что ты никогда в жизни не писал код на шарпе за деньги.
46 3100531
>>100360
Просто не пользуйся говном под названием EF. Эта хуйня как интернет эксплорер: никому нахуй не нужен, но майкрософт продолжает его везде проталкивать. Пиши sql руками, смотри план запроса, для маппинга используй dapper, а не это индусское говнецо.
47 3100539
>>100467
У тебя одни деньги на уме. Капитализм совсем тебе моск съел. В жизни столько прекрасного, а ты думаешь о том как бы заработать еще больше денег. Выгляни в окно, посмотри какая погода, почки набухают, пчёлки жужжат.

Деньги, блять.
48 3100545
>>100531

> Пиши sql руками


Надо же, как маятник истории покачнулся. 20 лет назад писали запросы руками, 10 лет назад конструировали конструкторами, а щас опять руками.
49 3100546
>>100446
Ты же в курсе, как работает Skip и Take? Оно вытягивает на клиента все записи, а потом часть выбрасывает. Если у тебя 1000 строк и надо показать последние 20, из базы уедут все 1000. Пейджинг в бд делается через row_number over partition.
50 3100548
>>100545
Запросы всегда писали и оптимизировали руками, это база. Не изобрели еще фреймворк, который умеет в запросы. Хибернейт в джаве появился еще до твоего рождения, но очему-то опытные разработчики по-прежнему пишут sql руками, угадай, почему.
51 3100551
>>100531
Блять, еще один.
Повторяю еще раз -
>>100546
Во первых у меня буквально пока что буквально одна строка.
Во вторых (поправь меня если я несу хуйню) там IQueryable, и в конце идет ToList и запрос делается уже именно на нем насколько мне известно.

Повторяю еще раз, моя основная проблема сейчас это очень длинная загрузка небольшого json'а с апи (Content-Type: application/json; charset=utf-8), а не EF.
Посмотрите этот ебанутый 2 пик еще раз >>100360.
52 3100552
Алсо, клиент на блейзоре получает приблизительно с такой же ебанутой задержкой (я там тоже мерял стопвотчами), так что это тоже не проблема самого Postman'а из которого взят скрин.
53 3100556
>>100551
Так у тебя тормозит вытягивание из бд или сериализация?
54 3100557
Сам проект запускается в дебаге http (Kestrel?)
55 3100560
>>100556
Ни то и ни другое, у меня тормозит сам return с апи.
Сама сущность уже готовая (list<T>).
56 3100564
>>100560
То есть, тормозит даже если ты просто возвращаешь фейковые данные, без запроса в бд?
57 3100568
>>100564
Тормозит на моменте загрузки 7MB json'а.
Решает именно объем возвращаемых данных.
58 3100570
>>100568
Зачем ты передаешь картинку в джейсоне? Чтобы что?
59 3100574
>>100570
Потому что удобно все сложить в единую логическую кучу, у меня связь в бд 1 к 1 + не нужно писать отдельное апи для пикч.
60 3100580
>>100574
Тебе знакомо понятие "статический контент"? Про CDN слышал?
61 3100584
+ У меня пикча это объект с метаданными вроде ContentType и FileName. Как мне передать это одним запросом который будет Image? Только не надо про двойные файлы и т.д.
62 3100588
>>100360
Для начала - почему ты думаешь, что проблема на стороне твоего кода?
63 3100592
>>100588
Он сериализует картинки в базе64 и передает их в джейсоне. Где же тут проблема?
64 3100593
>>100588
Я и не думаю что проблема на стороне моего кода, возможно я просто делаю это не таким образом как принято это делать.
Я понимаю что проблема на стороне асп, как и в случае с асинками в EF, вопрос - что мне делать и как это фиксить?
65 3100596
>>100592
Да, и?
Что ты будешь делать если тебе нужно будет получить с апи другой контент или просто много текста? Будешь ждать 15 секунд для получения 7МБ?
66 3100597
>>100593
Локализуй проблему.
67 3100598
>>100176
Двачую этого. Решарпер умеет в адекватное форматирование кода, а именно: форматирование блоков инициализации массивов/списков.
Если бы студия умела, то решарпер был бы не нужен. А так... имеем, что имеем.
68 3100770
>>100598

>в адекватное форматирование кода, а именно: форматирование блоков инициализации массивов/списков.


Покажи пример.
69 3100981
>>100770

> Покажи пример.


Держи
https://pastebin.com/V5ejnBLS
70 3100999
WEBAPI. Как вы делегируете модельку (вью модель/дто/реквест) из контроллера в сервис, когда у вас один параметр, например Id приходит из роута, а остальные свойства (модель) из тела?
1. Сервис принимает два аргумнента: Id и дто
2. Сервис принимает один аккумулированный объект (переложить в другую модельку)
3. Сервис принимает один объект, содержащий Id, который присвоим в контроллере

https://pastebin.com/MJyTNeaM
71 3101008
>>100999
Честно? От настроения)

Сейчас стараюсь делать вот так:
Сервис - принимает в себя Request<T1> и отдает Result<T2>
Result - это тип, который содержит либо ответ, либо ошибку с описанием ошибки.
Проблема такого подхода, что пришлось вводить Success если что-то в сервисе не возвращает какого-то объекат.
Обычно T1 - это та же DTO или расширенный объект, который содержит в себе DTO + что-то что там надо(id, токен авторизации, имя пользователя и прочая хуйня, которую можно извлечь из запроса)
72 3101009
>>100999
Второй вариант. Задача контроллера - это принять данные, провалидировать их, проверить все пермишены, если все ок - вызвать сервис. У сервиса свои модели, его не должно ебать, как к тебе в апишку приходят данные.
73 3101017
>>101009

> провалидировать их


Не задача контроллера.
Задача контроллера - принять запрос и передать его дальше.
Валидация - это часть бизнес-правил. Вот прилетел тебе запрос на пополнения баланса. Пополняют с несуществующего кошелька. Запрос, в плане бизнеса - невалидный. Если контроллер будет это валидировать, у тебя бизнес протек в контроллер. Если не будет - то у тебя размазана валидация по разным слоям. Тут мы провалидировали, а там - нет, не бред же, потом ищи-свищи, как хуйня попала сюда.
Так что если запрос уж дошел до контроллера, т.е. на его уровне - моделька валидна - он ниче не должен больше валидировать, а просто передать тому кто будет исполнять.
74 3101034
>>101017
Валидация делается на всех уровнях. В контроллере проверяется, что у юзера есть пермишен вызывать этот эндпоинт. Посмотри, как сделано в амазоне, там 100500 ролей на каждую ручку и хуй ты что сделаешь без явного разрешения.
Правила бизнес-логики проверяются дальше, в самой логике, это очевидно. Речь о том, что контроллер принимает просто какие-то данные от пользователя, вообще любые данные, и должен их проверить прежде, чем отдавать дальше. Не должен пропустить всякие хитровыебаные инъекции. Должен обмазать все логами. Должен поймать и обрезать эксепшены, чтобы вместо полного колстека наружу уехала ошибка 500. Этим занимается слой контроллеров.
75 3101045
>>101034
Так пермишины ты еще на уровне аутентификации до того как к контроллеру дело дойдет должен был проверить...
Как и валидность модельки - в ASP.NET - еще на уровне роутинга.
Так что остается валидировать-то в контроллере?

Плюс, эксепшны - это зло. Понимаю, почему люди их используют, но у нас на ревью - тебе бы долго пришлось доказывать реальную необходимость, вместо возвращения Error'а
76 3101047
>>101045

> аутентификации


Авторизации

Всегда их путаю(
77 3101058
>>101045
Ты неироничто предлагаешь возвращать код ошибки вместо эксепшенов? 2024 год на дворе, не 1964.
78 3101067
>>101047
На каком уровне находится проверка ролей. К тебе приехал токен, он валидный, nginx пропустил запрос на твой сервер, сервер вызвал контроллер. Где будет проверка?
80 3101087
>>101082
Правильно, проверку делает фреймворк, тебе надо лишь расставить аттрибуты. Но проверка происходит все равно на уровне контроллеров. Если ты захочешь написать сервис скажем на ноде или на го, ты должен понимать, как все это работает под капотом.
81 3101182
>>100560

> тормозит сам return с апи


Так там сериализация в джейсон под капотом, она и тормозит.
82 3101194
Привет, Двач, как забилдить исходники этой утилиты?
https://github.com/josuelopezv/aDrums
(проект WebApp.ADrums)
На современной VS получилось только с помощью SDK 2.1 мигрировать проект в csproj (после миграции целевая платформа была заново обновлена до dotnet framework 4.8), но судя по всему забилдилось/мигрировалось криво, и при запуске оно не видит исходники страниц (.cshtml). При открытии страницы браузер писал, что нет доступа именно в странице, а в консоли выдавалось исключение об отсутствии исходных файлов (index.cshtml, но были и другие файлы). Помогите, аноны
83 3101195
Привет, Двач, как забилдить исходники этой утилиты?
https://github.com/josuelopezv/aDrums
(проект WebApp.ADrums)
На современной VS получилось только с помощью SDK 2.1 мигрировать проект в csproj (после миграции целевая платформа была заново обновлена до dotnet framework 4.8), но судя по всему забилдилось/мигрировалось криво, и при запуске оно не видит исходники страниц (.cshtml). При открытии страницы браузер писал, что нет доступа именно в странице, а в консоли выдавалось исключение об отсутствии исходных файлов (index.cshtml, но были и другие файлы). Помогите, аноны
84 3101276
>>099010
>>099049
И почти всегда когда ты думаешь что тебе нужен тред на самом деле нужно юзать таск

Боже, храни tpl. Аминь
17114965909205804.webp97 Кб, 1272x1272
85 3101284
86 3101314
>>099010
Зависит.
Если надо быть уверенным, что какой-то кусок кода будет выполняться в фоне, и не хочется ебаться с планировщиками и контекстами синхронизации - то проще явно тред создать.
Допустим, какой-то watchdog программный, который должен ебнуть что-то, если что-то "зависло". С тасками такой вочдог - при скакнувшей нагрузке и дохуищах тяжелых операций - твой вочдог может вообще никогда не выполниться, или выполниться с таким опазданием, что ну его нахуй.

> Бонусный раунд: когда вы вообще последний раз использовали Thread ?


Буквально вчера.
87 3101412
>>101284
Многие (большинство) пункты очень спорные.
Такой код может быть только в "идеальном" мире с "идеальной" предметной областью.
88 3101459
>>101058
Как раз таки 2024-й год. Эксепшен - в лог, пользователю - читаемая ошибка. Эксепшены вообще не должны наружу просачиваться, с ними либо поддержка разбирается, либо юзер (если он продвинутый) идет в мониторинг/логи и разбирается.
89 3101471
>>101284
А так обычная байда в стиле дяди Боба. Новичок в любом случае не поймет и только с километрами написанного своего и что важнее прочитанного/разобранного чужого кода научится это применять с толком. Опытный же будет до усеру доказывать, что тут все спорно и вот есть кейсы, когда "эти правила неудобны, поэтому они говно".
90 3101490
>>101182
Вообще мимо ванга, сериализация идет меньше секунды.
91 3101516
Аноны, я кажется частично пофиксил этот аспнетовский пиздец.
Если поменять тип возвращаемых данных с контроллера с application/json к application/octet-stream время загрузки падает с 13 секунд до 33мс, как оно вообщем-то и должно быть.
Прикладываю нотариально заверенные фотокарточки.
Спасибо разработчикам асп!
92 3101519
>>101516
Я хотел тебе предложить File вместо Ok, только использовать stream вместо byte[], но почему-то подумал, что тебе нужен json отправлять по факту и решил ничего не писать.
93 3101526
>>101519
Мне какбэ и нужен json, но клиент по прежнему хавает и десериализирует без изменений кода, правда время десериализации увеличилось в несколько раз вероятно из-за того что там проебалсь разметка в виде отступов и переносов и весь текст идет одной кашей.
Сейчас погуглю как это пофиксить и буду дальше держать вас в курсе.
94 3101561
>>101516
Какой пиздец
95 3101596
>>101526
Попробуй хранить изображение как byte[] в БД.
96 3101623
Продолжаю держать вкурсе дальше - сейчас как оказалось что основной ботлнек это десериализация на клиенте (4 секунды / 7мб / 4 пикчи). Сериализация если что ~0.66 сек. Форматирование джейсона как оказалось никак не влияет на время.
>>101596
Вероятно я таки буду делать отдельную таблицу+апи для изображений в который я буду складывать все изображения из всех таблиц и кидать на клиент гуид id изображений из которых затем клиент будет доставать отдельными запросами все пикчи. Я бы
97 3101630
Блять, в треде снайпер, хотел перенести строку и отправил:
Я бы хотел возможно даже сделать байт поля для пикч в этой же таблице, только я хз как это передать на клиент одним запросом при условии что у меня ботлнек в десериализации.
98 3101683
>>101623
Или ещё проще храни в БД путь к файлу, а дальше
byte[] bytes = File.ReadAllBytes(path).

В теории можно использовать FileStream и сразу же его вернуть в контроллере.
99 3101776
>>101623

>и кидать на клиент гуид id изображений из которых затем клиент будет доставать отдельными запросами все пикчи.


Почему ты так сразу не сделал? В том смысле, что метаданные отдаются отдельно, тело файла отдельно? Вроде бы всегда так делается.
100 3101876
>>101776
Пушо я лох самоучка и у меня в принципе нету инструкций как правильнотм делать.
И да, до меня уже внезапно дошло что метаданные можно отправлять через кастомные хедеры.
>>101683
Что-то у меня нет желания срать в файловую систему + мне кажется что так на продах не делают лучше насру в базу
101 3101996
>>101412
>>101471
Я ж написал, что покушать принёс. Надо было вас братишками назвать, чтобы понятней было?

Там буквально пара советов иногда полезны, остальные вообще всегда вредны. Ну какие два свойства на класс? Обёртка для коллекций? Вообще поехали.
102 3102001
>>101516
Так я тебе писал, что дело в сериализации.
Напиши свою сериализацию под эту конкретную задачу, будет быстрее работать.
103 3102014
>>102001
Disregard that.
Прочитал дальнейшее сообщение.

Ну и чё ты на асп.нет наезжал, если ботлнек на клиенте? Ну и да, бинарные данные не шлют в джейсонах, только если они совсем маленькие.
Вот этот прав: >>101776
104 3102052
>>101876

>через кастомные хедеры


А потом у тебя прокся их порежет или подменит и ты долго будешь искать "а где-же мои данные?..."
105 3102060
>>102001
>>102014
Пытаешся тролить тупостю ньюфага?
Ботлнек сейчас на клиенте уже после того как я "разобрался" с асп. Перечитай ветку сообщений в которой указана проблема именно с асп.
106 3102067
>>101996

>Обёртка для коллекций?


Почему нет. Большинство коллекций итак по факту уже обертки над чем-то базовым вроде массива. Если у тебя над коллекцией постоянно применима какая-то доменная логика, либо тебе не нужен дохулион методов которые в ней есть, то вполне логично убрать её за какой-нибудь фасад.
107 3102175
>>102060
верни все назад и дерни курлом и всего делов.
108 3102223
>>102175
Я дергал постманом. Нету разницы чем дергать.
109 3102241
>>101284
Я согласен только с первыми двумя пунктами, остальное хуита уровня старая джава. Напишите охулиард классов по 10 строчек в каждом чтобы что? Прочитать два экрана кода это сложна нипанятна, а разобраться в 100500 одинаковых классов в 100500 файлах - это легко и просто.
110 3102250
>>101516
Добро пожаловать в волшебный мир майкрософт, где каждая домохозяйка может написать свой сервер.
Следующий шаг - использовать dapper, а EF выбросить нахуй.
камон контролс v6 манифест деда42 Кб, 755x529
111 3102291
Ну ладно, уговорили. Похоже, что у Авалонии действительно нет достойных альтернатив.

Я сегодня весь рабочий день занимался написанием сравнительных двух проектов под мою задачу, а задача у меня: трей-приложение, висящее в трее и открывающее формочки из своего контекстного меню, при закрытии формочек, они не выгружаются, а скрываются (т.н. "сворачивание в трей"). Я люблю такие утилиты с давних пор.

Так вот. Практика показала, что в Авалонии такое приложение написать легче, и требуется меньше бойлерплейта. В Ето.формсах приходится полностью описывать настройку трей-иконки, её включение и выключение производить вручную, иначе при закрытии приложения иконка не удаляется из трея. Исчезает при наведении мышки, как будто приложение аварийно завершилось. В Авалонии же достаточно один раз описать в богомерзком хамле трей меню, добавить бинды команд и радоваться. Удаление иконки производится автоматически лайфтаймом. Скрытие и показ - по желанию.

По саппорту тоже всё намного лучше у Авалонии, 5 сек в гугле и я выяснил, как запустить приложение в трее, без формы, и как отложенно подгрузить форму по команде. У Ето.формс с этим огромные проблемы, поскольку он юзается в основном для написания аддонов для этого ихнего рино, то вся поддержка касается исключительно этого, по любым смежным вопросам обсуждений ноль, готовых решений ноль.

Единственное, что огорчает, отсутствие нативной темы. Я понимаю, что отстал от моды и в моде опять разноцветные свистоперделки с фирменным стилем. Хорошо, я знаю, что можно сделать свистоперделочный флюент, выглядящий пиксель в пиксель одинаково на винде и в линуксе, но мне пох, дайте мне нативную тему. Кекекс, ты меня слышишь? Как на пикрелейтеде тему хочу.
112 3102368
>>102291
если бы только не шрифты и мыло мыыыло
113 3102506
>>101284
Ок. Давай разбирать.

> Use Only One Level of Indentation per Method


Хуета.
Во-первых, таким хуем у тебя просто появляются методы/функции, которые нахуй не упали, кроме как исполнить это правило.
Во-вторых, на ревью, когда правится будет в вынесеном методе - ты заебешься искать, а че же и нахуя поменялось.
В-третьих, по опыту - такой код труднее поддерживать и сопровождать.

> Don’t Use the ELSE Keyword


Хуета.
Во-первых. Очень часто - оно реально надо, без него - получаются монструозные конструкции, просто чтобы избежать.
Во-вторых. Не просто так его придумали. Было бы не нужно - выпилили бы.

> Wrap All Primitives and Strings


МЕГАХУЙНЯ.
Просто ПИЗДЕЦ КАКАЯ ХУЙНЯ.
Во-первых. Ты из-за этого чтобы ОРМ какую-нибудь подружить с этой хуйней - должен высрать киллотоны бойлерплейта, чтобы потом оказалось, что надо чет поменять - и ты высрал еще больше бойлерплейта.
Во-вторых. Тебе такое спасибо скажут те кто будут это сопровождать, что никаких денег не хватит чтобы всего зашить.
В-третьих, абстракция ради абстракции.

> Use First-Class Collections


Аналогично предыдущему пункту.

> Use Only One Dot per Line


Хороший совет, в контексте - когда не обойтись иначе.

> Don’t Abbreviate


Спорно. Во многих случаях есть аббривиатуры, типа temp, ctx и прочее, которые все понимают. Опять же, если делаете в контексте предметной области - там бывают свои сокращения, которые удобны бизнесу, и никто не помнит как оно полностью произносится.
Но в общем случае - согласен.

> Keep All Entities Small


Хуета. Особенно как там показано.
Ты потом заебешься разбираться в этой груде файликов.

> Don’t Use Classes with More Than Two Instance Variables


МАГАХУЙНЯ
Просто пиздец какая.
Даже объяснять лень.

> Don’t Use Getters or Setters


МЕГАХУЙНЯ
Просто пиздец какая.
Но тут я объясню.
Во-первых, их не просто так придумали. Миллилард случаев, когда это надо и удобно.
Во-вторых, то что предлагается взамен - это тот же геттер-сеттер, просто названый иначе. Чтобы что? Чтобы потенциального противника запутать? Чи шо? Чи зачем?

> Don’t Use Comments to Justify Bad Code


ДА! Охуенно будет посмотреть, как эта хуйня будет разбираться в коде джуна, который почитал этих советов и пошел хуярить. Посмотрю, как оно будет чет там делать в проекте, который писали деды, у которых первым языком были плюсы и они до сих пор пишут как на си. Посмотрю, как оно будет в предметной области разбираться, про которую нихуя не знает.

Короче. По большей части - какой-то сборник вредных советов. Ну или гайд, как писать много нахуй никому не всравшегося кода, который никто не сможет поддерживать.
113 3102506
>>101284
Ок. Давай разбирать.

> Use Only One Level of Indentation per Method


Хуета.
Во-первых, таким хуем у тебя просто появляются методы/функции, которые нахуй не упали, кроме как исполнить это правило.
Во-вторых, на ревью, когда правится будет в вынесеном методе - ты заебешься искать, а че же и нахуя поменялось.
В-третьих, по опыту - такой код труднее поддерживать и сопровождать.

> Don’t Use the ELSE Keyword


Хуета.
Во-первых. Очень часто - оно реально надо, без него - получаются монструозные конструкции, просто чтобы избежать.
Во-вторых. Не просто так его придумали. Было бы не нужно - выпилили бы.

> Wrap All Primitives and Strings


МЕГАХУЙНЯ.
Просто ПИЗДЕЦ КАКАЯ ХУЙНЯ.
Во-первых. Ты из-за этого чтобы ОРМ какую-нибудь подружить с этой хуйней - должен высрать киллотоны бойлерплейта, чтобы потом оказалось, что надо чет поменять - и ты высрал еще больше бойлерплейта.
Во-вторых. Тебе такое спасибо скажут те кто будут это сопровождать, что никаких денег не хватит чтобы всего зашить.
В-третьих, абстракция ради абстракции.

> Use First-Class Collections


Аналогично предыдущему пункту.

> Use Only One Dot per Line


Хороший совет, в контексте - когда не обойтись иначе.

> Don’t Abbreviate


Спорно. Во многих случаях есть аббривиатуры, типа temp, ctx и прочее, которые все понимают. Опять же, если делаете в контексте предметной области - там бывают свои сокращения, которые удобны бизнесу, и никто не помнит как оно полностью произносится.
Но в общем случае - согласен.

> Keep All Entities Small


Хуета. Особенно как там показано.
Ты потом заебешься разбираться в этой груде файликов.

> Don’t Use Classes with More Than Two Instance Variables


МАГАХУЙНЯ
Просто пиздец какая.
Даже объяснять лень.

> Don’t Use Getters or Setters


МЕГАХУЙНЯ
Просто пиздец какая.
Но тут я объясню.
Во-первых, их не просто так придумали. Миллилард случаев, когда это надо и удобно.
Во-вторых, то что предлагается взамен - это тот же геттер-сеттер, просто названый иначе. Чтобы что? Чтобы потенциального противника запутать? Чи шо? Чи зачем?

> Don’t Use Comments to Justify Bad Code


ДА! Охуенно будет посмотреть, как эта хуйня будет разбираться в коде джуна, который почитал этих советов и пошел хуярить. Посмотрю, как оно будет чет там делать в проекте, который писали деды, у которых первым языком были плюсы и они до сих пор пишут как на си. Посмотрю, как оно будет в предметной области разбираться, про которую нихуя не знает.

Короче. По большей части - какой-то сборник вредных советов. Ну или гайд, как писать много нахуй никому не всравшегося кода, который никто не сможет поддерживать.
image.png793 Кб, 770x525
114 3102520
115 3102544
>>102291
Юра?
116 3102580
>>102544
Настя??
sage 117 3102697
>>102672 (Del)
Репорт.
118 3102735
>>102520
Одновременно ностальгические и вьетнамские флешбеки.
119 3102812
Как проверить инициализирован ли элемент двумерного массива?
Хочу простым и элегантным методом узнать не выхожу ли я за рамки.

Так что б в одну строчку, как если бы IndexOf работал с многомерным массивом.

Вот например
int[,] mass = new int [2,2];
и я пикаю позицию 10,10 через какой-ниубдь встроенный метод и получаю сообщение пошёл нахуй ты куда лезешь.

что б никаких обработок исключений, или подобной хуеты.
120 3102815
>>102812
хотя тут две задачи, узнать нициализирован ли и не выхожу ли я за рамки размера массива.
121 3102827
>>102812
GetLength
image280 Кб, 512x512
122 3102838
image.png3 Кб, 109x261
123 3103704
Поцоны, почему Даппер проскипал ID во время вставки?
Делаю BulkInsert по 1к записей List Но почему то скипаются ид и не идут по порядку. Почему так? Записей столько же сколько и в файле, 9500. Тоесть записи сами не теряются, теряется порядок в присвоении ID/
124 3103756
>>103704
И так оно скипает примерно 3к, тоесть записей в бд 9500 а последний ид 12500
125 3103820
>>103756
>>103704
Или это не даппер, хуй пойми, даже если назначить ид руками и потом сделать connection.BulkInsert 1к записей, вставляет 1к записей но скипает ИД и получается последний ид 1220
126 3103844
>>103820
Может у тебя в сиквенсах какая-нибудь логика или их еще кто-нибудь дергает.
А так-то вообще обычно похуй на их порядок совершенно.
127 3103872
>>103844
Да ничего вроде нету, топу добавляю список, и скипает каждый раз в одном месте, в EF всё норм.
128 3104228
>>103704
Может код покажешь?
image.png8 Кб, 389x90
129 3104249
>>104228
Да там и кода то нет
Просто заполнение List элементами, когда их 10к добавляем в бд и очищаем список. EF вставляет нормально через AddRange.
Причём проебываеться всегда в том месте где на скрине, и если у всех записей id = 0 и если я сам делаю id +1 по порядку.
130 3104256
>>104249
Фикс, это я просто переименовал в MasterDataList, просто в закоменченой строке старое название осталось.
131 3104266
>>104249
То есть в твоем коде Dapper не знает про ключи при вставке?
132 3104283
>>104266
Ну как не знает если он нормально вставляет но проебываеться почему то в одном месте? Пребывает именно порядок присвоения ID, сущности не проебывает.
133 3104301
>>104283
Ид заполняется в бд и возращается после вставки. Кури как работает инкремент в колонке.

А вообще включи просто логи запросов
134 3104306
>>104301
Я рад за него пусть заполняется.
Вопрос почему даппер херит заполнение ид а еф не херит
qes.png10 Кб, 346x297
135 3104316
>>097760 (OP)
Парни такой вопрос.
Эксперементировал с инструкцией goto и у меня возник затуп.
На пикриле мой код который считает до ста тыщ и когда закладка Ass была после строки int a = 5, то всё было норм.
Но я сейчас переставил закладку до инициации переменной и НИХУЯ НЕ ИЗМЕНИЛОСЬ. Код всё ещё работает каким то хуем и считает до ста тыщ, хотя не должен, ибо каждый цыкл, переменная а = 5, в конце увеличивается до 6, но после goto она заново инициируется как 5. И так снова и снова. 5656565656 как блядь она до ста тыщ считает? Чё за параша?
Как это говно работает? Почему значение переменной сохраняется?
136 3104318
>>104316
Я дебил, забираю свой вопрос назад, как только запостил свой высер так сразу просёк в чём суть.
Не стать мне программистом походу, я слишком дэбилен.
137 3104321
>>104306
Ты дальше абзаца прочитать не можешь? Повторю тогда

> А вообще включи просто логи запросов

138 3104331
>>104316
Бля, сидел минут 5 пырил в твой код не мог понять что там вообще происходит.
Дийкстра был прав про goto.
139 3104333
>>104318
Ну если сам дтшёл, то в чём проблема? Ты уже программист. Только не используй goto пока не постигнешь Дао. Его можно использовать только опытным программистам, которые понимают когда он нужен.
140 3104335
>>104283

>Ну как не знает если он нормально вставляет но проебываеться почему то в одном месте? Пребывает именно порядок присвоения ID, сущности не проебывает.



Ещё раз. Почему ты решил, что порядок столбцов для Dapper'а неверный?

>>104306
Может потому что EF умеет автоматом метить поля с Id как ключи?
141 3104381

>Ещё раз. Почему ты решил, что порядок столбцов для Dapper'а неверный?


Потому что не нормально когда добавляешь 1к записей в пустую бд и ID пишется с пропусками 1 2 3....200 ХУЯК 250 251 252. В EF так не происходит, 1к записей добавляется все ID пишутся от 1 до 1000
2024-03-2822-08-56.png37 Кб, 804x353
142 3104394
Пытаюсь запустить эдж браузер и дождаться его загрузки.

- По какой-то причине дескритор окна возвращает Zero, хотя окно браузера визуально загрузилось.
- Еще process.HasExited == True
- Попытка получить новый экземпляр процесса по айди текущего Process.GetProcessById(process.Id) вызывает исключение, мол процесс не загружен.

Что не так?
143 3104402
>>104381
Ты не поверишь, но всем везде абсолютно похуй, в каком порядке вставит записи в бд. Тем более через какой-то булк инсерт, что это за хуйня вообще?
144 3104417
>>104394
Потому что стартап процесс уничтожается сразу. Хромиум ёпта
145 3104434
>>104402
Ну клиенту не похуй. Мне так то тоже похуй в каком там порядке, хоть с прыжками в 1к
146 3104439
>>101008
>>101009

> Сервис - принимает в себя Request<T1> и отдает Result<T2>


> Result - это тип, который содержит либо ответ, либо ошибку с описанием ошибки.


> Обычно T1 - это та же DTO или расширенный объект, который содержит в себе DTO + что-то что там надо(id, токен авторизации, имя пользователя и прочая хуйня, которую можно извлечь из запроса)


Получается, что это второй вариант.

Как я понимаю, при втором варианте придётся отказываться от автоматической валидации и валидировать модельку в ручную?
builder.Services.Configure<ApiBehaviorOptions>(x => x.SuppressModelStateInvalidFilter = true);

Что используешь в качестве валидации: прокидываешь ModelState или FluentValidation?
Можешь показать пример с монадой и централизованной обработкой ошибок (формирование ответа клиенту)?

> Второй вариант.



Получается как-то так:
https://pastebin.com/hiMPRSGu

Но смущает, что будет много однотипных моделек, которые будут минимально различаться. И это только одна моделька с двумя свойствами.
Как бороться с однотипным неймингом? Никак
Какой стиль именование общепринят?

>>101045

> Плюс, эксепшны - это зло. Понимаю, почему люди их используют, но у нас на ревью - тебе бы долго пришлось доказывать реальную необходимость, вместо возвращения Error'а


Что не так с исключениями? Их всё равно надо ловить и формировать ответ клиенту.
147 3104516
>>104439

>Можешь показать пример с монадой и централизованной обработкой ошибок (формирование ответа клиенту)?



У меня это что-то в духе:

Task<Response> Foo(SomeDTO requestData) {

// упрощенно, в реальности, там екстеншн, который все мапит как надо
return service.Handle(new Request(requestData, User.GetUserData()))
.Match(
success => Ok(success.Payload),
error => CreateFancyErrorResponse(error);
)};

Эксепшины, как я сказал - я не кидаю. Иногда - ловлю. Сам я возвращаю Error.

В коде сервиса это выглядит так:

// упрощенно
public Result<Some> Handle(Request<Some> request){

try{
var result = DoSomeBuisnesLogic(request);
return result;
}
catch{}
return new Error();
}

Почему так? Потому что так удобнее.

Про валидацию - та что нужна в качестве проверки валидности JSON'чика/XML'ки - происходит на уровне мидлварей. Ну, там, что не null, что вместо числа не прислали строку.
Та что нужна на уровне бизнеса - с помощью валидатора вида:

Rulleset<User>
.For(x=>x.Name)
.Min(2)
.Max(128)
,For(x=>x.Email)
.IsEmail()
.For(x=>x.Age)
.Min(21)
.Create();

"Эта хуйня биндится либо к модели вцелом, либо к эндпоинту и так же при валидации возвращает ошибку валидации.
147 3104516
>>104439

>Можешь показать пример с монадой и централизованной обработкой ошибок (формирование ответа клиенту)?



У меня это что-то в духе:

Task<Response> Foo(SomeDTO requestData) {

// упрощенно, в реальности, там екстеншн, который все мапит как надо
return service.Handle(new Request(requestData, User.GetUserData()))
.Match(
success => Ok(success.Payload),
error => CreateFancyErrorResponse(error);
)};

Эксепшины, как я сказал - я не кидаю. Иногда - ловлю. Сам я возвращаю Error.

В коде сервиса это выглядит так:

// упрощенно
public Result<Some> Handle(Request<Some> request){

try{
var result = DoSomeBuisnesLogic(request);
return result;
}
catch{}
return new Error();
}

Почему так? Потому что так удобнее.

Про валидацию - та что нужна в качестве проверки валидности JSON'чика/XML'ки - происходит на уровне мидлварей. Ну, там, что не null, что вместо числа не прислали строку.
Та что нужна на уровне бизнеса - с помощью валидатора вида:

Rulleset<User>
.For(x=>x.Name)
.Min(2)
.Max(128)
,For(x=>x.Email)
.IsEmail()
.For(x=>x.Age)
.Min(21)
.Create();

"Эта хуйня биндится либо к модели вцелом, либо к эндпоинту и так же при валидации возвращает ошибку валидации.
148 3104527
>>104516
У тебя фп головного мозга.
149 3104561
пердиславы, ответьте чо думаете плс

Я раньше думал, что операторы типа && работают так:
если выражение слева неверное, то выражение справа даже проверять не будет.

Разве не так всегда было? А у меня и выражение слева и выражение справа выполняется, хотя выражение слева неверное..

например
if( 2 < 1 && 2 < 3)

разве после проверки выражения слева не должно пойти выполнение в элсе?
150 3104570
код на самом деле другой

if( x < massive.GetLength && massive.GetLength[x] !=0 )

и я получаю мессагу, что вышел за пределы, хотя выражение слева и должно было бы проверить это сука. Схуяли выражение справа всё равно выполняется?
151 3104640
>>104570

>massive.GetLength[x]


GetLength[x] шо это лол?
152 3104658
>>104434
Так сделай Id - ключом. В чём проблема?
153 3104667
>>104561
Как я понял, такие выражения рассчитываются при компиляции.
154 3104742
>>104570
Братиш у тебя слева метод не вызывается. Он без скобочек.
155 3104747
>>104742
самый умный да?
156 3104762
Почему шарподегенераты такие тупые? Насрали нам в тред про то, что у нас нет библиотек для ссш, а оказалось что на самом деле на джаве в 8 раз больше чем на шарпокале. Это же классика уже, теорема шарпана, но заёбывающая правда.
157 3104776
>>104762
нахуй ты сюда ныть пришёл?
158 3104909
>>104658
>>104658
id и так первичный ключ.
159 3104926
>>104909
Где ты это указал, когда делаешь BulkInsert?
160 3104947
>>104926
Нигде не указывал, думал что как и EF даппер сам поймёт по имени Id
161 3105085
>>104570
Если допустить, что ты не троллишь тупостью и сам себя не объебываешь (например у тебя в реале там просто &, а не &&),
то чтобы понять где косяк, раздели для отладки выражение на два (через два if-а например) и посмотри реально ли они там у тебя выполняются так как ты хочешь. Судя по виду у тебя там какие-то кастомные методы и вполне может быть что выражение x < massive.GetLength выдает тебе true, когда ты ожидаешь false, просто потому что ты где-то в .GetLength объебался.
162 3105126
>>104947
Надо просто id не интами делать, а гуидами.
163 3105209
>>105126

>гуидами


>bulk insert


Тонко.
164 3105836
>>104762
Нахуя тебе 8 разных либ под одну задачу?
165 3106282
Кто-нибудь может нормальным человеческим русским языком объяснить, зачем нужен SearchValues<T> (который может только узнать bool Contains(T)), когда есть зрелый надежный через многое прошедший HashSet<T>, и который может всё то же самое, и даже больше?
166 3106333
>>106282
Зачем нужен интернет эксплорер вместо браузера? Зачем нужен team foundaton вместо гита? Индусы имитируют бурную деятельность you know, чтобы их не разогнали к хуям.
Ни один человек в мире не пишет хай перфоманс вычисления на дотнете, это база. Можно сколько угодно выебываться экономией в 20 наносекунд на манятестах, но в реальности приходит сборщик мусора и наступает пиздец. В реальном коде на сишарпе даже Dictionary используется примерно никогда, в 99.99999% случаев достаточно обычного List.
167 3106335
>>106333

>В реальном коде на сишарпе даже Dictionary используется примерно никогда


Ты скозал.
168 3106345
>>106335
Когда ты найдешь свою первую работу, убедишься сам. Задачки с литкода - это не программирование за деньги.
169 3106380
>>106282
Дебилы, блять, нихуя не читают:

>instances are optimized for situations where the same set of values is frequently used for searching


>used for


Ты должен использовать SearchValues<T> в методах MemoryExtensions:
https://learn.microsoft.com/en-us/dotnet/api/system.memoryextensions?view=net-8.0
https://devblogs.microsoft.com/dotnet/performance-improvements-in-net-8/#searchvalues
170 3106476
>>106380
Джуник, спок. Чем эта новая хуита отличается от хэшсета? В каких задачах ты будешь использовать эту хуиту? Кто вообще, блять, пишет числодробилки на дотнете, покажите этого ебанутого.

Алсо

>ссылки на официальную пропаганду от микрософт


Дурачок ты у мамы.
171 3106485
>>106476

>пишет числодробилки на дотнете


во первых, это поиск в строке
во вторых ты, дурачок мамковый, часто САМ пишешь реализацию поиска в строке руками? Иначе куда твой хешсет присунуть?
ну если да, то жаль тебя, очень жаль.
172 3106494
>>106485
Поридж, поиск в строке в дотнете написан еще до твоего рождения. Речь о том, что вся эта тема со спанами и SearchValues нахуй не нужна на практике. Это классическая имитация бурной деятельности.
173 3106500
>>106494
ТЕБЕ не нужна, ОХОТНО ВЕРЮ
по тебе прямо видно.
нормальным людям вполне себе нужна
И поиск конечно написан, что его там искать. Например твой тупой поиск через HashSet. Но если бы ты немного бы был умнее, то знал, что часто можно улучшить и то что "вроде бы быстрое"

Для НЕУЧЕЙ поясню что вот есть утебя допустим база данных. Она быстрая конечно, но все равно весьма долгая. И УМНЫЕ люди (но не ты конечно) могут влепить перед ней фильтр блума, который в сотни раз быстрее

Так вот даже твой быстрый HashSet все равно медленнее битового фильтра блума - раз. Более того, можно посмотреть что все значения они ASCII и тогда переключиться на другой алгоритм сравнения.

Но тебе не нужно, ты и не юзай. Оставайся формошлепом. А эти вещи для тех, кто знает зачем оно им.
174 3106512
>>106500
Проиграл в голос.
175 3106517
>>106345
Та хуй знает. Конкретно с дикшинари - он же просто удобнее в куче случаев.
Ну, допустим, у тебя есть список сессий активных. У сессий - айди.
Тебе удобнее будет просто _sessions[id] и чет сделать, чем каждый раз как дебил искать ее в листе.
Вопрос не в перформансе а тупо в удобстве.
176 3106520
>>106494
>>106476
>>106333

>Ни один человек в мире не пишет хай перфоманс


>Кто вообще, блять, пишет числодробилки на дотнете


>имитация бурной деятельности


Что за форс обиженного на шарпы? Нормальный код на шарпе насколько медленнее с++? На 2-15% в зависимости от задачи.
В нормальном перформансном коде на шарпе GC вызывается от 0 до 2 раз за всё время выполнения. А у криворуких конечно GC будет запотевшим и замотанным.
Спаны, натив мемори, интринсики, мемори-буферы, векторые операции, ансейф касты и прочие красоты позволяют эффективно писать быстрый красивый код на шарпе, а не код-урод на мерзких плюсах.
177 3106523
>>106520
По моему в бафферс пакете ещё и avx прямо юзают
178 3106525
>>106520

> В нормальном перформансном коде на шарпе GC вызывается от 0 до 2 раз за всё время выполнения


Кестрел, я так понимаю - не нормальный и не перформанс?
Потому что если попробовать на нем стресстест с эхо-хенделром 10к+ соединений и мгновенных отключений - ГЦ нехерово так ебется.
Или шо?
179 3106530
>>106525

>Кестрел на 10к+ соединений


Какая связь с числодробилками?
180 3106538
Как в C# работать с указателями?
Вот на C объявляем указатель, выделяем память, присваиваем зачение, инкрементируем на + 1, выделяем память, присваиваем значение, и вот у нас уже массив динамический получился, с помощью free можем его освободить.

Может кто пример на C# такой же привести?
181 3106542
>>106538
Дрочи указатели и память в unsafe секциях вот только за такое обоссать могут
182 3106544
>>106538
C# под unsafe является надмножеством языка С.
183 3106545
>>106538
Ну и где ты тут увидел динамический массив при аллокации определённого размера памяти я не понял
184 3106548
>>106517
Во-первых, сессии лежат в редисе.
Во-вторых, пишешь FirstOrDefault и все работает.
В-третьих, enjoy your KeyNotFoundException.
185 3106551
>>106538
var x = new List<int>();
С указателями в шарпе не работают.
186 3106552
>>106538
Если уж нужно опускаться до заката солнца вручную, то в шарпе основная рыба обитает в районе классов MemoryMarshal, Native, Unsafe
прежде чем переходить к реальному unsafe
187 3106556
>>106545
Под динамическим массивом имел ввиду динамическое выделение памяти. То есть массив с нефиксированной длинной.
188 3106560
>>106525
У тебя неправильные тесты. Надо писать правильные, где раньше какой-то абстранктый кусочек кода выполнялся за 20 наносекунд, а с новой фичей за 10 наносекунд, двухкратный прирост прозводительности!!!11
189 3106561
>>106556
И всё равно ты выделяешь сразу кусок памяти который уже потом заполняешь или нет. Это сорт оф лист только лист ещё и имеет функциональность на случай если выделенный размер кончился
190 3106562
>>106556
В сишарпе это List<T>
191 3106573
>>106562
ему видимо нужен буфер динамической длины без копирования при расширении

>>106556
типа создали мы буфер 100 байт и работаем с ним через Memory/Span потом выделили еще 100 байт (причем сразу после первых 100) и создали новый Memory/Span на эти 200 байт?
192 3106582
>>106562
>>106561
Да, указателями пользоваться в C# смысла нет. Но по заданию нужно. Не получается такое же поведение сделать как в C/C++, или, скорее всего, я просто не догоняю.

>>106573
Получается да. Мне нужна возможность иметь массив с неограниченной длиной с помощью указателей.
193 3106585
>>106573
Таких буферов не существует. Ты никак не сможешь гарантировать, что после первых 100 байт будет место для следующих 100 байт. У или все данные лежат рядом, но требуют копирования при увеличении размера контейнера как в листе, или данные лежат в блоках, как в хештаблице.
194 3106588
>>106585
Как вариант можно хранить в начале блока его размер и ссылку на следующий, но это уже будет нихуя не массив с константным доступом
195 3106593
>>106588
Будет О(1): ты сначал берешь остаток от деления индекса на размер блока, а потом этот остаток используешь как индекс в блоке. Задачка уровня easy на литкоде. Другой вопрос - зачем тебе такой контейнер?
196 3106596
>>106593
1. Мне не нужен
2. Предполагал что блоки могут быть разной длинны
197 3106600
>>106596
Для таких хитровыебаных контейнеров надо открывать справочник по алгоритмам и смотреть варианты.
198 3106602
>>106582
почему с помощью указателей? я бы понял если бы хотелось иметь унифицированный доступ к буфферу или chunkedbuffer

типа есть вот как MemoryStream, а есть ChunkedMemoryStream с тем же апи (который конечно же мелкие сделали internal, а наружу выдали другую реализацию брр)
или вот для спанов есть ReadOnlySequence, но это же просто враппер.

передать куда то где ждут указатель? но тут извините.
199 3106684
>>106552

>MemoryMarshal, Native, Unsafe


>прежде чем переходить к реальному unsafe


А что ты подразумеваешь под "реальным unsafe"? Keyword (указатели и другая мелочёвка)? Просто перечисленные API также небезопасны.
200 3106691
Аноны, я ошибся в представлении памяти и указателей когда попросил помощи, сорри. Задачу по-другому реализую.
201 3106696
>>106684
небезопасен только Unsafe.
А реальный ансейф это когда ты *void во все поля без оберток более высокого уровня типа того же Unsafe
202 3106751
>>106696

>А реальный ансейф это когда ты *void во все поля без оберток более высокого уровня типа того же Unsafe


Понял

>небезопасен только Unsafe.


Ну например, MemoryMarshal.CreateSpan() позволяет создать спан с отрицательной длинной, что может привести к неожиданным результатам, т.к. JIT считает что Length неотрицателен (у спанов, строк и массивов):
https://sharplab.io/#v2:EYLgxg9gTgpgtADwGwBYA0AXEUCuA7AHwAEAmARgFgAoIgBgAIiyA6AJXwwEsBbGZgSTwYYUCAAcAyiIBunMDADOAbmrUiKegFkAFKxgBDACYB5PABsAnhLH68AHk5CAfPX0BKagG9q9X4zIAnNoAJABEnvrMADIweADmGAAWAL4A9BoAvPQR0bEJifSp9CjJoW4qVMnUekamlta2Ds6u9FkA2vRkaPQk3QDM3RoAuhU67qPamjDc0Baa+lAKifpmzADCsPrCDXjasABmWtOz84vLqwDiMBh6+yKx8tru3XAobuVAA==

Ну и что сами разрабы дотнета думают:
https://github.com/dotnet/csharplang/discussions/6304

>Expose a concept of "unsafe callers only"


>The .NET Libraries would then be able to utilize this functionality on APIs such as System.Runtime.CompilerServices.Unsafe, System.Runtime.InteropServices.CollectionsMarshal, System.Runtime.InteropServices.MemoryMarshal, and System.Runtime.InteropServices.Marshal (subject to API review and approval).


И другие ссылки:
Enumerating type safety guarantees in MemoryMarshal and friends
https://github.com/dotnet/runtime/issues/41418
Add [CallerMustBeUnsafe] attribute to denote APIs which should be called in an unsafe block
https://github.com/dotnet/runtime/issues/31354
203 3106760
>>106751
и ещё (один из разрабов):
https://www.reddit.com/r/csharp/comments/tqit91/comment/i2i8utl/

>Likewise, you don't always have to use the unsafe keyword to be doing something unsafe.


>Many of the APIs under System.Runtime.CompilerServices and System.Runtime.InteropServices are likewise "unsafe" and can easily cause undefined behavior, crashes, etc.


>The same goes for various other APIs scattered throughout the BCL, although we generally try to put Unsafe or another common "unsafe" related word (like Marshal) in the name.

204 3106929
Учу сейчас дотнет для работы, и вот не могу понять. Под какой осью лучше работать? Вроде всё есть и на линуксе, на котором щас сижу, но а вдруг в винде есть особенные фичи, которые я упускаю и не буду знать об этом? Что скажете? Кто под какой системой работает?
205 3106943
>>106929
Под линью нет студии и wpf
206 3106945
>>106943
О кстати ещё один вопрос, райдер или студия?
207 3106947
>>106945
Если студия без решарпера то райдер, если с решарпером то студия.
Имхо естественно
208 3106964
>>106929
Я кодирую в вс-коде на венде, но периодически сношу венду и перехожу на линукс и там продолжаю в том же коде, он в линуксе называется oss-code.

> дотнет для работы


Где на галере скажут кодить - там и будешь кодить.
209 3106968
>>106964

>Где на галере скажут кодить - там и будешь кодить.


Говорят где хочешь. Да и не в том положении чтобы диктовать мне где кодить.
210 3106970
>>106968
Не знаю, тут выше фанат решарпера неоднократно говорил, что без решарпееровского функционала невозможно успешно грести на галере. Я-то индюк, я не знаю.
211 3106976
>>106970
Я не тот адепт но в студии без него реально душно
212 3106984
>>106970
>>106976
Решарпер не проблема, барин уплотит. Значит всё таки шинда говорите. Ну, вроде докер есть, а чё ещё надо...
213 3106989
>>106976

> в студии без него реально душно


На примерах можешь показать?
214 3106998
>>106984
До прихода всл я миксовал дебиан и винду, когда добавился сабж (а далее всл2) то на рабочей станции только винда стоит. С линью всё прекрасно пока её не пытаешься использовать как ос для пк.

>>106989
С ходу бросается в глазах расширенный рефакторинг и анализ всего солюшена, из не самого очевидного это тест раннер, оптимизация сборки, снипеты, интелисенс, дебаг тайм плюшки.
Если бы в идее был интерфейс студии то я бы не мучая себя пересел
215 3107168
>>106945
Похуй, только учитывай, что VS по факту стандарт (просто потому, что чисто статистически он у большего числа разрабов) и твой код должен собираться именно в студии без всяких плясок с бубуном. Я не раз попадал в ситуацию, когда мне скидывали код который "Бля буду - у меня в райдере все билдится и запускается", в VS при открытии расцветал красным из-за того, что там что-то не так слинковано было или какие-либо анализаторы не подключены или еще из-за какой-то хрени.
1711826274759.png44 Кб, 891x463
216 3107195
Сап шарпач!
Как же я ненавижу вереницы if - else if!
Как же хорошо, что в шарпе завезли свич-выражения с паттерн-матчингом. Вот, взгляните. Можно ли сделать ещё короче?
217 3107318
>>107195
Да. Можно сделать факторию и в одну строчку написать.
218 3107331
>>105836
Возможность выбора. Но суть не в этом. Суть в том, что вы сами насрали в наш тред про то, что либ мало, а оказалось, что в 8 раз больше.
219 3107343
Как на шарпе намутить отмену задачи, но не по таймауту, а по долгой неактивности?
Допустим, у меня какая-то долгая таска. Она состоит из подтасок.
И я хочу иметь возможность отменить все это дело целиком, если что-то в течении какого-то времени не дергалось.

На текущий момент, я делаю во всех подтасках дерганье метода специального, типа: сказать, что я еще живой. И в отдельном треде - в цикле проверяю, когда дергалось последний раз, если больше нужного мне таймаута - клацаю CancellationTokenSource.
Но это же выглядит как хуйня страшная. А как нормально сделать - я чет не придумал.
220 3107345
>>107343
Задача в принципе звучит как залупа. Таска запустилась, выполнила свою часть работы, вернула результат
221 3107353
>>107345

И че мне делать, если таска "зависла"? Ждать вечно? Хуйня. Если по таймауту просто грохать - тоже хуйня, потому что это может быть таска, которая просто ДОЛГО выполняется, но если таки ДОЛГО подождать - она выполнится.
Нужен механизм, который наверх подаст сигнал: я еще живой, не убивай меня. А если не подаст - сверху грохнуть.
222 3107364
>>107353
Ну вот пускай она сама и менеджит что делает и выжидает таймауты. Ты же когда делаешь условный запрос на апиху не дежуришь рядом поглядывая "а не висит ли запрос N секунд. О, не поставлен флажок уже 5 сек, пора прибивать", а просто пишешь эвэйт и ждёшь результат или исключение (в т.ч. таймаут)
223 3107380
>>107353
У Task есть поле Status. Просто запрашивай его.
224 3107386
>>107364
>>107380

Смотри.
У меня есть устройства, доступные по УДП.
Есть задачи их опросить.
Бывает, иногда, что запрос - теряется. Но сверху - я не могу это понять. Со стороны таски - все нормально, она послала запрос - ждет ответ. Ответ может прилететь, а может не прилететь, а может прилетать частями. Код который обрабатывает ожидание ответа - я не контролирую, я только могу сверху передать CancellationToken, чтобы отменить все разом. Но когда что-то прилетает - триггерится эвент: received.
Так вот. Если запрос теряется - задача - будет висеть вечно. Если запрос - прилетает частями - а я буду убивать по таймауту, я потеряю то, что возможно таки собралось бы в нормальный ответ.

Меня просто смущает, что решение нихуя не элегантное и красивое. Я хотел бы что-то типа совмещения CancellationTokenSource с таймаутом и автоматического сброса таймаута по событию. Типа другой тип токена, который так же как обычный CancellationTokenSource но можно было бы подписаться на событие и сбрасывать таймер ожидания.
225 3107390
>>107386
Не тупи. Ты в MainTask() вызываешь MakeUdpRequest(ct) внутри которого
var timeout = 30sec;
var rCt = creating linked cts with ct+timeout
await SendRequest(rCt);
await GetResponse(rCt);

Если почему то методы отправки и получения не могут в отмену то просто кастуешь await WhenAny(ReceiveTask, TimeoutTask)
226 3107393
>>107390
Срсли. Если бы все было так просто - то я бы не спрашивал.

У меня есть сторонняя библиотека.
Дальше, дергается вот так:
device.Init();
device.Receive += onRecieve;
device.Send += onSend;
await device.Start(ct);
await device.ReadData(dataArray, ct);

И вот это вот ReadData - может зависнуть. Эту библиотеку я не контролирую, при этом не могу использовать другую, потому что других под работу с этими устройствами - нету.

Вот идеальным было бы решение в духе:
device.Receive += (s, e) => ct.ResetTimout();
device.Send += (s,e) => ct.ResetTimout();

Но как так сделать - я не знаю. CancellationTokenSource только либо отменяться умеет, либо принять таймаут и отмениться по нему.

Потому - я и нагородил вот эту вот фигню с циклом и если долго ни пришло и не отправилось - отменяю в этом цикле. А хотелось бы как-то красивше.
227 3107398
>>107393
Почему ты не хочешь отменять ReadData по таймауту? Если метод не выполнился за 30 значит завис и отменится по комбиненому токену.

While not cancelled
Await ReadData(ct with 30sec timeout)
Done
228 3107401
>>107393

> device.Receive += (s, e) => ct.ResetTimout();


> device.Send += (s,e) => ct.ResetTimout();


Не разделяю метод но под него можно написать класс внутри которого в цикле будет task.delay после завершения делея без cancelledEx будет отменён токен который ты везде передаешь и выход из цикла, а ResetWatchdog будет дёргать отмену task.delay тем самым не давая дойти до шага отмены твоего основного токена
229 3107417
>>107393
таймеры никто не запрещал. Все просто же.
230 3107452
>>107393
что то типа такого
https://pastebin.com/GAhnAtxP
доведи до ума и все
231 3107567
>>107386
Проблема твоего кода, то что ты из таски пытаешься сделать что-то другое.
Task просто выполняет метод до конца. Всё. Логика работы метода - это не задача тасок.
image.png167 Кб, 1776x726
232 3107667
Кто-нибудь пользовался UnsafeAccessorAttribute для быстрого доступа к приватным данным без рефлексии?
Пытаюсь получить приватное поле у класса с дженериком, но даже просто копипаста кода из примера с learn.microsoft.com не работает.
Притом что без дженериков все примеры работают.
А вот вызов метода выделенного на пикриле всегда вызывает BadImageFormatException. Даже полная копипаста примера майков вызывает исключение.
Версия дот.нет - 8, студия последняя.
233 3107694
234 3108191
>>107318
можно: все имена переменных однобуквенными сделай и удали все пробелы и отступы, чтоб все увидели, что ты сеньор девелопер
235 3108460
Есть ресурсы где можно надрочить асинхронность и многопоточность?
Работа такая донная что там это не используется от слова совсем, но на собесах постоянно спрашивают
237 3108689
>>108191
Воу-воу, сеньоры наоборот пишут многобуквенные имена, чтобы все вокруг видели, как они высоки:

> ISeniorDeveloperDerivedInterface<IWeryMuchSmart> SeniorDeveloperFactoryObjectInstance


И комменты, тысячи их, а то ж юзеры тупые, не поймут, что до инициализации фреймворка, ничего не заработает.
И непременно лямбдами изъебнись. А то не примут в сеньоры.
238 3108715
>>108689

>И непременно лямбдами изъебнись.


Ты смеешься но после "изъебывания лямбдами" смотреть на обычный мартышечный код неприятно, не то что работать с ним.
239 3108731
>>108715
Двачую, я вот на ревью как престарелый дев думал зачем создавать лямбду прямо по среди функции и тут же вызывать ее в этом же скоупе, это ведь то что обычные функции делают? А оказалось это не модно уже.
240 3109060

>.NET Plus


>Компания сообщила, что запустит подписку .NET Plus для поддержки контрибьюторов и экосистемы .NET.



>Отключение текстовой рекламы в output при сборке проекта компилятором (без подписки возможен показ при сборке в режиме Debug)



>NFT - каждому подписчику будет доступна для минта SouldBound NFT в сети Ethereum. Коллекция будет посвящена новой вехе развития .NET и будет выпущена в ограниченном количестве. Известно, что владельцам NFT будут доступны некоторые привилегии, например, пожизненная скидка на подписку на продукты экосистемы .NET.



.NET - скам, теперь официально
241 3109064
>>109060
Чулочки в комплекте?
242 3109070
>>109060
И тебя с 1 апреля.
243 3109107
>>108731

> зачем создавать лямбду прямо по среди функции и тут же вызывать ее в этом же скоупе


Я надеюсь, мне только показалось, или ты действительно считаешь лямбдой всё, что содержит в себе символы => ?
Так вот, если мне не показалось, то нет, не всё со стрелочкой это лямбда в шарпе. Иногда это просто элемент синтаксиса, как в паттерн-матчинге на пикче выше.
244 3109156
>>109107
Не, код на пикче страшнее смерти конечно, но речь не о нем, я говорил об абстракном изъебывании лямбдами
245 3109200
>>104516

Чуток с опозданием, но всё же.

> Эксепшины, как я сказал - я не кидаю. Иногда - ловлю. Сам я возвращаю Error.


А какой смысл кидать "чистые" эксепшены?
У меня сейчас домен/сервис кидает эксепшен, но в фильтре его ловлю и возвращаю ErrorViewModel.
Какую библиотеку для фп используешь?
image.png22 Кб, 865x349
246 3109215
>>109070
>>109060
В том году вот на эту хуйню повёлся.
Думал мол Епта че за хуйня бля, как так то нахуй? Вы еще вот так просто сделайте ("Mike", 32) что бы вообще хуй разобрать было что это и зачем
247 3109239
>>109215
Tulpe<Span, int>
248 3109263
>>109239
А разве не анонимный класс?
249 3109266
>>109263
Полей нет.
250 3109267
>>109266
Точно. Но и кортеж не получается. Выдаёт ошибку.
251 3109754
У меня есть лист с объектами. Эти объекты я засовываю в несколько таблиц по разным параметрам объекта. По факту, один объект может быть одновременно лежать в нескольких таблицах. При всём при этом, я хочу, например, чтобы какое-то поле объекта в разных таблицах имело разные значение. Скажем, в одной таблице поле age у этого объекта равно 21, а в другой 25, но если я изменяю значение в поле объекта, то оно меняется во всех таблицах, так как по-сути ссылки указывают на один объект. Я правильно понимаю, что единственный способ это создать копии объектов для каждой отдельной таблицы и изменять их поля отдельной для каждой таблицы? Других вариантов нет?
252 3109790
>>109754

> Других вариантов нет?


Есть.
Изменения в таблицу вносишь специальным методом базы данных (коммит). Пока изменения не внесены, в таблице данные измененные. Но когда коммитишь, они обновляются. Везде. Кроте тех таблиц, которые сами в состоянии редактирования.

Если же ты хочешь хранить две версии данных, то да, ты всё правильно понял. Одна тадлица - один набор данных. Хочешь другой? Делай другую таблицу.
253 3109950
>>109754

>По факту, один объект может быть одновременно лежать в нескольких таблицах. При всём при этом, я хочу, например, чтобы какое-то поле объекта в разных таблицах имело разные значение. Скажем, в одной таблице поле age у этого объекта равно 21, а в другой 25


Звучит как какой-то архитектурный пиздец.
234234234.png113 Кб, 935x753
254 3110218
Здарова, у меня вопрос к знатокам.
На пикриле код моей слот-машины и при написании этой параши у меня возникли два вопроса:

Первый вопрос. Я хотел использовать try - catch обработку исключений при вводе ставки, дабы пользователь не мог ввести текст, отрицательное число или ещё какое говно, но в таком случае переменная ставки становится локальной для этого {трайкэтч блока ебанного} и я не могу использовать её дальше.
Как ещё можно запретить пользователю вводить всякую хуйню которая не должна быть введена?
Я там чуть дальше проверил введено ли GO, но там текст который должен быть введён заранее известен, так что там это можно было перехватить вручную.

Второй вопрос.
Как теоретически можно было написать эту программу без goto?
Мне аноны выше уже пояснили и я в интернете посмотрел, что если goto используешь то ты лох ебанный. А по мне так охуенная команда, чем её заменить в данном случае вообще не ебу. Видимо я лох ебанный.
Сорян за тупизм если чё.
255 3110227
>>110218
Какие забавные деды из замшелого прошлого к нам в тред залетают.

> Первый вопрос.


Иди нахуй.

> Второй вопрос.


Иди иди, не оглядывайся.
256 3110231
>>110218
try - catch только для непредвиденных исключений.
Проверка ввода делается в if если ввёл хуйню пишем что ввёл хуйню и просим ввести еще раз.
Если у тебя конструкция if else превращается в if else else if то нужно использовать switch

ну и goto у тебя тут для возврата к началу игру, это делается через while
257 3110232
>>110218
Ах да, ещё вопрос.
Почему мне не позволяют написать if (slot0 & slot1 == slot2)? Всё же логично: если А и Б равны В, то делается то то. В чём проблема?
Ошибочник говорит int в bool не удаётся ему преобразовать, схуяли ёпта? Чё он вообще имеет ввиду?
258 3110243
>>110232

> если А и Б равны В


> if (slot0 & slot1 == slot2)


Удивительно, что у тебя с таким подходом вобще не всё красное.
& - это оператор побитового умножения
С учётом приоритета операций получается
if (slot0 & (slot1 == slot2))
slot0 - int
slot1 == slot2 - bool
Получается хуйня.
То, что тебе надо, это if (slot0 == slot2 && slot1 == slot2)
259 3110246
>>110218

>Как ещё можно запретить пользователю вводить всякую хуйню которая не должна быть введена?


Можно использовать TryParse и сделать ставку uint
Можно читать посимвольно и не давать вводить ничего кроме циферок
Можно вынести в метод, и внутри метода try-catch, а результат уже возвращать из него
Вариантов много.

> Как теоретически можно было написать эту программу без goto?


Ну, я бы как на прикриплейд...
Но мне и твой вариант норм на самом деле.
260 3110247
>>110246
Да, проверку что деняк на ставку не хватает - забыл.
261 3110271
>>110231
Пасиба за пояснения.

>>110243
Пасиба за пояснения, я на удивление понял что ты написал. В учебнике по которому я эту парашу изучаю был приведён список приоритета операторов, но я подумал что автор в залупу лезет и это не особо важно. Мол, как в математике 4 класса, сначала всё что в скобках, потом умножение/деление, потом +-, мне этого хватит, чё там сложного, а хуй там.
Написал себе на листочек приоритеты и наклеил на стол чтобы всегда были перед глазами.

>>110246
Пасиба за пояснения. Проверку денег на ставку я и в своей проге забыл, так что всё норм.
234234234.png100 Кб, 966x709
262 3110282
>>110271
Всё пофиксил по вашим советам, дружба с goto всё, теперь while мой лучший друг.
263 3110284
>>110282
Прикольно. Малаца.
264 3110295
>>110282
Запомни как ты сделал.
Когда дойдёшь до изучения классов то переделай это всё на классах.
image.png27 Кб, 558x211
265 3110314
>>110218

>Как ещё можно запретить пользователю вводить всякую хуйню которая не должна быть введена?

266 3110317
>>110271

>Пасиба за пояснения, я на удивление понял что ты написал. В учебнике по которому я эту парашу изучаю был приведён список приоритета операторов, но я подумал что автор в залупу лезет и это не особо важно. Мол, как в математике 4 класса, сначала всё что в скобках, потом умножение/деление, потом +-, мне этого хватит, чё там сложного, а хуй там.


>Написал себе на листочек приоритеты и наклеил на стол чтобы всегда были перед глазами.


Вот это правильный подход. Люблю таких ребят которые не ноют в стиле "анон посоветуй гайдов как изучить язык", а с ноги влетают, начинают делать что-то сами и разбираются по ходу.
267 3110401
>>110271
нормальные люди ставят скобки, а не выделываются.
268 3110442
>>110314
Че за is?
269 3110453
>>110442
Забыл его убрать (хотя и с ним работать будет)
271 3110527
>>110314
На первый взгляд выглядит нормально, но когда попытаешься сделать сделать что-то более крутое, у тебя будет цикл, вложенный 10 раз.
По хорошему оно делается через state machine.
272 3110560
>>110527
Ты че такой душный. Чел только учится, ему хотя бы понять как TryParse работает, а ты уже про стейт машину задвигаешь.
273 3110648
>>106517

>Конкретно с дикшинари - он же просто удобнее в куче случаев.


У него KeyValuePair ридонли, что вечно ставит палки в колеса.
274 3111088
>>106345
Нет никакой связи. Про словарь ты пишешь чушь. Это один из базовых элементов и используется немногим реже чеиюм лист
275 3111159
Двачую всех, кто высказался выше против словаря. ИМХО гораздо выгоднее описать свою структуру с нужными полями и завести

> new List<MyStruct>()


Чем ебаться со словарём. Это какой-то пережиток прошлого. Да, когда-то словари были крутой инновационной идеей

> сматрити, у меня есть ассоциативный массив, в котором вместо индексов свой тип данных!


> > охуеть! крута!


Но время их прошло.
1712175568268.png66 Кб, 1014x772
276 3111163
Сап, шарпач!
Посоветуй хороший годный редактор ХМЛ файлов?
А я пока что посоветую пикрелейтед. Недавно нашёл и доволен.
277 3111274
Объясните концепцию ActualWidth в WPF.

Этот параметр ридонли, но кто имеет право его менять и как меняет? Я хочу себе подобное реализовать, чтобы пользователь имел доступ к Width, а если значение double.NaN, то родительский элемент меняет ActualWidth.

Или может быть дочерний элемент подписывается на события родителя и сам меняет ActualWidth? Непонятно. По идее ридонли нельзя менять снаружи или есть какие-то трюки?
278 3111281
>>111163
это что такое?

>microsoft.github.io


есть

>github.com/microsoft

2024-04-0402-51-37.png20 Кб, 645x423
279 3111293
>>111163
Тут нет подсказок, никакой новой информации. Мне кажется, что стандартный редактор вижуал студии куда интереснее.
Как вообще с этим работать когда у тебя есть биндинги? Не показывает какой цвет указан и не дает его отредактировать в колорпикере. Не показывает какие вообще есть доступные свойства и значения у класса. Нет подсветки ключевых слов.

Я так понял ты его установил потому что сложно читать в обычном виде? На самом деле быстро привыкаешь. И не стоит обращать на форматирование в том же MDSN - оно уебанское и нечитаемое.

Знаю что есть дополнение, которое позволяет сортировать порядок свойств в xaml. К примеру, чтобы свойство Name всегда шло первым. Это позволяет не рыскать каждый раз глазами в поисках нужного свойства. Можно вроде настраивать какие свойства переводить на следующую строку.
280 3111322
>>111159
Ты совсем тупой что ли?
Словарь - это когда тебе элемент надо находить за O(1), а не O(n).
Пишут блять свои листы, а потом запрос несколько минут обрабатывается вместо 500 мс.
281 3111340
>>111159
А потом у таких как ты программы жрут ресурсы и работают медленно.

Когда ты вызываешь list.FirstOrDefault(x=> myStruct.Id == id), то программа тупо проходит по всему списку, пока условие не совпадет, хоть до конца списка. А если список огромный?
282 3111405
>>111159
Словари индексируются и его использование это требование по оптимизации к конкретной задаче.
283 3111439
>>111340
И поэтому, кстати есть FirstOrDefaultAsync()
284 3111447
>>111439
Это вообще из мира iqueryable
286 3111622
>>111602
Бенчмарк спорный. Т.к. там по факту используется статика ничего относящегося к конкретной таске не создается. Компилятор может их как угодно наоптимизировать. Я бы еще внутрь какую-нибудь реальную работу запихнул.
big boy.png236 Кб, 1456x782
287 3111627
288 3111642
>>111627
Это хорошо или плохо...
289 3111651
>>111642
Это по теме >>111602.
290 3111675
>>111602
ему там пояснили в первом коменте.
нраица.png112 Кб, 358x395
291 3111683
>>111293
У меня пекарня дедушкина не тянет студию. Только вс-код, в котором нихуя нет. Только дополнение на автозакрытие тегов, которое помогает, но не сильно. Такшта вотета в древовидном виде выглядит вполне сносно, жаль что автодополнения нет, но названия элементов можно чекать по схеме, если она есть и если её подключить. (А её тоже нет, лолкек).

Алсо в этом редакторе любой хмл формат можно открывать. Например, я для прикола файл манифеста открыл и он мне показал ошибки, которые я исправил (один копипащеный тег был скопипащен без объявленного неймспейса).

Можно открывать файлы csproj и манипулировать группами настроек. Аппконфиг, юзерконфиг. Да любые хмл-лайк файлы, карочи.

И что самое главное - это оффлайн-приложение. С онлайн-редакторами на дедушкиной пекарне тоже не уедешь далеко.
292 3112492
>>110231

>Если у тебя конструкция if else превращается в if else else if то нужно использовать switch



А нужно ли?
293 3112532
>>112492
Не нужно. Switch - антипаттерн.
294 3112772
>>112532
Чиво?
295 3112875
Как узнать настоящее, окончательное, фактическое имя шрифта в wpf? Пиздят все, и программа ддя просмотра шрифтов винды, и классы шрифтов из wpf и винформ. В основном проблема в том, что логика по которой толщина шрифта является частью его имени не поддается объяснению. При открытии шрифта в винде толщина может писаться рядом с названием, но в впф шрифт не применится пока не укажешь имя без нее, а бывает наоборот - имя без толщины, но работает только с ее указанием
296 3112913
Аноны, подскажите, никак не могу сообразить. Вот у меня вьюмодель окна, и есть еще вьюмодель приложения с общими для всего приложения командами. Как бы мне пробросить команды из общей модели во вьюшку? Использую реактивюи. Пока что делаю втупую вот так:

> ICommand ExitCommand = ReactiveCommand.Create( () => AppVM.ExitCommand.Execute(null) );


Но это же форменное безобразие так делать. Так мне не дадут.
297 3112921
>>112913
Передавай в конструкторе, всегда так делаю
298 3112924
>>112921
Я уже пробовал передавать в конструкторе. Кнопка тупо выключена оказывается.
299 3112928
>>112924
Ты делаешь что-то не так
300 3113016
>>112921
Таскать по конструкторам по всей программе тот еще гемор
301 3113025
>>113016
>>112928
Тем более проблема в чём-то другом. Кнопка прибинженная к этой команде остаётся выключенной, стало быть, там каким-то мистическим образом срабатывает кэн экзекют, но его нет! Команда создана как <юнит, юнит>
302 3113057
>>113016
Зато надежно, ничего вдруг не сломается. Да и лично я не видел больше десятка вложенностей вью моделей
303 3113065
>>113057
и в итоге по конструкторам ходит 100500 вот таких вот параметров.
и это еще если не используется вьюмодельлокатор какой нибудь
304 3113075
>>113065
Альтернатив, увы, нет
305 3113079
>>113075
нет с точки зрения чистого кода. А не совсем нет
306 3113169
>>113079
Карочи, послушав ваши ответы, я нихуя нипонил. Делать предлагается так:
модель - содержит метод Exit()
главная вьюмодель - содержит метод модели в который загружает инстанс модели и работает с ним, в том числе создает у себя команду, ExitCommand(model.Exit) для своего вью.
дочерняя вьюмодель - в конструкторе получает модель как обязательный параметр и работает с ней, в том числе создаёт у себя аналогичую команду.

То есть, мне не нужно вообще вьюмодели друг на друга ссылать. Достаточно ссылать им модель.
307 3113170
>>113169
он к тому что ты должен таскать инстанс команды куда тебе надо и там присваивать команде во вьюмодели. Тогда вид будет видеть именно правильный инстанс и реагировать на него

так что НЕ создает аналогичную команду, а использует ту из конструктора.

другой путь - глобальный контекст, ты им не ходи.
308 3113180
>>113170

> так что НЕ создает аналогичную команду, а использует ту из конструктора


Блять. Я с этого и начал. >>112913 >>112924

> Я уже пробовал передавать в конструкторе. Кнопка тупо выключена оказывается.



Я тут ещё загуглил. Может проще во вьюшке в хамле дополнительно датасорс указать другую вьюмодель для конкретного элемента?
309 3113182
>>113170

> другой путь - глобальный контекст, ты им не ходи.


Это понятно. Глобальная вьюмодель выглядит удобной, но это же год обджект форменный.
310 3113185
>>113180
Ну смотри. Обычно нет магии - если вьюха(и) видит один инстанс команды, то она за ним и следит.
Но что такое эта реактивная команда под капотом? я лично не знаю - я для авалонии использовал подход, что и для WPF. Я уважаю реактивный подход...но на андроиде или подобном, а в десктоп приложухах только мешает.

По идее авалония знает про реактивность и может кастовать ICommand до реактивной команды и подписываться на нее. А что если подписки 2 то как это? а хз. Может ты на это наткнулся, а может где то в другом у тебя проблема и вьюха видит не тот инстанс что ты думаешь. Влепи конвертер и увидишь

>>113182
Это не совсем про это. Типичные проблемы - нужно таскать обязательные параметры (вот эта команда тому пример), потом лайфтайм, потом мессенджер (ну да можно общий и токеном рулить, а вот мелкие сделали что ты указываешь ИНСТАНС мессенджера), потом диалогсервис (самая гадская штука кстати).
В итоге все это объединяешь в какой нибудь Context и вот у тебя как в андроиде - везде ходит Context. и все на тебя смотрят и ругают что у тебя вьюмодели прибиты гвоздями в иерархии (а ты смеешься с их потуг управлять временем жизни подписок и работы с диалогами)
но безумие не остановить.
И раз ты передаешь везде контекст, то... а ведь можно сделать общие вьюмодели для раздела....и вообще в них логику вытащить (это ж болезнь вьюмоделей).... и вообще разве нельзя на них прямо биндиться из вьюхи без всяких FindAncestor? да можно конечно...и вообще это не рутовые модели, а этакие....ммм...presenter-ы.

не не не, передавай в конструкторы
311 3113217
>>113185

> передавай в конструкторы


Вот я сделял как сам написал выше. Этот пикрелейтед 1 - это тот контекст как ты пишешь?
312 3113221
>>113217
Не вижу у тебя на скринах никакой передачи чего либо в конструкторы.

А мой контекст - у меня все вьюмодели принимают контекст в котором они существуют. (ну кроме простых вьюмоделей которым ничего из контекста не нужно)
Туда я прячу лайфтайм и это дает удобный запуск диалогового окна без мороки поиска родителя (что особенно жопа если у тебя вьюха)
313 3113243
>>113221

> Не вижу у тебя на скринах никакой передачи чего либо в конструкторы.


А вот так? Теперь это контекст?
314 3113252
Если модель это контекст, то тогда MVVM это CVVM! Context - View - ViewModel! Мы придумали новый паттерн!
315 3113258
>>113243
нет конечно. это просто ты передал нужное вьюмодели через параметр. Каждой вьюмодели что то нужно или не нужно.

мой контекст это просто набор доп обязательных параметров в рамках которых вьюмодель существует - у меня это лайфтаймы, связь с родительским окном, мессенджер, общие вьюмодели ака презентеры.

я не одобряю это, но в обычном подходе жить сильно сложнее
но тебе это не надо.
316 3113259
>>113258
А для общего развития?
Можно примерчик?
317 3113262
>>113259
Какое уж тут развитие, это деградация. Тесты мне не нужны, а вот скорость рождения фич крайне важна.

но идея банальная же - заводишь класс Context, куда складируешь все нужно и таскаешь везде
каждая вьюмодель у меня так
public class MyVm(Context parent) : ViewModelBase(parent)

если рождаю вложенные то так
new ChildVm(Context())
а если нужно переопределить что то то переопределяю
new ChildVm(Context(childLifetime))

поэтому вм любой вложенности завязано на диалогсервис который знает к какому окну оно относится и можно открыть 2 окна и 2 мессаджбокса, то есть на каждом (в WPF так прямо нельзя...но если хочется, то можно, а в авалонии вроде всегда можно было)

туда же в контекст можешь впихнуть и AppModel/State и достать его в любом месте. Добавить где то на уровне что то еще, что будет видно только во вложенном.

В основе всего у меня лайфтаймы - я их обожаю. С них все началось. Ну и гемор с окнами добавил - вот я плюнул и теперь контекст везде
Такой же подход без контекста слишком геморный и в итоге "остался только один (подход)"

но это не по канонам вовсе, а "мне за тесты не платят, а за фичи платят, в жопу чистоту кода"
ну почти - если он не нужен, то он и и не нужен.
318 3113267
>>113252
MVVM - это высер менеджеров из микрофофта, им надо было впарить новую версию вижуал студии, вот и навалили с подливой. По сути же это обычный MVC, где модель объединили с контроллером, а вью написали на уебанском xml. В ангуляре компоненты работают точно так же, но никто не называет это новым паттерном Component-Model-Typescript.
319 3113268
>>113267
ничего подобного. это не MVC, потому что в MVC никто не держит в себе состояние визуальной части, а "рисует само себя" в итоге логику состояния вида нужно дублировать если кросс
320 3113282
>>113268
Дай угадаю: ты учился по методичкам от микрософт?
Суть mvc очень простая: декларативно описывать интерфейс, чтобы можно было просто написать юнит тесты. Все. Если тебе при нажатии на чекбокс надо показать панель и ты хочешь протестить эту логику, ты вместо вызова panel.Show() возващаешь дтошку с полем IsPanelVisible и биндишь его на свойство Visible у контрола. В тестах ты пишешь Assert.True(vm.IsPanelVisible) и все. Ни о каком хранении состояния в паттерне mvc речи нет.
321 3113288
>>113268

> в итоге логику состояния вида нужно дублировать


Двачую.
>>113262
Ну примерно понял. Я днём что-то похожее начал ваять, но ничего не заработало. А раз это деградация, то и ладно, оставим. Я прямо сейчас выработал для себя будущую архитектуру, как видно из скринов, будет общая модель всего приложения. Максимально совместимая с юнит-тестами и всё такое. Она ничего не знает о вью/вьюмоделях, она просто делает свою работу: поднимает данные с диска, считает их, кладёт новые данные по пропертям. И всё. Она знает о существовании приложения и имеет методы сохранения данных перед шатдауном приложения.
С другой стороны есть несколько вьюмоделей, которые знаюо о модели, получая её в конструкторе. Кроме стартовой вьюмодели самого приложения, она поскольку стартовая, то она и создаёт модель, и распихивает её по всем остальным. И тут возникает вопрос... Так, блять... Падажжи...
322 3113291
>>113288
У меня получается два год-объекта, которые знают обо всех окнах, и при этом дублируются: модель и кодбихайнд приложения. И как тогда быть?
323 3113293
>>113288
Вместо того, чтобы писать контроллеры в простом анемик стиле, как в микросервисах, ты нагородил архитектуру ради архитектуры и уже сам запутался.
324 3113294
>>113259
также биндинги это своеобразные подписки на состояние
а значит всякие там реактивные штуки профита не несут.
это понятно что реактивное свойство оно как событие и на него можно подписаться, фильтровать и там того этого...и что? часто ли это нужно? нет. обычно INPC и "вид сам разберется" достаточно.

а раз так то свойства это просто свойства
если по клику на кнопку нужно что то запустить - ну простой хелпер ехекутор который в удобной манере что то запустит, поменяет IsBusy флажок, отдетачится от гуи потока, ну и помрет как положено если вьюмодель сдохла.

>>113282
Ты чет путаешь. Биндинги это про MVVM. И потому что именно нужно хранить состояние. Точно так же как и храним его в MVU(I)
в этом сама суть этих паттернов
и MVC так хреново подходит для десктопа, что там юзается MVP

>>113288
ну как деградация. Просто это не по канону для некоторых типа "как я могу эту вьюмодель передать куда то еще ведь она привязана к контексту, типа расшарить". На что можно спросить - "а зачем ее передавать, это как с оператором goto - хз где вы его используете"
Просто для тестирования же нужно этот контекст заполнить, типа он как "сервис локатор" (на самом деле нет)
Так что все это спорно очень.
То есть мввм фреймворки так не делают. Ну так они и лайфтаймы не делают как бы. У МВВМ фреймворков обычно weak путь, а у меня исключительно стронг - строг подписки, все стронг. Нет проблем с "а кто вызовет Dispose" - окно или воркспейс закрылся и все вьюмодели сдохли и сразу же прекратили работу. Без лайфтайма удачи тебе кенселить операции.
325 3113298
>>113288
поясню на примере
ты открыл немодальное окно. там у тебя само собой рут модель и далее целый граф дочерних вьюмодей. В каком то уровне вложенности ты начинаешь операцию...и закрываешь окно. Как ты прервешь эту операцию? Как ты свяжешь CancellationToken с закрытием окна?

Каскадно пропишешь Dispose? Но в MVVM в WPF так не принято, потому что можно забыть вызвать поэтому обычно полагаются на weak во вьюмоделях.

Привяжешься к закрытию окна, создаешь CancellationToken - и этот токен протащишь по всем уровням как своеобразный лайфайтам - ну вот тебе лайфтайм ака контекст ( и ты пришел к тому же что и я)
326 3113310
>>113293

> в простом анемик стиле, как в микросервисах


Любопытная инфа. Почитал. (Нихуя не понел, правда).

> ты нагородил архитектуру ради архитектуры и уже сам запутался


Никакой путаницы, щас просто надо подумать, где прописать хранение окон.
>>113294

> Без лайфтайма удачи тебе кенселить операции.


Лайфтаймы еще предстоит понять, а тут вон уже анемик подкинули выше.
>>113298

> В каком то уровне вложенности ты начинаешь операцию...и закрываешь окно. Как ты прервешь эту операцию? Как ты свяжешь CancellationToken с закрытием окна?


> немодальное окно


Нуууу, например: Все окна привязаны к БД (необязательно настоящая база данных, просто датасет, умеющий данные СоздаватьЧитатьОбновлятьУдалять), а значит, закрытое где-то окно послало в базу команду отмены. А БД эта, опять же лежит в модели, например как обсервабле коллекшон.
327 3113318
>>113310

>Лайфтаймы еще предстоит понять


а понять их просто. тот же CancellationToken суть лайфтайм просто немного с другой семантикой. Типа "токен отмены". Но взгляни на него как на "токен отмены существования компонента" и таскай его по конструкторам и вот тебе лайфтайм. Каждый кто хочет завязаться на время жизни этого токена должен добавить себя к нему через Register и когда токен протухнет - все они помрут.

Настоящие лайфаймы просто сразу удобнее - знают про Dispose, позволяют правильно терминироваться (нужно в обратном порядке диспозить, а не абы каком), SequentialLifetime (вызови просто Next и старый умрет, новый родится) - из за чего родился класс и SequentialCancellationSource и удобно же блин, ну и прочий разный сахар с Try позволяющий не выполнять что то если лайфтайм уже умер, запускать таски не позволяя сдохнуть лайфтайму и так далее.

В разрезе вьюмоделей достаточно что вьюмодель живет в каком то лайфтайме (нет отличий от CancellationToken) и передает свой лайфтайм во все подписки и детям. Если лайфтайм того, то все подписки автоматически отпишутся и весь граф диспознется

>Нуууу, например: Все окна привязаны к БД


жуть какая то. но опять же - вьюмодель что заинтересована в этом знании должна как то об этом узнавать. А значит ты притащишь или датасет этот через все вьюмодели или обертку над этим датасетом....ба. а это тот же лайфтайм просто под капотом дико реализованный.
328 3113323
>>113318
Ладно, подумаем над этим завтра. Всем спокойной ночи. Зацените ещё вот:
>>107195

> Можно ли сделать ещё короче?


Не то чтобы короче, но в стиле WhenAny
329 3113427
А что будет, если я буду ожидать результата через await метода, возвращающего taskCompletionSource.Task, и во время ожидания задача будет отменена?
ASP NET 330 3113458
Сап двач. Изучаю ASP. NET и столкнулся с проблемой: добавляю NuGet пакет для расширения Entity Framework для подключения к базе данных, мне выдаёт ошибку из-за того, что VS не видит "UseSqlServer", удаляю конкретно этот пакет - скачиваю другой, в итоге "UseSqlServer" видит, но теперь выдаёт ошибку в других местах, если скачать оба пакета, то всё равно не работает. Как мне быть?

https://metanit.com/sharp/aspnet6/12.1.php пытаюсь по этой статье сделать
ASP NET 331 3113460
>>113458
Продолжение, это со вторым пакетом
332 3113462
>>113458
>>113460
Как в статье пакет тоже не видит "UseSqlServer"
334 3113809
>>111683

>У меня пекарня дедушкина не тянет студию.


Прими мои соболезнования. Но на самом деле это штука слабо лучше текстового редактора. Делать что-то сложное на нем я себе не представляю, особенно когда у тебя ресурсы в разных документах.

Все остальное в студии тоже есть.
335 3113812
>>112875
Мне тоже интересен этот вопрос. Скоро коснется и меня.
Возможно нужно почитать доки, может есть какие-то стандарты.

Подозреваю, что есть шрифты, где толщина является частью названия. Это буквально их название, например ArialBlack.
336 3113818
>>097760 (OP)
А на C# что-то пишут кроме десктопа (в России)?
337 3113820
>>113025
Кен экзекьют параша полная. Она выполняется один раз при загрузке и больше никогда. Я ее всегда возвращаю True, либо делаю метод, который принудительно дергает кен экзекют.

Еще была мерзотная ситуация, когда то ли фокус не пришел на кнопку толи еще что, но кнопка или меню тупо становились серыми даже с кен экзекьют = true. Каждый раз с этим борюсь и каждый раз забываю сделать себе пометку о причинах. Возможно что-то связанное с порядком загрузки.
338 3113827
339 3113833
>>113820
Авторы ReactiveUI исправили это недоразумение (уж не сочтите за рекламу, можете пользоваться комюнити тулкитом, всё нормально, или даже своим велосипедом, никто не настаивает).
Они подают на вход своих команд Observable<bool> вместо bool и он внутри тулкита хитро подписывается где надо на обновления, и тебе ничего дёргать не нужно. Это я вычитал напрямую в их документации. И по первоначальным тестам всё действительно работает.
Правда у них там висит предупреждение, что работает это всё только в рамках одного потока, или контекста или ХЗ чего, и там сказано, что если вам надо вы можете дополнительно что-то там сделать.

>Warning For performance reasons, ReactiveCommand does not marshal your canExecute observable to the main scheduler. You almost certainly want your canExecute observable to be ticking on the main thread, so be sure to add a call to ObserveOn if necessary.

340 3113838
Как реализовать IClonable для наследников класса?

Очевидный вариант, это когда ты реализуешь интерфейс в наследнике, а не в базовом классе, но проблема в том, что 90% всех свойств находятся в базовом классе, а наследников дохрена.

Это что же, мне копипастить метод с клонирваонием всех свойств в кадом наследнике?

Если же я создаю реализую IClonable в базовом классе, то он возвратит мне экземпляр не того класса, который я ожидаю.

Тут должно быть что-то вреде дженерик Clone<T>() или Clone(BaseClass target).
341 3113840
>>113820

>Кен экзекьют параша полная


смотря где. Если WPF, то выполняется при потере фокуса или ручном вызове "инвалидируй все команды"

В авалонии я сам писал этот CommandManager вроде. Конечно правильнее когда инвалидируются только зависимые команды, но это уже геморно и подходит только для реактивной модели.
342 3113845
Шарпачи, поясните за .NET MAUI, стоит ли его изучать хорошо или почитать для общего развития?
В чём плюсы по сравнению с веб приложением? Сейчас если что то надо с интерфейсом я делаю asp net core приложение с мордой в вебе.
343 3113849
>>113845
если ты пишешь под андроид и тебе хочется писать и под десктоп - то, возможно, да
иначе нафиг
344 3113852
>>113818
Я бы сказал что гуй на нём редко пишут относительно сервисов просто с гуём больше проблем и вопросов.
А вообще всё что может джава то может и шарп и даже больше
345 3113857
>>113840

> В авалонии я


Напоминаю, что реактивностью там занимается Reactive UI и говорить следует о нём. Так-то его можно подключить к любому проекту и юзать. Хоть в консольной утилите с консольным интерфейсом.
346 3113859
>>113857
нет не так. вон обновил авалонию и отвалился Subscribe(Action)
тык мык - оказывается исчезла зависимость от пакета реактиве

так что Reactive UI это просто типа рекомендуемый дефолтный и (ну авалония его понимает), а не единственный. На авалонии можно писать с любым MVVM фреймворком, а не упарываться в любом к Reactive UI (и его особенности)
347 3113873
>>113859

> На авалонии можно писать с любым MVVM фреймворком, а не упарываться в любом к Reactive UI (и его особенности)


Верно и обратное

> На Reactive UI можно писать с любым MVVM фреймворком, а не упарываться в любом к авалонии (и её особенности)



Я об этом и пишу.
Я вот позавчера смотрел длинный видос про авалонию с комюнити тулкитом. И там всё тоже красиво. И автор вежливо вначале сказал, что не осуждает пользователей Reactive UI и считает его годным, но сам он выбрал для себя комюнити тулкит и лабает на нём.

Если кому интересно, вот: https://www.youtube.com/watch?v=bCryIp9HqIM
image.png30 Кб, 540x430
348 3113894
Поясните за Task.Delay и Thread.Sleep.
Правильно ли я понимаю что Thread.Sleep блокирует поток и в случае если в этом потоке работает что то еще то это тоже остановится? А Task.Delay делает паузу только в текущей таске?
И стоит ли вобще делать паузы при ожидании чего то в while ?
349 3113901
>>113894
await Task.Delay это просто эквивалент любоего другого асинхронного метода типа await DoSomethingAsync()
если в DoSomethingAsync() влепить таймер и TaskCompletionSource то это и будет Task.Delay

>при ожидании чего то в while ?


лучше не ожидать, ведь в этом и смысл тасков - "не жди, я сам позову когда будет готово"

в коде на скрине с await Task.Delay ты отпустишь поток и запланируешь продолжение в тредпуле
350 3113927
>>113894
Если у тебя метод асихронный, то делай сразу Task.Delay
Зачем тебе Thread.Sleep? Если в твоей асихронной функции не будет await, то она будет работать как обычная синхронная с блокировкой потока пока она не завершится.

>И стоит ли вообще делать паузы при ожидании чего то в while ?


Если это Delay, то почему бы и нет? Только вайл у тебя должен быть в асинхронном методе, который ты ожидаешь.
К примеру у меня была асинхронная функция цветовой пипетки, которая брала цвет пикселя с экрана через определенный период времени. Внутри был цикл while c Delay, который работал до тех пор пока пользователь на нажимал ЛКМ.

А еще вайл используют при ожидании завершения таска. Так я, например, делал асинхронное диалоговое окно.
image.png34 Кб, 613x567
351 3113946
>>113927
>>113901
Сложна все эти таски хуяски. Я когда пишу то как то по наитию делаю(
Вот например, таска в while появится значение, это может быть что угодно. Стоит ли туда добавить паузу что бы while не прыгал и не проверял в if? Ведь значение хз когда появится и можно было бы сделать Thread.Sleep(1000);
Будет ли профит в виде свободного процессорного времени?
352 3113954
Поясните где проходит граница между моделью и вьюмоделью? И то и другое требует реализации INPC, и к тому и другому может обращаться вью. И то и другое может внутри содержать команды, какую-то логику и кучу вложений.

Для примера, параметры приложения это модель или суб-вьюмодель основной модели? По своему объему похожа на отдельную вьюмодель, к которой обращается отдельное окно.
Но в то же время что мешает ей быть моделью? Все равно доступ к параметрам идеть через основную вьюмодель.
353 3113956
>>113946
нет ничего сложного в тасках
таска просто объект который показывает статус какой то работы и позволяет дождаться (читай подписаться и запланировать продолжение) окончания таски

и ты снова делаешь фундаментальную ошибку - не нужно проверять "появилось ли значение". Нужно сделать какой то вариант уведомления типа AsyncManualResentEvent и тогда после установки значения дернуть его. работает как обычные не-асинк вейтхендлы - принцип одинаковый.
354 3113959
>>113954
вьюмодель содержит состояние "нам нужно отобразить это". На INPC не смотри - это не исключительно видовое, о чем даже неймспейс интерфейса INPC говорит.

И да, ты не обязан создавать вьюмодель чтобы обернуть/перенести_данные с модели
Тут просто главное не забывать про мемори лики (знать подводные камни)

параметры приложения - модель.
355 3113965
>>113566
Спасибо

Помогите кто-нибудь перевести код с Первой пикчи на новую версию ASP, где нет класса Startup, а есть только класс Program. Я пытался сделать с помощью метанита, но нихрена не работает, а у меня уже мозги кипят. Вот сам код:

string path = Environment.CurrentDirectory;
var _confstring = new ConfigurationBuilder().SetBasePath(path).AddJsonFile("DbSettings").Build();
builder.Services.AddDbContext<AppDBContent>(options => options.UseSqlServer(_confstring.GetConnectionString("DefaultConnection")));

Мне нужно подключится к файлу "DbSettings.json" и к строчке "DefaultConnection", который находится в самом пространстве имён проекта
356 3113966
>>113965
На метаните подключаются к appsettings.json, а мне нужен другой файл
357 3113968
>>113820

> Кен экзекьют параша полная. Она выполняется один раз при загрузке и больше никогда. Я ее всегда возвращаю True, либо делаю метод, который принудительно дергает кен экзекют.


Вообще-то все правильно. Как и у любого observable свойства ты должен сам вызывать обновление состояния команды, добавив метод NotifyCanExecuteChanged, который внутри будет вызывать событие CanExecuteChanged. А вариант с CommandManager в wpf это, простите меня, полная залупа, которая вызывает метод canexecute когда надо и не надо, забивая на производительность.
358 3113977
>>113946

>Ведь значение хз когда появится


Ознакомься с токенами завершения. Есть возможность сделать событие когда таска завершится.

>Сложна все эти таски хуяски. Я когда пишу то как то по наитию делаю


Я в таких случаях пишу конкретную задачу. Пока непонятно для каких вообще целей тебе это нужно.

Есть куча вариантов. К примеру вот есть "именованные каналы", это такой мост передачи информации между несколькими приложениями или процессами. Там проблема в том, что первое приложение должно дождаться когда подключатся все остальные, а это неизвестно когда произойдет, может вообще никогда не произойдет. Вот тогда запускается асихронный метод ожидания, который в итоге создает событие, когда подключение удалось. Все что остается, это подписаться на это событие.

А есть еще токен завершения. Я его использовал в асинхронном диалоговом окне. В чем суть проблемы: пока окно не закрылось, не должен выполняться дальнейший код, но при этом я не должен был блокировать работу в первом окне. Что я делал? Я в асинхронном методе Show запускал окно и асинхронно ждал, когда окно установит статус что оно завершается, и только тогда мой метод Show завершался.
А чтобы я узнал что окно завершилось, я использовал токен, это такой экземпляр класса, который работает как Task.Delay, только у него есть свойство Cancel или Result, после установки которых ожидание прекращается.

Короче, описывай задачу и тебе подскажут решение.
359 3113978
>>113968
Ну вот у меня довольно банальная задача — обновлять кен экзекьют каждый раз, когда вызывается контекстное меню. Вот как такое сделать?
Ситуация возникает чуть ли не в 96% случаев.
360 3113983
>>113818
Наоборот. Пишут почти все кроме десктопа.
361 3113984
>>113978
либо все команды регают себя в коммандмэнеджере ВПФ и он их всех заставляет инвалидироваться

либо же команды завязаны на изменения чего то от чего зависит их кен и тогда они всегда находятся в актуальном состоянии.

ты же пытаешься усидеть на двух стульях. Я сижу на полторах - у меня либо команда явно зависит от чего то, либо хрен с ней регается в коммандмэнеджере, но то ж ВПФ. тебе такое нельзя

>>113983
кроме десктопа на публику. Иначе же десктопа выше крыши.
362 3113986
>>113978

> Ну вот у меня довольно банальная задача — обновлять кен экзекьют каждый раз, когда вызывается контекстное меню. Вот как такое сделать?


Даже не представляю зачем такая логика вообще нужна. Расскажи пожалуйста а я скажу, почему это говнокод
363 3113989
>>113986
Ну и да, делается это через бехавиор. Подписываешься на событие Showed контекстного окна и устанавливаешь свойство IsContextFlyoutShowed в true, в сеттере также вызываешь метод MyCommand.NotifyCanExecuteChanged().
364 3113991
>>113984

>Даже не представляю зачем такая логика вообще нужна. Расскажи пожалуйста а я скажу, почему это говнокод



Например в контекстном меню есть команда слияния несколько папок, но активна она при условии, что выделено больше одной папки.
365 3113995
>>113991

> Например в контекстном меню есть команда слияния несколько папок, но активна она при условии, что выделено больше одной папки.


В таком случае ты должен обновлять CanExecute при изменении выделенных папок, а не тогда, когда вызываешь контекстное меню.
366 3113998
>>113995
Зачем? Контекстное меню не всегда вызывается.
Хотя я понимаю о чем ты, эта кнопка может просто висеть в каком нибудь тулбаре. А привязка к поведению контекстного меню ограничивает возможности команды.

Просто иногда частота изменения состояния происходит в тысячи раз чаще, чем частота использования команды.
367 3114001
>>113998

> Зачем? Контекстное меню не всегда вызывается.


Затем, что логика зависит именно от этого. Но если беспокоит производительность, то делай через бехавиоры как я писал выше или код бехайнд, бехавиоры же на рефлексии Но вообще в контекстном меню кнопка создается при каждом вызове и должна получать актуальное состояние CanExecute.
368 3114015
>>113998
Затем что реактивный подход ПУШИТ изменение. Никто может не слушать но пушнуть ты обязан даже если это просто флаг выставить который команда ПОТОМ ПОТОМ прочитает
369 3114104
>>113965
Не пойму что ты хочешь.
370 3114483
>>114104
В большей степени проблема была как прописать путь до самого файла, но я сделал в итоге Directory.GetCurrentDirectory() внутри SetBasePath
371 3115285
>>111274
Бамп вопросом.
Каим образом обновляется ActualWidth, если он ридонли?
372 3115287
>>115285
private set;
373 3115396
>>115285

> Каим образом обновляется ActualWidth, если он ридонли?


В геттере производятся вычисления и возвращаются тебе. Тебе кажется, что это переменная, и она как-то обновляется, а это не переменная и она вообще не обновляется. Просто каждый раз, когда ты к ней обращается, срабатывает геттер, производит вычисления и возвращает результат.
374 3115464
>>097760 (OP)
Шарпаны, а что вы в качестве якорей используете?
struct, class, record?
readonly, abstract?

Я, в принципе, понимаю, что так-то похуй, т.к. по сути из него нужно неймспейс достать и все, но вдруг есть какие-то общепринятые кодстайлы, а я не в курсе.
375 3115468
>>115464

> Шарпаны, а что вы в качестве якорей используете?


Что блять, какие якори?
376 3115477
>>115396
Допустим. А как тогда экземпляр знает какая у него актуальная ширина, находясь, например, третьим итемом в стек панели? Как он производит расчеты?

Понятно когда элемент находится в каком нибудь гриде, тогда он обращается к родителю и получает его актуальную ширину + марджин + паддинг. Но как быть с чем-то более сложным, где присутствует дополнительная организация чилдренов?
377 3115482
>>115468
Ну например тебе нужно добавить в DI-контейнер кучу классов реализаций/наследников одного класса, создаешь класс пустышку (якорь) там где они все лежат и подкидываешь его в метод добавления, а он добавляет все нужные реализации из неймспейса этого якоря.
Ну или более каноническое в EFCore, добавление в modelBuilder конфигураций через
.ApplyConfigurationsFromAssembly(typeof(ConfigurationsAnchor).Assembly)
378 3115487
>>115477
Открой исходный код и посмотри сам.
379 3115498
>>115487
Ты знаешь какая там каша? Я потому и спросил, что может кто-то знает принцип.
380 3115519
>>115487
>>115498
Короче, есть свойство RenderSize, которое доступно и на чтение и на запись. АctualWidth получает информацию из этого свойства.

Пытался поменять рендер сайз.
До изменений:

>TestBorder.Width: нечисло


>TestBorder.ActualWidth: 0


>TestBorder.RenderSize: 0;0



Вношу изменения
TestBorder.RenderSize = new Size(100, TestBorder.RenderSize.Height)
TestBorder.UpdateLayout();

Результаты:

>TestBorder.Width: нечисло


>TestBorder.ActualWidth: 100


>TestBorder.RenderSize: 100;0



Только визуально никаких изменений не произошло. Рамка не поменяла своих размеров.
381 3115523
>>115477
никто к родителю не обращается
есть 2 прохода Measure и Arrange
measure проходит по всем детям и говорит им "вот я могу тебе дать такой размер, ты там посчитай желаемый размер который ты хочешь"
в Arrange же "вот тебе финальный размер -вписывайся и детей своих вписывай"

как то так
382 3115535
>>115482
Это делается через экстеншеены для di.
383 3115542
>>115535
Я знаю как это делается, вопрос (>>115464) был про кодстайл.
384 3115551
>>115523
Спасибо, анон. Действительно.
Тоже подумывал сделать какой-то метод, в котором указывается допустимая область, а чилдрены сами рассчитывают марджин и свой размер.
385 3115570
У меня есть объект, к которому обращаются множество других объектов. Но первому объекту нужна инициализация, которая занимает какое-то время.

Как сделать так, чтобы первый из обратившихся дернул инициализацию, а остальные если вдруг обратились в этот момент, то дождались когда инициализация завершится?

У меня решение такое:
1. Создать свойство IsInitialized
2. Создать nullable поле с TaskCompletionSource?
3. Создать асинхронный метод, который сперва проверяет IsInitialized и если false, то проверить наличие экземпляра TaskCompletionSource и авейтом дождаться завершения таски.

Какие подводные? Объектов не много, не больше сотни.
387 3115588
>>115570
Почему не инициализировать объект при создании?
388 3115603
>>115578
Спасибо, интересно.

>>115588
Думаю над этим. К объекту могут и не обратиться вовсе, а он тяжелый.
389 3115658
>>115570
Без мемори барьера такое небезопасно делать. В конвейере процессора инструкции вызова конструктора и поднятие флага IsInitialized могут поменяться местами. Поток проверит что IsInitialized == true, и попытается обратиться к переменной, в которую еще не записана ссылка на "инициализированный" объект.

Вероятность словить такое в рантайме конечно же милипиздрическая, но детерменизм проебан. На ютубчике есть куча докладов на эту тему, даже на русском.
390 3115680
Граждане, вот такая конструкция будет проверена только один раз на релизе? Либо в релизную сборку она не попадёт ?
#if DEBUG

Console.WriteLine("Этот код выполняется только в режиме отладки.");
#endif

Это вопрос как выполнять определенную часть кода в Дебаге но не выполнять на релизе и что бы не дрочить проверками в релизе выполняется код или нет.
391 3115683
>>115680
Не попадет
392 3115684
>>115680

>Либо в релизную сборку она не попадёт ?


это
393 3115689
>>115285

> Каим образом обновляется ActualWidth, если он ридонли?


>>115396

> срабатывает геттер, производит вычисления и возвращает результат


>>115477

> Допустим. А как тогда


>>115487

> Открой исходный код и посмотри сам.


>>115498

> Ты знаешь какая там каша?


>>115519

> Короче


> Пытался


> никаких изменений не произошло



Так вот как выглядит синдром Данинга-Крюгера!
394 3115692
>>115658
И ничего страшного не случится ведь await обвешан барьерами
395 3115735
>>115680
При компиляции релиза все #if debug ... #endif тупо вырезаются.
396 3115737
>>115689
Слишком много гринтекста.
397 3115752
>>115735
>>115684
>>115683
Всем спасибо(большое)
398 3115818
>>115570
В фреймворка уже есть класс для решения этой проблемы
https://learn.microsoft.com/ru-ru/dotnet/api/system.lazy-1?view=net-8.0
399 3115843
>>115818
И он нисколько не async
400 3115903
>>115843
Если прям нужна true-асинхронность, то возьми SemaphoreSlim и намути с помощью него и double check locking свой AsyncLazy.
401 3115913
>>115680
Уже ответили но если это бизнесовая логика то не делай так. Остальные на говно изойдут и по делу
402 3115931
>>115913
А почему не делать?
А как надо?
Вот например я в консоль вывожу логи. Или работа с файлами? Вообщем вся работа с тестовыми данными. Как правильно сделать?
403 3115936
>>115931
Логи управляются через конфиг логгера, вырезав дебаг месседжи с мясом в проде ты себе же подлянку делаешь.
Тестирование делается банально мокнув нужный сервис, интерфейсы ёпта
404 3115943
>>115936
Единственно где считаю уместным флаги компилятора это вырезать/заменять код дабы конечный юзер не увидел каких то секретиков. К примеру в дебаг сборке отключена проверка лицензий по коду и какие нибудь шифрования промежуточных данных
405 3115994
>>115689

> человек, имеющий низкий уровень компетенции в какой-либо теме, начинает мнить себя знатоком этой темы



Где в перечисленном тобою гринтексте мнят себя знатоками?
406 3116219
Что-то я запутался. Асинхронность - это когда процессор быстро прыгает с одной задачи на другую, а параллелизм - это когда есть два процессора и, скажем, задача, которую мы выносим во вторичный поток выполняется на втором процессоре. Если так, то что тогда делается с ядрами процессора? По идее параллелизм - это когда вторичный поток работает на другом ядре процессора?
407 3116225
>>116219
Процессоры == ядра в твоём случае
408 3116230
>>116225
То есть если в процессоре больше одного ядра, то вызов чего-то асинхронного может выполняться параллельно основному потоку. Правильно?
409 3116233
>>116230
Нет. Асинхронный код может быть не готов к параллельному выполнению.
Асинхронный код не может в один такт пытаться делать две вещи, а параллельный может оттуда и ебля с синхронизацией/блокировками
410 3116234
>>116230
Почитай как работает ивент луп в жс в качестве примера асинхронности или как фриртос распределяет кванты времени задачам
411 3116236
>>116219
Асинхронность в первую очередь это когда у тебя есть какая-то операция, которая выполняется асинхронно относительно кода программы (сетевой запрос, запись на диск, ожидание какого-то события через аппаратный интерфейс и т.д.) и ты просто приостанавливаешь выполнение кода до того момента, пока внешняя асинхронная операция не завершится.
Ты можешь ждать завершения этой операции либо синхронно, в цикле, занимая поток ОС, либо, если ОС поддерживает работу с асинхронным IO, подписаться на событие завершения операции и освободить поток, чтобы не тратить лишние ресурсы. Как внешняя асинхронная операция завершится, ОС вызовет твой коллбэк и ты сможешь продолжить выполнение своего кода. В винде, к примеру, этот механизм называется I/O Completion ports.
412 3116243
Можно ли в новых шарпах как-то объявить лист определенного размера с уже инициализированными значениями типа Т или только массив юзать в таком случае? Я понимаю конечно что Т может быть интерфейсом и т.д.
Я заебался васянить:
stroki.Add("");
stroki.Add("");
stroki.Add("");
stroki.Add("");
stroki.Add("");
stroki.Add("");
stroki.Add("");
414 3116253
>>116243
>>116250

А сорян, не так понял.
Я в таких случаях сделал бы
Enumrable.Range(1, n).Select(_ => string.Empty).ToList();
image.png225 Кб, 1154x1579
415 3116273
>>116243

Если надо много и часто заполнять листы дефолтными значениями, то сделай себе Extension-метод/хэлпер и не страдай больше
image.png72 Кб, 905x457
416 3116288
>>116273
Хотя вот так ещё лучше будет. Метод Span.Fill дико оптимизирован и активно юзает SIMD-инструкции.
417 3116360
>>116288
а как List узнает сколько в нем элементов после прямого влезания в его хранилище?
418 3116362
>>116288
упс. туплю. не заметил SetCount
419 3116367
Кто как использует RabbitMQ в своих проектю? Зачем он вообще нужен?
420 3116385
>>116367
Нужен чтобы не опрашивать какую-то программную сущность раз в n промежуток времени как долбаеб чтобы получить сообщение/новый стейт, а нормально тригерить у себя ивент только когда сообщение действительно придет.
Если ты спрашиваешь нахуя он нужен, то тебе он в проекте скорее всего не нужен. А если вкатун, то знать нужно.
мимокрокодил, никогда его не юзал, поправьте меня если написал хуйню
421 3116388
>>116253
>>116273
>>116288
>>116360
>>116362
Спасибо, но я пошел по пути наименьшего сопротивления и просто заюзал массив.
422 3116402
>>116385
>>116367
Горизонтальное масштабирование + в неком роде стейт машина
423 3116405
>>116388

> и просто заюзал массив


А потом кстати, его можно легко переделать в список: .ToList();
Даже объявлять можно так:

> var stroki = ["","","","","","","",""].ToList();

424 3116408
>>116405
Вообще, можно ещё проще:

>List<string> stroki = ["","","","","","","",""];

425 3116410
>>116367
>>116385
Бля ну для чего может быть нужен брокер сообщений? Чтобы делать event-driven architecture очевидно же! Чтобы микросервисы могли общаться. Я могу просто опубликовать событие - "товар куплен", а все кому надо, его получат. Это может быть склад, это может быть чат-бот, это может быть crm, это может быть email-оповещения, да что угодно. Тоже самое с ачиридями. Мне нужно обойти 500 сайтов например. Я могу создать очередь и обходить по 5 сайтов за раз в параллели. Ну и так далее.
426 3116415
>>116243

> Я заебался васянить:


> stroki.Add("");


Так юзай for кста:

> List<string> stroki = [];


> for (int i = 0; i < 10; i++) stroki.Add("");

427 3116417
>>116243

> Я заебался васянить:


Будь мужиком! Юзай Цикл While C ПостУсловием:

> List<string> stroki = [];


> do {


> stroki.Add("");


> } while (stroki.Count < 10);

Вопрос по MVVM 428 3116418
Вызывать модальные диалоги это чья ответственность? Модели или Представления?
429 3116440
>>116418
А сам как думаешь? Что по твоему вообще диалог
430 3116469
>>116410
>>116402
>>116385
Спасибо, анчоусы. Стало чуточку понятней.
431 3116498
Во>>116243
Enumerable.Range(0, size).Select(_ => "").ToList()
432 3116527
>>116440

> Что по твоему вообще диалог


Потомок класса окна.
У него есть статический метод ShowDialog(Window owner).
Меня учили, что вызывать этот метод должно окно-овнер, передавая туда экземпляр себя. Получается, если вместо окон у нас представления, то вызывать диалоги должны представления на уровне представлений?
433 3116579
>>116527
ну у тебя был вопрос по MVVM
с MVVM все просто
модель - вообще логика приложения и она знать не знает про то что вообще где чего то отображается. она - все, что не относится к представлению
вьюмодели - отвечают на вопрос "что отображать". содержат визуальный стейт
вид - отвечает на вопрос "как рисовать"

при этом есть пара нюансов
- нижележащий слой не знает о вышележащем. модель не знает про представление в принципе, а вьюмодели про вид
- вид общается с моделью через вьюмодели, а не напрямую
- вьюмодели знают "что отображать". но знать не знают ни про какие особенности вида типа диалоговых окон

И тут возникает вопрос. А как же вон народ плодит всякие IDialogService?
А вот так - это так то нарушает MVVM. Просто вопрос такой встает и его нужно как то решать, то есть вносить какую то степень знания интерактивности на уровень вьюмодели. То есть все равно идет разрыв в логике вьюмодели, что ей где то нужно работать интерактивно. И тут кто на что согласен. Кто то выставит Func<> который обработает вид, кто то запилит медиатор и "эй кто то там выдайте результат", а остальные мудрят DialogSerivce, ведь инициировать что то на уровне вьюмоделей = обрабатывать это на уровне вида, а там всякий code-behind (а как там гласит - code-behind должен быть пуст). Ну да можно атачед пропертю или бехавиор...но тогда логика рвется. Ведь это может следить за каким то свойством и совсем не видно без 0.5 что присвоение этого поля оказывается что то там вызовет новое окно...да и где результат получать?
Так что абстракция диалога протекает и с этим ничего не поделать. Каждый выбирает свою степень протечки и удобства
434 3116800
>>116579
Тут понятно. Будем думать.

> а как там гласит - code-behind должен быть пуст


А тут вообще непонятно, зачем до сих пор держат кодбихайнд, если хамл уже умеет буквально всё. Неймспейсы объявляет, биндинги биндит, стили перечисляет, взаимосвязи между элементами объявляет.
Просто вынести загрузку класса-представления в вызывающий компонент. Пусть условный

> xamlLoader(this) # из кодбихайнда


будет

> xamlLoader(ViewName) # из вызывающего компонента


И всё.
4234234234.png10 Кб, 406x191
435 3117609
>>097760 (OP)
Двощеры, нужна ваша помощь.
Задача такая: создать массив из 56 элементов, который представляет собой по сути колоду игральных карт. А это значит что каждой карты должно быть по 4 штуки. Тоесть первые 4 элемента массива, с 0 по 3, должны иметь значение 2.

Я написал код, который должен вроде работать, но он не работает и я слишком тупой чтобы понять почему. Он забивает в массив только первые 14 элементов, а не все 56. Помогите нахуй, у меня мозги плавятся.
436 3117621
>>117609
У тебя ОДИН цикл от 0 до 13. Нужен еще второй по всем мастям.
Какие же шарпомухи тупые...
437 3117626
Шарпомухи...
438 3117631
>>117609
ты не записываешь увеличенный i во внутреннем цикле
должно быть так:

deck[i++] = 0;
deck[i++] = 1;
deck[i++] = 2;
deck[i++] = 3;
вместо while, хотя не уверен что ты именно эти значения хочешь записать, твоя ass болтается в воздухе
439 3117632
>>117631

>deck[i++] = 0;


>deck[i++] = 1;


>deck[i++] = 2;


>deck[i++] = 3;


даже не так:

deck[i++] = 0;
deck[i++] = 1;
deck[i++] = 2;
deck = 3;
последнюю не нужно увеличивать
440 3117643
>>117609
Можно в одном цикле просто отбором целой части и остатка от деления индекса на 4
441 3117694
>>097760 (OP)
Чувствую себя вернувшимся в 2021-й год. Когда уже вышел .Net6, но ты вынужден был сидеть на Core3.1 (а местами еще и на Core2.1) и облизываться на новые фичи.
Сейчас то же самое. Уже вышел 8-й, на подходе 9-й, с кучей новых вкусных плюшек и оптимизаций, но ты вынужден будешь использовать 6-й еще года два.
442 3117723
>>117694
Ну тыпросто мазохист
Так то 8 lts как и 6
image.png96 Кб, 439x796
443 3117728
>>117609
Почему не сделать примерно вот так?
444 3117729
>>117728
Ну, а потом - отсортировать как надо, если надо, если не надо - не сортировать.
445 3117757
>>117723
Чел, я бы с радостью хотя бы на 8 перешел. Но то говно (вроде Альта или Астры), на которое приходится сейчас импортозамещаться максимум 7 поддерживает и то так себе. А те лицензии которые они корпоратам продают только 6-ю версию гарантируют. И когда они доползут до нормальной поддержки новых версий - хуй его знает.
С версиями софта, там вообще боль. Тот же постгрес только 11-й версии в Астре (при том, что его поддержка закончилась осенью) и летом обещают 12-ю (которая тоже протухнет в ближайшую осень).
image.png21 Кб, 579x182
446 3117785
447 3117832
Блейзоро-мазхоисты, у вас была такая хуита что клиент на блейзоре не может по какой-то неведомой причине достучаться до контроллера и получает http страницу как будто контроллера нету?
Делаю запрос через HttpClient:
var response = await _client.GetAsync("api/huinya");
Лезу через дебагер к reponse->RequestMessage->RequestUri->AbsoluteUri
копирую урл в постман, через постман все заебись - я попадаю в контроллер, через HttpClient в блейзоре - хуй.
Это при том что я пишу третий круд по бойлерплейту - код идентичен, уже раз 10 все перепроверил.
Все мои годы разработки сейчас тупо остановились на этой неведомой хуйне.
448 3117844
>>117832
1. В браузере copy as curl и выполни
2. Загони под митм (чарлис, фиддлер, етц...)
3. Проверь что с методами
4. Смотри логи сервера
449 3117856
>>117844
1. Все заебись, браузер/постман заходят в контроллер.
2. Проблема на стороне клиента 100%, это все на локалхосте.
3. С какими методами?
4. В логах ничего, и ничего в принципе и не должно быть если оно не находит контроллер - возвращает хтмл блейзор страницу.

Версия .net 7. Под третьим крудом я имел ввиду 3 таблицу.
Убрал с Program.cs на сервере кеширование/сжатие, авторизацию/аутентификацию и рейт лимитер, пока нихуя не дало.
450 3117904
>>117832
CORS включен?
451 3117930
>>117904
Включен, но его отключение ничего не дало.
452 3117945
>>117832
Очевидно есть зависимость от неких заголовков запроса. Попробуй в браузере сделать запрос аналогичный постмановскому
453 3117949
>>117832
А можешь весь метод скинуть?
454 3117956
>>117856
2. Ты пробовал или просто гнешь линию?
4. Поставь трейс на всё и там будет подробно расписано кто и куда идёт и как матчит
455 3117972
>>117832
Если минимал апи, то с синтаксисом что-то.
456 3118044
>>117945
>>117949
>>117956
>>117972
Все отбой, я отправил запрос на апи когда он был еще не доделан, мне отправилась блейзор страница. Когда я написал апи она видимо каким-то образом доставалась из локального кэша, даже спустя несколько часов и ребилды. Нашел уже после того как начал менять имя апи на любое другое и оно работало.
Надо будет еще покурить как оно работает.
457 3118045
Энивей, спасибо за помощь
459 3118112
>>118080
И вот так тоже работает.
460 3118126
>>118112
И финальный вариант. И в продакшон.
ASP NET как сделать базу данных 461 3118291
Сап двач, изучаю ASP NET по этим видео: https://www.youtube.com/watch?v=-ylIctDOxgU&list=PL0lO_mIqDDFWltIe7D6aUS5f4k1y2-rgn&index=7&ab_channel=%D0%93%D0%BE%D1%88%D0%B0%D0%94%D1%83%D0%B4%D0%B0%D1%80%D1%8C
Вопрос: есть файл Json для базы данных, со строками:

ConnectionStrings": {
"DefaultConnection": "Server=(localdb)\\\\MSSQLLocalDB;Database=??????;Trusted_Connection=True;MultipleActiveResultSets=true"
}

Что поставить вместо вопросов после Database = ?
Код с инициализацией базы данных находится в DBObjects.cs. Если я прописываю её в вместо вопросов в json, у меня выдаёт ошибку как на пике 2
462 3118310
>>118126
>>118112
>>118080
Отдуши братуха. Ебать вы тут все лютые программистеры, я хуею. Как у вас голова работает так? Я блядь постоянно путаю всё, этот цикл for ебанный мой самый нелюбимый, переменные ебучие, массивы так ваще анал карнавал.
463 3118359
>>118291
Название экземпляра бдшки. Зайди в субд через SSMS и посмотри как называется бдшка в которой хранятся твои сущности.
464 3118382
>>118291

>Сап двач, изучаю ASP NET по этим видео:


Блин, чел. Не делай так. Хрен с ним, что это Гоша Дударь, но курс 4-х летней давности и по Core2.2
В реалиях .Net - он устарел еще года 2 назад, а сейчас его можно засохшим говном мамонта считать.
Заюзай хотя бы Метанит, там хотя бы информация достаточно свежая.
465 3118425
Что я не так делаю? Почему не могу подключить проксю? Ебашит ошибка
Microsoft.Playwright.PlaywrightException: "Browser does not support socks5 proxy authentication"

Прокся точно рабочая, так как я перед этим делаю гет запрос с ней.
466 3118455
>>118310

> Как у вас голова работает так?


Свою первую переменную я объявил в 14 лет. В далёком 1997 году.
467 3118462
Анончик-анончик, не хочешь поревьюить чутка?
Я чет думаю, что что-то не так с моей кодой.
Вот.
https://pastebin.com/PYnXwZGf
468 3118479
>>118425
Тебе же прямо написали что хром не умеет в сокс5
image.png26 Кб, 1009x304
469 3118490
>>118479
Ну в документации же написано что можно
https://playwright.dev/dotnet/docs/network#http-proxy

Делаю как на скрине и всё равно нихуя
470 3118547
>>118455
Ох уж эти ньюфажины.
471 3118552
>>118490
Это не значит что браузер это умеет
Хотя не уметь сокс5 это гм в наше время
С другой стороны разве в браузерах указываешь тип сокса?
Может и тут так
472 3118564
>>118382
Я просто видеокурсы на ютубе искал, чтобы с нуля делать шаг за шагом. Там какие-то вещи потом брал из других источников
>>118359
Щас попробую, спс. А через Visual Studio это никак не сделать?
473 3118580
>>118490
у тебя sock5://
в пример http://
Схожесть прямо 100%
474 3118589
>>118580

>You can configure pages to load over the HTTP(S) proxy or SOCKSv5. Proxy can be either set globally for the entire browser, or for each browser context individually.


Да я по всякому пробовал, нихуя не работает
475 3118635
>>118589
Значит тебе только на завод
476 3118643
>>118564
Загугли лучше какие-нибудь уроки по EF. Желательно посвежее. Там будет все тоже самое, как работать с бд, но понятнее.
477 3118658
>>118564
Вообще, лучший совет для вкатунов это все гуглить. Загули то, загули се. Сделай себе акканут с гпт 3.5. Загугли как. И задавай сетке любые, самые тупые вопросы. Вот кто тебе с удовольствием все разжует. Только не бери на веру прямо вообще все, что он тебе говорит. Этот лоботомит любит бессовестно напиздеть...
1712780799888.png33 Кб, 549x543
478 3118682
>>118310
На вот еще, братишька, полакомься перед сном.
17082901053100.mp4761 Кб, mp4,
576x312, 0:08
479 3118694
480 3118751
>>118490
Ты понимаешь что дока для либы которая поддерживает несколько браузеров, а не для хрома который может что не уметь?
481 3118759
>>118751
>>118751
В фаерфоксе такая же хуета.
482 3118761
>>118759
Потому что хром точно не поддерживает аутентификацию у проксей. Об этом к слову тоже написано в ошибке
483 3119050
Можно при помощи winApi узнать минимальный размер окна стороннего приложения? Гугл игнорирует слово GET и выдает результаты по запросам SET.
484 3119056
>>119050
а что такое минимальный размер? любому окну можно задать любой размер
image.png44 Кб, 170x124
485 3119348
486 3119428
>>119348
Да уже не похрюкаешь, после февраля 22 рынок накрылся пиздой... За кабана держишься как за спасательный круг. Вокруг осталась одна Ява и голанг или православная жопа одина.
487 3119464
>>119428
Тоже так думаю но по факту немного иначе.
Критерии поиска: от 200к, удаленно, без вышки, галочка зп указана выкл

Но есть одно НО, больно много проектов на шарпах это старое унылое говно времен 2016 года. А на го много новых проектов делается и вакух 300+ на го больше чем на шарпах.

Последний собес был в контору где было 2 тимы и внимание, в двух этих тимах было по 1 человеку и называли они себя лидами
488 3119598
>>118643
Это сильно поможет для ASP NET?
489 3119743
>>119464
Сейчас бы искать по тегу C# вакансии на .Net. Во многих его даже не указывают как требование.
490 3119761
Залез я чет в ПРы на гите майков.
Че эт за фигня, когда коммент к ПРу больше самого ПРа?
Чет у нас обычно:
Имплементировал фичу из беклога. Фича #123456

И в ПРе 10000 аддининов, 2500 удаления

Кто делает неправильно?
491 3119763
>>119743
Галочки такие же, но от 200к поставил
492 3119765
>>119763
а еще указал специализацию программист, без нее результаты 800+ и разброс 10+- вакух
493 3119766
>>119761

>Кто делает неправильно?


Вы. Хороший комментарий никогда не помешает.
494 3119768
>>119761
Сравнил опенсорс с энтерпрайзом, лол.
495 3119845
>>119761

>Че эт за фигня, когда коммент к ПРу больше самого ПРа?


Побочка попенсорца. Там часто бывает, что обсуждение ПР может вылезти в большую дискуссию с кучей правок по ходу и откатами. Поэтому лучше когда вся информация собрана тут же и она максимально подробная, чтобы было меньше тупых вопросов и всегда можно было процитировать нужное. Плюс часто сылки на ПР используются в других статьях, поэтому тут их полнота тоже играет на руку.

В энтерпрайзе же ПР - это часто просто констатация факта: "Пацаны, я таску закончил, апрувните пулреквест кому не впадлу" там нахуй никому не уперлось не то что ревьюить твой код, но и даже описание к реквесту читать.

>Чет у нас обычно:


>Имплементировал фичу из беклога. Фича #123456


>И в ПРе 10000 аддининов, 2500 удаления


Если у вас внутренний проект с нормально настроенной интеграцией и по тегу Фича ###### автоматом формируется ссылка на нужную таску или страницу где-нибудь в конфлюенсе или редмайне, то вполне норм.

Есть только пара ньюансов.
1) Краткое summary на одну строку в коменте к ПР/коммиту и т.д. лучше все-таки писать. Просто чтобы когда ты список/дерево коммитов открываешь, сразу было видно что и когда было сделано, чтобы каждый раз не лазить по ссылкам выясняя что за херня тут твориться.
2) В голову начальства иногда приходит мысль "а давайте мы наш трекер задач заменим на другой он дешевле/лучше и т.д.". И вот на таких переходах имеют свойство проебываться все данные по таскам и прочая информация.

Я поэтому всегда пишу в заголовке коммита имя таски, и краткое summary на английском, потом в сообщении уже более подробно излагаю на русском, что там было сделано. При таком подходе в большинстве случаев для работы достаточно самого репозитория и в трекер приходится лезть, только за подробностями.
людмурик серьезная.mp478 Кб, mp4,
308x320, 0:02
496 3120083
Всем привет.
Я уже много лет пишу на C#, но не участвовал в high load проектах.
Можете подсказать хорошую литературу, кАналы на ютубе, где можно об этом посмотреть. Спасибо.
497 3120195
Сап, шарпаны! Я хочу себе сделать стейт-машину, чтобы прям кайфовая была. С высоты своего дилетанства я накидал следующий набор сущностей:

>1. IState


- корневой интерфейс, от которого происходит всё остальное. Содержит методы: Enter(), Exit(), Update(), IState Transit(IState next)

>2. IState<T> : IState


- типизированный интерфейс-потомок, содержит типизированные-параметризированные версии методов: Enter(T parameter), Exit(T parameter), Update(T parameter), не содержит транзита.

>3. State : IState


- реализация п.1. в конструктор передаются три Action и назначаются трём соответствующим зануляемым ридонли приват полям. Остальные методы при вызове инвокают, например: void Update() => _update?.Invoke() по такому же принципу Enter и Exit. Метод Transit реализован так, что вызывает Exit у себя, Enter у next и возвращает next. Нулль на next не допускается.

>4. State<T>: IState<T>


- И вот мы подходим к сути вопроса. В этом классе у меня выходят задвоения, от двух родительских интерфейсов приходят требования реализовать по два вида методов Enter(), Exit(), Update() с параметром и без параметра. Я хочу чтобы интерфейс как-то это дело автоматически обернул мне. Такое возможно? Я с самого утра гуглил, ничего толкового не нашёл. Пока что я рассматриваю параметризированные варианты методов как основные и в пустые методы прописываю перенаправление, с заранее сохранённым значением параметра, делаю, например для Update() => Update(storedParameter); Но это решение мне не нравится, ибо смахивает на костыль-код.

Я хочу, чтобы у меня стейт-машина по таймеру делала что-то навроде

> if (CurrentState is IState<float> FloatTyped) FloatTyped.Update(delta); else CurrentState.Update(); # где delta - это float


автоматом вызывая параметризированный апдейт, если текущее состояние типизировано.
498 3120198
>>120195
Хочется, чтобы как с конструкторами:

> void Update() : base(storedParameter) {...}

499 3120366
Почему при эксепшене мне выдаёт путь с моего пк?
Zalupka.Program.Main(String[] args) in C:\Users\MY_NAME_NAXOI\source\repos\Zalupka\P.......
Само приложение запущено на vps
500 3120374
>>120366
Потому что инфа о строках на этапе компиляции вставляется. В конечном билде нет никаких строк, только байт-код с пометками что когда то это было строкой Х в файле У
501 3120379
>>120366

> C:\Users\MY_NAME_NAXOI\


Поэтому все олдовые двачеры, уже один раз обожглись, и теперь все мы - C:\Users\User
Теперь и ты станешь одним из нас. При следующей переустановке шиндовс.
502 3120385
>>120379
>>120374
Дак это ни как не исправить?
Я и раньше это замечал, но только сейчас решил спросить.
503 3120391
>>120385
Никак. Где собрал оттуда и будет инфа для дебага
504 3120393
>>120391
Пздц.
А какая инфа еще пишется о моём пк?
505 3120442
>>120393

> А какая инфа еще пишется о моём пк?


Пишется на какие сайты ты заходил. И на какой секунде останавливал воспроизведение видео.
506 3120475
>>120442
А как тогда компилить свои проги то?
Я не хочу что бы когда фбр вскрывала мой софт там были мои следы.
507 3120476
>>120475
Собирать на безликом билд-сервере.
508 3120479
>>120476
А как на счёт VirtualBox ? Пойдёт?
509 3120480
510 3120482
>>120379

> C:\Users\User


Лол, думал, я один такой.
511 3120501
>>120195
Убери реализацию интерфейса из одного из классов (базового или наследуемого), и наследуй интерфейсы один от другого (если необходимо)
image.png108 Кб, 648x681
512 3120575
>>120195
Обычный типа универсальный подход это типа прикриплейд.

Суть в том, что стейт взаимодействует с контекстом, мутирует его и все это вот делает. Машина, просто содержит контекст и дергает какой-то метод Tick, Update, etc, все что тебе надо - ты в стейтах реализуешь и помещаешь в контекст от задачи.
513 3120631
>>120575
Можно поподробнее, плиз. Я не понял из пикчи.
514 3120645
>>120631
А шо подробнее?
Вся информация необходимая для решения о переходе - хранится в контексте.
Стейт - сам принимает решение при апдейте что надо перейти в такое-то состояние в методе Update. Когда надо - изменяет внутренние состояние контекста.
Стейтмашина - просто периодически, по какой-то твоей логике - просто дергает у контекста Tick, Update и т.д.

Если хочется совсем универсальное - ты делаешь просто билдеры стейтов и контекстов, если, допустим, тебе в рантайме надо создавать стейтмашины.
515 3120682
>>120385
https://github.com/dotnet/sdk/issues/16975

<PropertyGroup Condition="'$(Configuration)'=='Release'">
<DebugSymbols>False</DebugSymbols>
<DebugType>None</DebugType>
</PropertyGroup>

В файл проекта.
bomzh.jpg42 Кб, 500x500
516 3120850
Похоже, шарпомухи страдают задержками умственного развития:
https://habr.com/ru/companies/dododev/articles/573470/comments/#comment_23393296

Им говорят - вот на Java написаны Hadoop, Kafka, Elastic Search, а на вашем .NET что?
Они - "пук, среньк, ну это, можно подключаться к кафке из шарпа".
517 3120854
>>120850

>вот на Java написаны,


На C/C++ целые операционки написаны. Покажи хоть одну написанную на Java.
518 3120862
>>120854
Ну вот, например: https://ru.wikipedia.org/wiki/JNode
Только Java не предназначена для системного программирования.
А вот говношарп претендует на использование в энтерпрайзе вместо жабы (или сейчас уже нет)?
519 3120867
>>120645
Всё, кажись понел. Вместо создания двух видов стейта, я создаю один вид контекста, имеющий несколько реализаций, и если мне нужно прокидывать дельту-тайм в апдейт, я делаю контекст для этого. И получаю два уровня: Сначала контекст-машина, с несколькими контекстами, которые уже являются стейт-машинами с несколькими стейтами.

Ммм... Гениально!
520 3120895
>>120850
Так в том и прикол, что ниче на шарпе не написано. Все проекты - это мистификация.
Мы просто ходим на работу, получаем деньги, и литерли нихуя не делаем. Может быть раз в год самого смелого пошлют на какую-нибудь конференцию, чтобы он зубы заговаривал. А так - сиди-перди, получай бабосики и радуйся.
521 3120899
>>120895

> ниче на шарпе не написано


Справки БК на шарпе!
Чо? Чо? Уел?
522 3120962
>>120850
Оооо. Поборник фатального недостатка в треде
523 3121051
>>120850

>пук, среньк,

524 3121080
>>120850

> Им говорят - вот на Java написаны Hadoop, Kafka, Elastic Search, а на вашем .NET что?


Paint.NET, если без гугла. Если с гуглом, то https://en.wikipedia.org/wiki/List_of_C_Sharp_software

Непонятно, что там за пердуны пукнутые на этом вашем хабре сидят? Сдаёца мне, это жависты под шарпанов косят.
525 3121114
>>121080
Не будь как жавадебилы
Синдромом фатального недостатка болеют не все

Например гитлаб на руби, но почему то жавожабы вполне юзают его, а не орут "а чего он не на жаве"
526 3121121
>>121114
Да я вроде и не бываю.
Неважно, на чём написан софт, главное, чтобы он делал заявленную задачу и делал хорошо.
527 3121330
У меня у одного docker-compose up не подтягивает сертификат из поля "Kestrel"?
528 3121345
>>121330
А тебе точно нужен ссл на кестреле? Никогда не видел что бы в релизе кестрел стоял не за каким либо балансером с ссл терминейшеном
529 3123575
Учусь по курсам uлерна. Как же мне больно, братишки, с практических заданий из темы алгоритмов. Хочется прям пойти и разбить свою голову, дабы не позорить себя дальше существованием такого отсталого мясного компилятора галлюцинаций в своей черепной коробке. Ну да ладно, пост не про нытье, а совет. Нормально ли скипать темы которые с трудом понимаешь или биться до талого? Просто мне кажется я совсем буксую на месте, боюсь что просто дропну, ну или откладывать буду пока само не дропнется. Что вы собственно в таких ситуациях делали, если встречались с такой проблемой в своем обучении, господа программисты?
530 3123607
Почему css постоянно развивается, а xaml с 2006 топчется на одном месте?
531 3123676
>>123575

>Нормально ли скипать темы которые с трудом понимаешь или биться до талого?


Ни то ни другое. В таком случае нормально возвращаться назад прорабатывать базу и набирать опыт.
532 3123694
>>123575

>из темы алгоритмов


Не нужны.
533 3123797
>>123607
XAML совершенен, а с CSS вебмакаки сами не знают, чего хотят.
534 3124020
>>123797

> XAML совершенен


HJSON совершенен, а хамл ентот ваш зумерский - это дрисня угловатая.
535 3124090
>>124020

>HJSON



>You can specify strings without quotes


Ну чет пиздец как сомнительно.
536 3124110
Аноны, кто-нибудь учавстовал в озоновском курсе по шарпу? Если да, поделитесь опытом, как там набор устроен, большая ли нагрузка, сильно ли ебут? Там вроде набор новый скоро будет, хочу залететь.
537 3126465
Проблема записи логов из статических методов.

Если я записываю экземпляр логгера в статическую переменную:

>private static ILogger _log = Log.Logger.ForContext<MyBaseClass>();


То в принципе все методы могут иметь доступ к этой переменной. Но тогда начинается проблема с логгированием в наследниках класса.

Допустим в базовом классе есть метод ToString(), который пишет в лог:

>if (_log.IsDebug()) { _log.Debug("ToString: {0}", result); }



Допустим я создаю наследника базового класса, и скрываю переменную лога при помощи new

>private new static ILogger _log = Log.Logger.ForContext<MyInheritClass>();



Тогда я запускаю метод ToString() из наследника, но лог записывается применительно к базовому классу MyBaseClass, а не MyInheritClass. Проблема усугубляется, когда куча наследников юзает один и тот же метод, тогда хрен поймешь кто это сделал и когда.

Если же переменная с логом будет не статической, то я могу использовать virtual для переопределения, не понимаю как в статический класс передавать в экземпляр логера. Через параметры? Это же тупо. Нигде я не видел запрос логгера через параметры. Хоть вообще отказывайся от статических методов.
538 3126471
>>126465
1. Наследование чаще залупа
2. DI > static
3. Logging context
539 3126480
>>119056
В любом приложении указан минимальный размер окна.

И если ты, к примеру при помощи SetWindowRect попытаешься указать размер меньший, чем минимальный, то окно уменьшится до минимального.

Конечно можно наговнокодить, например попытаться сжать окно до 1х1 пикселя, а потом замерить фактический размер, но это хрень — это вызывает лишнюю перерисовку окна.
540 3126492
>>126471

> DI > static


Разве это делается для методов? Это делается для инициализации класса.

>Logging context


Не понял. У меня же и так

>Log.Logger.ForContext<MyBaseClass>()

541 3126496
>>126480

>SetWindowRect


SetWindowPos*
542 3126502
>>126492
Зачем тебе вообще статик? Все статики которые обычно юзаются можно подогнать под XxxUtils и экстеншены, то есть логирование там не нужно.
И под контекстом я имел ввиду скоупы которые дополняют контекст для уточнения что и где происходит.
543 3126562
>>126502

>Зачем тебе вообще статик?


Метод вообще не использует данные экземпляра. Да, это по сути утилита или экстеншн, но ей пользуется экземпляр и там есть полезная информация.

>то есть логирование там не нужно


Почему? Есть какие-то правила логгирования?
Предположим у меня задача при помощи API изменить размер окна стороннего приложения. Метод по сути своей статический, но как мне узнать не спамят ли его и какой размер окна требуется?

Может показаться, что это надо сообщать до использования метода, но некоторые методы бывают многоуровневыми, содержащими в себе другие методы, например поиск дескриптора окна, анализ заголовка окна и прочее. И везде есть полезна информация.

>И под контекстом я имел ввиду скоупы которые дополняют контекст для уточнения что и где происходит.


А можно подробнее?
544 3126568
>>126465
Суммарно все звучит как XY-problem. Есть подозрение, что тебе надо максимально уйти от статики.
545 3126582
>>126562
Самое очевидное и простое не юзай статики, регай класс в di и инжекти в него всё что тебе нужно в т.ч. и логгер.
Из-за того что у тебя хитровыебанные статик методы код который их юзает толком даже не обложить тестами, только кучу всего и разом тестить.
Моё представление что статики должны быть максимально простыми что бы там банально нечему было ломаться

Так и гугли dotnet logger context scope. Без структурного логирования имеет мало пользы
546 3126608
А что, майки решили вновь вернуться к впф? В net 9 обещают стилизовать все контролы под 11 винду, улучшить производительность, потенциально даже версию directx обновить. Также все новые issue обязуются рассматривать в течении 3 дней.
547 3126612
>>126608

>В net 9 обещают стилизовать все контролы под 11 винду


господи, наконец-то ...
548 3126706
>>126608

> стилизовать все контролы под 11 винду


Но зачем?
90% кодеров всё равно будут свои стили накатывать.
549 3126707
>>126706
90% как раз не будут
550 3126769
>>126465
Ну если тебе нужно чтобы в наследнике тустринг писал иначе - то тебе ОЧЕВИДНО нужно этот метод переопределять независимо от причин "иначе". И логгер вообще не причем.

>>126612
опять все сломают. они это могут. в итоге простое "переопределить цвет выделения" что раньше легко решалось добавлением цвета в ресурсы с нужным кеем - теперь решается полным переопределением шаблона на 10000000500000 строк
551 3126815
>>126707
Как раз 90% будут. Умник, блять, выискался тут.
552 3126846
>>123575
Просто посмотри решения других людей и проанализируй. Прокручивай код в голове, изменяй и запускай код. В общем думай. Чтобы что-то понять нужно думать. А чтобы уметь думать, нужно учиться думать. Это не происходит автоматически. Смотреть на код не означает обдумывать его.

>>123694
Дурак.
553 3126983
На пердоликс не существует бесплатной среды кроме vs code? В нём вообще реально сидеть на полной основе? или проще спиздить ездуна
554 3126989
>>126983

>vs code


Чего тебе в нем не хватает?
image.png45 Кб, 766x490
555 3127989
>>097760 (OP)
Шарпаны, а что вы будете делать если вам кабан LINQ запретит использовать?
556 3127999
>>127989
Абы да кабы
557 3128018
>>127989
Вспомню, что в шарпе есть синтаксис циклов.
558 3128203
>>127989
Заюзаю F#.
559 3128465
>>127989
Пердёж затроллил пориджей.
560 3129219
Пацаны. Чет я сегодня дикий стыд испытал на работе.
В общем. Позвал чел помочь с кодом.
Код - мой.
2 года назад писал. Я в душе не помню как он работает.
Это был код фронтенда.

Я просто в ужасе.
При этом - коде бекенда - я помню как работает досконально, хотя писал его тоже 2 года назад. Но там - я сразу такой: этот файл, такой-то метод.

Че за срань? Как блин так может быть? Почему я фронтенд пишу на отъебись, а бек - будто преподу буду защищать помню?
561 3129438
>>129219
Я джсий тоже на пофиг пишу. Не ну а чо, язык сам располагает к этому, не моя вина.
15937867776240.png1,3 Мб, 1242x1236
562 3129501
>>129219
Ты закрытый человек — любишь делать вещи, пока никто не видит.
563 3129502
>>129219
Будем честны, для фронтенда нужно больше навыков, знаний и смекалки. Фронтенд это как социоблядь - мы их презираем, но повторить успех не можем. Проще сказать что нам просто не хочется.
564 3129517
>>129502
А я с этим спорить-то не буду на самом деле.
Другое дело, что как фуллстек - я как-то всегда считал, что у меня +- одинаковые навыки и там и там.
А вот как-то так получилось вчера. Спросили по старому коду, который передали другой команде на поддержку. Я смотрю как баран, не понимаю - как я это и зачем писал, и что оно вообще делать должно. 1,5 часа просидел с челом, пытаясь вспомнить свой полет фантазии в тот момент, когда я это высрал.
565 3129546
Кто-нибудь пробовал связку Electron+.net?

Проект просто новый намечается. Кроссплатформенный. Десктопно-мобильный. И надо выбрать на чем UI делать. По результатам исследований три стула: Авалония, Eto.Forms, и как раз электрон.
Почему хочется электрон? Потому что таки в штате есть фронтендеры, которые нормально JS/TS, плюс есть база компонентов для веба, которые можно было бы просто заюзать и радоваться. Но вот про связку с .NET (я так понимаю, что типа надо чтобы .NET приложение было хостом и стартовало всю эту электронофигню) - я не пробовал и опыта не имеется.
С другой стороны - авалония. Выглядит почти как WPF, текущие бекендеры на нем начинали, и опыт как-бы имеется, но тогда всю хуйню визуальную опять придется с нуля хуярить, плюс - фронтендеров если подтягивать - им придется обучаться.
Eto.Forms - из-за этого треда боюсь даже предлагать.
566 3129552
>>129546
А где четвертый стул не с пиками, то есть maui
567 3129553
>>129552
MAUI же оффициально не поддерживает линуксы.
Чи что-то изменилось?
568 3129555
>>129502
Какой ещё успех
Фронтенд это жс
А это как жрать говно
Все эти фреймворки это просто "говно подано в красивой сервировке"
Но это всё равно жрать говно
569 3129560
>>129553
Поэтому это стул не с плоской поверхностью
570 3129613
>>129546
Avalonia + webview
571 3129685
>>129219

> Почему я фронтенд пишу на отъебись, а бек - будто преподу буду защищать помню?


А теперь внимание, правильный ответ: Потому что фронт временен и меняется по велению моды и левой пятки маркетинговых менеджеров. Нет смысла посвящать ему много времени. Быстро загуглил, как биндятся события кнопок к командам вьюмодели, накидал и забыл. А вот бек - пишется на века. Меняется очень редко. Имеет повышенные требования к отказоустойчивости. Над беком приходиться долго думать.
572 3129830
>>129553
всё поддерживает
image.png46 Кб, 864x463
573 3129856
>>129830
Ткни пальцем где. А то я поиск по странице сделал и слова Linux не увидел.
574 3129949
>>129546

> По результатам исследований три стула:


> Eto.Forms


На связи бывший форсер ето.формсов! Вставший на путь истинный, авалониевый. Там мобильный бэкэнд в зачаточном состоянии. А ты

> Кроссплатформенный. Десктопно-мобильный.


Таким образом, увы. Сам проект был бы хорош, но сообщество вокруг него собралось мизерное. Сам автор в одиночку не вытягивает одновременно баги фиксить и фичи допиливать. Проект буксует на уровне прошлого поколения интерфейсов.

Так что ето.стул смело вычёркивай.
575 3129992
Решил GUI немножко изучить для общего равития.
Вот что выбрать то? ВПФ или Мауи? Я так понимаю авалония это библиотека для впф?
576 3129994
>>129992
Склоняюсь к Мауи так как еще и на андройд хотелось б попробовать пописать.
577 3130017
>>129992
Учи винформы.
578 3130067
Реактивный MAUI, есть ли оно в природе?
579 3130094
>>129992
А если мауи, то MAUI app или MAUI Blazor app,?
580 3130103
>>130094
я сам хуй 3аnaet
если ра3ицb! net 3na4it бла3ор
бля neкоторе кHопки Hа клаве Hе работают(
581 3130109
>>130067
Реактивный пакет ставь в проект и большинство современных UI станут реактивными.
Самые известные это
1. ReactiveUI https://www.nuget.org/packages/ReactiveUI
2. Community Toolkit https://www.nuget.org/packages/CommunityToolkit.Mvvm
582 3130116
>>130067
>>130109
Зачем если есть Blazor?
583 3130119
>>130116
Гугл говорит, что это какая-то веб-технология. Эм, што?
584 3130124
585 3130125
>>130094
Очевидно, где меньше замла...
586 3130136
>>129856
Ой... Кажется действительно нету... >_<
587 3130139
>>130119
Ват? Зачем тебе какие то реактивные либы, если есть Blazor?
588 3130141
>>130067
>>130139
Что такое "реактивность"? Часто слышу это от петухов с JS загона но так и не понял.
589 3130146
>>130141
Реактивный интерфейс - это свойство элемента управления вызывать изменения связанных данных или элементов управления из-за динамического связывания или дата-биндинга этого элемента.
590 3130148
>>130141
Реактивность - это то же самое, что асинхронность. Если тебе кто-то говорит, что это не так, шли нахуй этого петуха.
591 3130232
>>130148

>Реактивность - это то же самое, что асинхронность.


Нет.
592 3130236
>>130109
А где в community toolkits реактивность? Почитал описание хелперов, про реактивность ни слова.
593 3130284
>>130232
Петуха ответ.
594 3130401
>>130236
Ценятся не слова, а дела.
595 3130640
>>130141
Это пуш модель. Буквально все выставляет точку (ака поток событий) на которую можно подписаться фильтровать и комбинировать с другими потоками событий.
Как LINQ, но линк начинает работать когда кто то хочет получить результат (pull), а тут все начинает работать по событию (push)

В полной упоротости у тебя весь код представляет собой связанные цепочки с минимумом императивного кода.
596 3130860
>>129992
бамп вопросу
597 3130866
>>129992
Авалонию учи, это самый актуальный фреймворк. Maui параша кривая.
598 3131093
>>130866
авалония прикольная канешн, но она чёт по сравнению с впф раз в 10 больше озу кушает
599 3131137
>>130640
И зачем это нужно?
600 3131188
>>131137
Просто такой подход к кодированию. Более похож на фп
А что хорошего, что в впф есть CommandManager который обновляет все команды, а не только те, что нужно, при смене фокуса?
А тут обновляются только те, что зависят от источника.

Я не знаю как в реактиве в шарпе. Не вижу смысла юзать реактиве в десктопе (не заходит мне), не вижу в асп.нете.

Но я балуюсь котлином под андроидом. И вот там как раз предпочитаю эту модуль "все есть flow", а не императивную модель.
Потому что есть богатый набор функций для подписок, комбинирования, фильтрации и так далее. И все это автоматически подписывается и отписывается реагируя на lifecycle приложения. Я просто прописываю "вот это зависит от этого и когда источник изменится, то и это изменится".

Хотя писать в чисто таком стиле сложно. Читать просто, а вот писать....большинство скатывается в "подписался и вызвал метод в котором выставил свойства вьюмодели". А должен был выставить flow, и все зависимые свойства подписываются на этот источник и обновляются.

Даже банальное db.getUsers() возвращает не список юзеров, а Flow<List<User>>, хотя по факту он выплюнет по готовности список юзеров и все - тогда другие смогут подписаться на этот flow (впрочем то ж котлин - там богатейший набор "хочешь так, а хочешь этак" и обычный db.getUsers() превращается во флоу как 2 пальца)

У тебя в итоге вся система в этих цепочках и где то что то выплюнуло событие (хоть мышеклик)...и полетело это по всем зависимым цепочкам. В силу LINQ подобного синтаксиса описание кода прямо декларативное получается.
601 3131190
>>131137
Те же биндинги в впф имеют такой же подход когда от источника к контролу. Ты просто прописываешь биндинги что от чего зависит (неудобно конечно ибо синтаксис ограничен) и дальше оно просто работает. ты даже не заботишься об отписке биндинга если контрол выпал из вида.

Ну и такое по всей системе
602 3131571
>>131093
Если ты делаешь десктопное приложение для венды, то конечно, нет смысла запариваться со всякими там авалониями. Но анон выше заявил, что хочет сделать кроссплатформу.
Авалония предлагает кроссплатформу искаропки. Все основные десктопы, все основные мобилы и браузерный васм. С единой кодовой базой.

Так что смотрите сами, ребята.
603 3131577
>>130640

> связанные цепочки с минимумом императивного кода


А что такое императивный код?

> выставляет точку (ака поток событий)


Что такое "выставить точку"?

Вопросы не праздные и не троллинг. Это скорее майевтика.
604 3131634
>>131577
Императивный код выполняется построчно как описан
a=1
b=2
c=a+b
В linq ты описываешь декларативно. Ты же не пишешь вручную циклы и условия. Реактиве тот же linq только push

Точка/источник это просто событие в виде iobservable к которому можно прицепиться и писать в linq стиле (в отличие от обычных событий)

Пример винформс без биндинг и впф с биндинг
В виныормс по какому то событию (например сервер ответил и отдал данные) ты пишешь императивный код в котором меняешь состояние нужных контролах

С биндингами (по факту реактивня модель) все контролы будут следить за данными и обновят себя. Тут декларативный подхлд и в идеале только хамл и хватит
605 3131646
У maui Blazor есть проблемы с поднятием клиента websocket? Что-то подобное слышал....
606 3131808
>>131634

> Императивный код выполняется построчно как описан


> В linq ты описываешь декларативно.



Интересно заюлил. Это упоминание маевтики тебя так напрягло? В таком случае следующий вопрос. Почему "построчечность" это императивность, а "поточечность" это декларативность?

Иначе говоря, почему

> делай_раз


> делай_два


> foreach(a in b) делай_три


- это императивность, а

> делай_раз


> .делай_два


> .foreach( a => делай_три)


- это у нас волшебным образом превращается в декларативность?
607 3131966
>>131808
потому что так оно и есть

"Императи́вное программи́рование — парадигма программирования, для которой характерно следующее: в исходном коде программы записываются инструкции; инструкции должны выполняться последовательно; данные, получаемые при выполнении предыдущих инструкций, могут читаться из памяти последующими инструкциями"

то есть описание инструкций по факту и есть выполнение этих самых инструкций при их же описании

а поточечность описывает выполнение декларативно и само выполнение может быть потом и неизвестно каким.

.foreach( a => делай_три) (с точкой) не выполняется прямо в момент когда момент выполнения доходит до
foos.Select(s=>s.Prop).Foreach(a => делай_три)
поскольку это всего лишь определение чего то, что будет выполнено потом и хз как при этом

а напрягает меня капча двача
608 3132001
>>131808
>>131966
Хуйня какая-то.
Императивный — мы описываем КАК мы что-то делаем.
Декларативный — описываем ЧТО мы хотим получить.
мимо
609 3132012
Мнения разделились...
image.png591 Кб, 915x566
610 3132112
Я вот че подумал то
Вот есть у меня тестовое Блазор ВебАссембли приложении. Тупо кнопка которая делает post запрос на сервер, сервер пишет в бд +1 сервер отвечает OK приложение делает +1 в счетчике и кнопка отправки запроса становится снова активной.
Сейчас WA приложение весит 6.3мб. Что дохуя если юзер будут заходить постоянно и нагружать скачиваем клиента сервер.
И вот я подумал мб если приложении будет Сервер то веб сокет соединение будет меньше создавать нагрузки?
Как б мне протестировать 2 приложения и узнать какое меньше нагружает сервер? На сколько открытое ВебСокет соединение будет загружать сервер в сравнении с загрузкой WA клиента и отправкой с его post запроса?
611 3132136
>>132112
Бред шизофреника. За ошибками предложений даже суть не улавливается
612 3132143
>>132112
Современный блазор хеширует твою ВА приложуху на клиенте, чел.

Разумеется, это окупается, если твоя приложуха в ВА делает нечто, что реально требует процессорной деятельности. Ты получаешь профит от толстого клиента, потому что работает юзерский процессор, а не твоей машины.

Если тебе нужно нажать единственную кнопку на страничке, то профита нет. Твой сервер без проблем справиться с соединением, нагрузкой на которое, это буквально выполнить один делегат привязанный к кнопочке в рейзор разметке.
613 3132152
>>132143

>Современный блазор хеширует твою ВА приложуху на клиенте, чел.


Ну при заходе а страницу юзер каждый же раз загружает клиент.

>Если тебе нужно нажать единственную кнопку на страничке, то профита нет.


Ну по сути да, в приложении нет и не предвидится сложных вычислений. Максимум это сложение чисел и показ строк из БД.
614 3132175
Причем вычисляется это очень легко. Допустим, у тебя есть серверная виртуальная машина. На ней тебе доступно, скажем, 4 ядра. Это означает, что тред пул твоей приложухи, на твердую, имеет 4 треда, которые могут работать не мешая друг дружке. Если нажатие на кнопочку занимает один квант серверной ОС, что-то в рамках +-50 мс, и, в момент времени, ты имеешь 4 максимум нажатия, то, в рамках задачи, тебе не нужно ВА... Смело добавь к этому задержки сети + 100 мс сверху, которые юзер все равно не заметит, потому что так говорит статистика.

Если ты планируешь все это усложнять и масштабировать, то сразу закладывай все задержки и просчитывай архитектуру заранее. Делай другой сервис, желательно независимый, чтобы невмешиваться в работу остальных. Вот один из таких сервисов, самый прожорливый на задержки сети и процессорное время, имеет смысл вынести в ВА. Пусть юзер единократно потерпит и скачает сборку ВА, зато твой сервер будет оставаться в рамках адекватной латенси, потому что в тред пуле всегда, или почти всегда, будет хотя бы 1 свободный поток.
615 3132182
>>132152
Не каждый раз, а однократно. В самый первый раз. Восьмой блазор так работает, позволяя выгрузить пользователю компонент в ВА сборке.
616 3132190
>>131966

> не выполняется прямо в момент когда момент выполнения доходит до


> лишь определение чего то, что будет выполнено потом и хз как при этом


> хз как при этом


Вот в этом и проблема. Ты ХЗ как оно там работает, а лезешь умничать.

Надоело в маевтику играть, пишу прямо: линк-код ("реактиве" твое) точно так же императивен, это точно такие же команды. Которые ты командуешь машине сделать. Императивишь, так сказать.

Декларативность в другом, декларативность, когда ты описываешь, что от чего зависит. И что будет для тебя совсем убийственным откровением, декларативный код описывается императивными составляющими. И функциональный тоже. Любой. От императивности в программировании никак не уйти. Всегда будут ключевые слова, команды, говорящие машине "сделай вот это, но не сейчас. а отложенно, в отдельном треде", "посчитай вот эту функцию".
image.png6 Кб, 691x65
617 3132209
>>132175

>ты имеешь 4 максимум нажатия, то, в рамках задачи, тебе не нужно ВА


Ну примерно так и есть. Но подключение то будет всегда держатся открытым.
К примеру если приложение Server 100 юзеров зайдут, будет 100 подключений, юзеры сделают клик, потом так же им передастся какая нибудь инфа к примеру статья и они её будут читать к примеру 10 сек. Всё это время подключение остаётся открытым но не используется. Нагрузка в данном случае будет постоянная.

А если я буду использовать ВА нагрузка будет в момент загрузки приложения и в момент отправки HTTP запросов а сервер.

Собственно если бы у меня были деньги на vds я бы е парился просто подкинул бы монетку и выбрал. \
А с ограничим бюджетом приходится каждую копейку экономить.

А NGINX моё ВА приложение хешиует? Или каждый раз его с диска читает и выдает юзеру?
Мб есть возможность захостить ВА приложение в каком нибудь CDN?

>>132182
Ну вот старицу закрыл, потом сова захожу а её и сова загружает.
618 3132259
>>132209
Вот мое ВА, которое загружается из локального хеша. Нагрузка на сеть пустяковая - геты за датой.

Чтобы показать статью, не обязательно поддерживать СР соединение или выгружать ВА. Можешь отправлять статику в виде компонента. Это можно сделать с помочью минимал апи или с фреймворка восьмого блазора (static SSR). Из минусов статики - 0 интерактивности (она есть, ограниченная, только при инициализации компонента). Можно компенсировать, добавив красоты в верстку с помощью жса. Придется попердолиться с ЖСИнтеропом.

Если идешь по пути ВА, то твой компонент в ВА берет на себя ответственность за интерактивное отображение контентента статьи, делая геты к серверу, когда пользователь нажимает на кнопочки. Например, чтобы перейти к следующей статье. Красоту форнта полностью обрабатывает код на шарпе и css + жс, если ты этого сам хочешь.

Не могу ничего посоветовать с моделью хостинги. В моем случае сервер есть и он всегда живой и оплаченный.
619 3132332
>>132112
Релиз будет меньше, это банально выводится в дебаге + уже написали выше что оно кэшируется и загружается некоторое время только первый раз.
620 3132334
>>132332
Это и есть релиз в 6мб
621 3132353
>>132190
поумничал? молодец

>точно так же императивен


нет не императивен. его можно не называть декларативным (на деле он реактивный и конечно внутри себя он содержит императивный и какой угодно подход), но сам по себе он не является императивным.

для особо умных кто не понимает разницы приведу цитату из вики. она вполне понятна

"К примеру, в императивном программировании присваивание a = b + c будет означать, что переменной a будет присвоен результат выполнения операции b + c, используя текущие (на момент вычисления) значения переменных. Позже значения переменных b и c могут быть изменены без какого-либо влияния на значение переменной a.

В реактивном же программировании значение a будет автоматически пересчитано, основываясь на новых значениях. "

и каждый подход обладает своими особенностями, но это не значит что код состоит только из одного подхода. Однако какой то преобладает и задает стиль.
622 3132447
а можно мл.нет нейронку импортировать из другого проекта? Я уже обучил неплохую, но я переустановил виндовс, поэтому создал новый проект , а в нем мой MLModel2.consumption не работает.
2024-04-2309-29-40.png4 Кб, 582x146
623 3132543
Аноны, наболевший вопрос по WPF. Мне очень часто требуется выводить свойства класса списком. Каждый итем состоит из двух столбцов "описание : значение".

И если для какого-то более серьезного приложением я еще могу заморочиться с версткой, то для приложений на скорую руку верстка этих списков превращается в какой-то долбаный пожиратель времени.

Хочется видеть контрол в виде док-панели или стак-панели, но в котором можно было описание итема указать через прикрепляемое свойство (и в котором можно указать зазор между итемами, но это другой вопрос). Что-то типа этого:

> <local:CustomPanel>


> <TextBox local:CustomPanel.Caption="Width:" Text="{Binding Width}" />


> <TextBox local:CustomPanel.Caption="IsEnabled:" Text="{Binding IsEnabled}" />


> </local:CustomPanel>



и автоматом получить пикрилейтед. Есть идеи как это сделать? Дело в том, что для стак-панелей, док-панелей, юниформ-гридов нет стилей. У меня есть идея создать свой кастомный контрол, в который будут добавляться две стак-панели при помощи темплейтов в стилях.

Еще рассматривал вариант сделать какой-то конвертер значений, который бы при помощи рефлексии переводил свойства класса в словарь, а уже этот словарь при помощи DataTemplateSelector обрабатывал бы ItemsControl. Только тут две проблемы:
1) как автоматически связывать и отвязывать свойства.
2) не все свойства нужно выводить
624 3132548
>>132543
Обосрался с примером разметки. Вместо двух текстбоксов должен быть один текст бокс и один чекбокс.

> <local:CustomPanel>


> <TextBox local:CustomPanel.Caption="Width:" Text="{Binding Width}" />


> <CheckBox local:CustomPanel.Caption="IsEnabled:" IsChecked="{Binding IsEnabled}" />


> </local:CustomPanel>

1713865743376.png18 Кб, 914x157
625 3132736
>>132543
То что ты хочешь называется propertygrid и гуглится. Изучи вопрос.
626 3132857
>>132736
О, пасиб. Это то что нужно.
image.png97 Кб, 359x500
627 3133194
>>132736

>Изучи вопрос.

image.png1,3 Мб, 2263x980
628 3133634
Оказывается придумать а потом еще и сделать так как придумал дизайн пиздец какая сложная задача(
Как и где можно просто спиздить дизайн?
Хотя и пизздить у меня е получается(
Сейчас css это пиздец полный
629 3133667
>>133634
Спроси в треде HTML-программистов.
630 3133775
>>133634
Забей, CSS проектировали для бездумного макакинга и вникать в него это дело непродуктивное, просто делай потом если чё перепишешь.
1713957254451.gif12 Кб, 220x129
631 3133924
>>133194
Ты-то чего триггернулся?
632 3133928
>>133634

> Оказывается придумать а потом еще и сделать так как придумал дизайн пиздец какая сложная задача(


Теперь ты не будешь кудахтать на Артемия Лебедева, что он получает огромные бабки за рисование двух прямоугольников?
633 3134258
>>133634
Та не.
Если делаешь один - все вполне нормально.
Вот когда подключается пара других человек, которым ты объясняешь, а они дохуя хотят проявить творческую жилку и хуярят хуй пойми что - вот тогда да. Пизда. И проблема в том что на ревью же не завернешь, если не собирать и смотреть что ж там эти наверстали.
В этом большая сложность. И как спастись от нее - хуй его знает.

CSS - учится за 3 часа, если чо.
634 3134348
>>134258

>CSS - учится за 3 часа, если чо


И вечность как это потом использовать
image.png86 Кб, 1102x743
635 3134472
Вот смотрите
Есть такие вот фреймворки
https://github.com/ant-design-blazor/ant-design-blazor
https://github.com/radzenhq/radzen-blazor
https://github.com/microsoft/fluentui-blazor?tab=readme-ov-file
https://tabblazor.com/
Объясните зачем это всё нужно?
Там же дефолте кнопочки-таблички. Ну да готовые кнопочки, но бля а если они хуево сделаны?
Я вижу единственный профит в использовании это в интерпрайзе без особой ебни клепать стандартны UI про которое пользователь скажет "норм", и это в случае когда у бекендера просят сделать еще и фронт, а он такой ну ок ебану как могу а могу только так.
В чём я не прав?

На клаве е работают копки так что е обесудьте, печатая в помощью экрраки+ ерабочей клав.
636 3135310
>>134472
Затем, что делать нормальную библиотеку своих компонентов - пиздец трудоемкая задача, особенно, если у вас нет отдельного подразделения для вротендеров-десигнеров, либо если это подразделение собрано из вчерашних студентов.
Ну так вот. А показывать сырой ХЭТЭЭМЭЛ/Обвешанный бутстрапом - моветон, ты показываешь это заказчику/менеджерам, они морщатся и решают что вы хуйней страдаете, хотя может быть все остальное охуенно.
Так вот. Такие вот хуевины - позволяют взять 1-2 вротендеров, чтобы они биндили карточки-таблички к тому что бек отдает и это минимально было ок для глаза, а когда настанет час X, и продукт будет достаточно развит, приносить деньги, и будет то самое отдельное подразделение смузихлебов фронтендеров-дизигнеров, которые сидят, хуярят презентации и поясняют как margin: 5px улучшит восприятие пользователями наполнения - тогда это все легко выбрасывается и вы пилите свое.

Эх. Блядь. Как у меня горит что девекспресс - санкционный. Это литерли была серебрянная пуля чтобы хуйнуть быстро все че надо, потом можно чутка обмазаться какими-нибудь чартами красивыми и либой для анимашек - и все текли. А сейчас - всякое попенсорсное, которое больше самому допиливать до вменяемого состояния. Пиздец как горит.
637 3135968
>>135310
Чё, авалония хуже девэкспресса? Не верю. Поясни на примерах.
638 3136104
>>135968
Надеюсь когда нибудь ты поймешь, насколько глупый вопрос задал.
639 3136156
>>136104

> Вместо пояснения на примерах, троллит переходом на личности.


Ну здесь всё предельно ясно.
640 3136216
>>136156

> троллит


Значение знаешь? Пойми, дурачок, ты буквально спрашиваешь, почему кирпич хуже пентхауса. Осознай всю нелепость вопроса.
641 3136254
>>113075
А вообще, я тут поресерчил и наткнулся на CommunityToolkit. У них есть классная штука - Мессенджер. Все классы, наследуемые от ObservableRecipient могут как получать так и отправлять сообщения через него под капотом используются слабые ссылки. Таким образом можно в родительской вью модели подписаться на запросы навигации, и в других вьюхах просто слать реквесты, и не нужно писать тонны бойлерплейта. Пожалуй теперь буду проектировать архитектуру на его основе.
642 3136275
>>136216
Из кирпичей авалонии можно построить пентхаус красивее и эффективнее впф-параши прибитой гвоздями к венде. Осознал. Спасибо.
643 3136435
Пацаны. Бекендеро-макака на связи.
Тут внезапно назревает десктопный проект.
Так вот. Я тут понял, что нихуя не понимаю за архитектуру десктопа. Единственное что хочу, чтобы был модульным, и можно было докинуть dll и новая фича впиндерилась САМА. Ну, типа видел похожее во фрутилупсах, когда игрался и кажется пиздец крутой хуйней.
Вот.
МБ кто-то поделится проектами опенсорсными на дотнете под десктоп, которые, так сказать - ОБРАЗЦОВЫЕ. Чтобы можно было поглядеть, че там да как, чтобы бест практис перенять.
644 3136492
>>136254
не слабые ссылки, а дефолтный общий мессенджер если не передал ему другой тип мессенджера или конкретный.
645 3136523
>>136275
ага, как только победишь шрифты
646 3137075
>>136523
А что не так со шрифтами? Я б с удовольствием победил, только очерти проблему.
647 3137120
>>137075
мыльные они
и, в отличие от впф, чинятся так себе. Поэтому они в авалонии и крупнее ибо мыло.
648 3137147
>>137120
За шрифты там отвечает встроенный пакет harfbuzz, соотвесна, если тебе что-то не нравится - настраиваешь его. Я с шрифтами проблем не вижу.
649 3137156
>>137147
А ты смешной. Во первых для его настройки придется самому компилять авалонию, а во вторых, сколько не настраивай, а directwrite из него не сделаешт.
650 3137162
>>137156
Во-первых, повторюсь, я не вижу мыла.
Во-вторых, ничего компилять не нужно. Идёшь в документацию harfbuzz и разбираешься. Я вместо тебя этого делать не буду.
В третьих. Harfbuzz используется отдельно без авалоний всяких, это нугет-пакет, и пользователи не жалуются. У одного тебя мыло. Я делаю вывод, что ты несёшь хуйню.
image.png6 Кб, 327x91
651 3137174
>>137162
То, что ты пиздоглазый тупой сектант все уже поняли. Но я все же потрачу время, и покажу наглядный пример всратых шрифтов в авалонии.
652 3137177
>>137162

>Во-вторых, ничего компилять не нужно. Идёшь в документацию harfbuzz и разбираешься. Я вместо тебя этого делать не буду.


Ты правда какой-то блаженный, если не понимаешь, что для изменения таких вещей как рендеринг необходимо залазить в самые кишочки фреймворка
653 3137180
>>137162

>В третьих. Harfbuzz используется отдельно без авалоний всяких, это нугет-пакет, и пользователи не жалуются. У одного тебя мыло. Я делаю вывод, что ты несёшь хуйню.


Конечно не жалуются, ведь шрифты рендерит не harfbuzz, тупой ты ебанат. А вот жалоб на хуевые шрифты в Skia в том числе в хроме вагон и маленькая тележка. Но гуглу поебать, на мобилках то норм.
654 3137300
>>137174
>>137177
>>137180
Вот поэтому я и не использую говнолонию, а юзаю православный Eto.Forms, у которого кодовая база с lookless-контролами разворачивается в один из выбранных бэкендов, например на ВПФ для венды.
655 3137311
>>137300
Твои говноформы уже обоссали несколько тредов назад, за добавкой пришел?
656 3137314
>>137311
Обсираешь етоформсы = обсираешь ВПФ.
657 3137323
Помогите, у меня сломался впф! Все кнопки как в виндовс 98! даже при создании нового проекта! Я уже что только не делал, манифест подсовывал. Ничего не помогает!
658 3137335
>>137323

>Помогите, у меня сломался впф! Все кнопки как в виндовс 98!


Так это же охуенно. Я бы на твоем месте пытался выяснить как это специально повторить.
659 3137343
https://vc.ru/design/1147966-skolko-stoit-mobilnoe-prilozhenie-v-2024-godu
Норм статья? Ценам можно доверять, как по вашему опту то?
660 3137350
>>137335
Ну хз, после майских сделаю дамп венды. Чем дампнуть, чтобы ИТТ выложить на анализ?
661 3137433
>>137335
А что тебя смущает.
Я бы только за MVP цену снизил раза в 2, а за готовый продукт наоборот поднял в 1.5-2 раза.
662 3137435
>>137314
никоим образом.
663 3137572
Я тут с удивлением осознал, что в современных xaml фреймворках uwp, winui, maui нет cleartype, из-за чего шрифты выглядят как говно в сравнении с wpf
664 3138684
>>137572
Более того, если ты выставишь у себя на венде DPI выше 100% (от дефолтного, в терминах венды) ты охуеешь от того, что большинство из них превращаются в ещё более лютое мыло.

И только православный винформс, написанный ещё дидами, уверенно держит ровные линии без мыла.
665 3138709
>>138684
ну так в формсах другой тип рендера
а вообще зачем выставлять больше дефолтного?
если ты про 4к дисплеи и всякие ретины то WPF имеет средства для настройки рендера

в далекие времена написал заглушку
TextOptions.SetTextFormattingMode(window,
Dpi >= 144 ? TextFormattingMode.Ideal : TextFormattingMode.Display);

TextOptions.SetTextRenderingMode(window, TextRenderingMode.ClearType);

правда не проверял на ретинах ибо нет их у меня, так что делал больше для фуллхдшных, а на ретинах и так хорошо же.
666 3139530
Выбор между вебдевом и разрабом на юнити. Цель - ненапряжно работать, а в свободное время лепить свою игрушку(подтянуть рисование, в 3д потыкать).
Как я понимаю если прямо сейчас вкатываться в юньку у меня в перспективе будет только лепить гиперказуальное говно для галеры, где меня заебут переработками? Стоит ли в таком случае вкатиться в вебразраба и уже оттуда заниматься своей хуйней? Что вообще думаете про геймдев нынче?
667 3139532
>>139530
Места в вебе больше. Да и в целом у тебя выбор не веб или гейдэв, а бизнес или гейдев
668 3139533
>>139530
Геймдев говно с низкими зп и переработками. Веб единственное нормальное направление. Но после тяжелой рабочей недели у тебя уже не будет сил сидеть на выходных и ковырять свою игру, имей в виду.
669 3139535
>>139533
Смотря какая неделя и где работать. У меня порой бывает очелло, а порой даже желание что то на выхах попилить остаётся
670 3139659
>>139533

>Но после тяжелой рабочей недели


Я не планирую тяжело работать. Планирую найти работку на парттайм или ненапряжный проект. В ущерб своей ЗП и перспективы конечно же.
671 3139715
>>139659
Было бы всё так просто я бы тоже .5 залетел а не фуллтайм
672 3139716
>>139659
Единственный адекватный вариант работать парттайм - это устроиться на фуллтайм, делать свою работу за половину времени, а остальное время чилить или заниматься своими делами. Но чтобы такое получалось, надо быть не начинающим, а очень крутым специалистом.
673 3139719
>>139530

>Цель - ненапряжно работать, а в свободное время лепить свою игрушку(подтянуть рисование, в 3д потыкать).


Есть вариант. Устраиваешься на какой-нибудь завод за 30К, там периодически подкручиваешь для теть срак из бухгалтерии какое-нибудь древнее говно на .NetFramework, остальное время гоняешь чаи и пилишь свою игрушку.
674 3140938
>>097760 (OP)
а ведет/вел кто план-график задач?
просто хочу составить для обучения и я как то затерялся.
для диплома по С# надо что то сварганить по базе данным (тут бы подошел наверн больше php, но мне в будущем для геймдева не особо нужен будет) и статью написать.
675 3141036
>>140938

> но мне в будущем для геймдева не особо нужен будет


... опыт кодинга не зависит от языка. Жаль что ты этого не способен этого понять на своём уровне, и вдвойне жаль, что ты не способен поверить в это. Ты 20 лет будешь делать неинтересную тебе хуйню, на нелюбимом тобой языке, чтобы через 20 лет понять, что тот анон был прав 20 лет назад, который написал, что...
676 3141061
Копайлотом для Студии кто-то пользуется? Дадите фидбек?
677 3141064
>>141061
Чем копать?
678 3141215
>>140938

>а ведет/вел кто план-график задач?


Если ты под 'план-график' подразумеваешь, что-нибудь вроде диаграмм Ганта, то в соло это нахуй не нужно. Когда лидом станешь, тогда и научишься. Для разработки в одного или миникомандой в 2..3 человека достаточно простейшей канбан-доски.
679 3141226
>>141036

>... опыт кодинга не зависит от языка.


В большинстве случаев зависит. Каждый язык прививает свои привычки, обусловленные либо спецификой, либо особенностями/ошибками дизайна языка. И очень часто те кто пытаются пересесть с одного ЯП на другой перетаскивают все эти особенности за собой и нужно время (иногда достаточно продолжительное), чтобы от них избавиться и переключиться на другие парадигмы.
Говорить о том, что "язык не влияет" можно только в случае хорошей теоретической и практической базы в самих основах информатики.
680 3141228
>>141226

>Говорить о том, что "язык не влияет" можно только в случае хорошей теоретической и практической базы в самих основах информатики.


Чего у большинства тех кто сейчас изучает программирование нет. (забыл дописать)
681 3141460
>>141226

> хорошей теоретической и практической базы в самих основах информатики


Спасибо моему учителю. Земля ему пухом.
>>141228
Всё время забываю, что я уже старая школа и современные зумеры не знают даже половины того что знаю я.
682 3141897
Если 2 приложения пишут и читают с одной sqlite бд, не будет ли проблем?
Делаю ТГ бота и админку к нему в web. Норм идея сразу из приложений обращаться к бд?
Или делать микросервис который бы писал и читал бд? Что то типо TgBot+WebApi_Bd+WebAdmin
683 3142102
>>141897

>Если 2 приложения пишут и читают с одной sqlite бд, не будет ли проблем?


Multiple processes can have the same database open at the same time. Multiple processes can be doing a SELECT at the same time. But only one process can be making changes to the database at any moment in time, however.
684 3142108
>>141897
Вообще, в принципе, плохая идея подключать к одной БД (любой ) более одного приложения.
Максимум какой-нибудь мониторинг поверх навешивать, но и то это только на уровне select-ов будет.
685 3142123
>>141897
При частой записи легко поймаешь database locked
686 3142144
>>142108
Что для тебя приложение?
Две апихи одна для интеграций и а другая для фронта это разные? А два+ инстанса одного сервиса при горизонтальном масштабировании? Что на счёт коннекшен пулов которые повсеместно?

Где ты вообще услышал такое?
687 3142145
>>141897
sqlite плох для активной многопоточной записи.
не знаю как реализация от майков, но стандартная подвержена проблеме

1 первый поток пишет
2 второй поток видит локед и ждет
3 первый поток освободился пришел еще один - база свободна, начинает писать
4 второй поток (из пункта 2) проснулся и снова проверяет можно ли писать - а там локед и он снова ждать
в итоге все влезают впереди второго потока и у того истекает таймаут

если меньше писать, увеличить таймаут, то проблема будет иметь меньшую вероятность встречи, но по хорошему нужно писать в порядке очереди. И если даже для одного приложения это неудобно, то для двух тем более.
688 3142291
>>142144

>Две апихи одна для интеграций и а другая для фронта это разные?


Ну я хуй знает, как это у тебя построено, может у тебя это одно приложение, а может и разные.
Если же ты под "API для интеграций" для интеграций, подразумеваешь непосредственный доступ к БД - земля тебе пухом, братишка.

>А два+ инстанса одного сервиса при горизонтальном масштабировании?


Не вижу проблемы. Горизонтальное масштабирование подразумевает, что экземпляры приложений будут идентичными. По сути - то же самое, что запустить несколько потоков в одном приложении.
А там разговор про разные приложения с разным функционалом, когда каждое приложение творит в БД свою собственную хуйню.
Опять же, я не говорил, что этого нельзя делать или запрещено, я сказал, что это плохая идея. Т.к. возможные сайдэффекты в будущем в большинстве случаев перевешивают пользу сейчас.
689 3142563
>>141897
В контексте пишут-читают.
Делай третье приложение, которое полностью владеет базой.
Далее. Разбей апи этого приложения на запись-чтение.
Запись - выполняй в одном потоке, через очередь.
Чтение - через WAL можно нормально организовать из пачки потоков, если не критично, что какие-то данные могут устареть, если критично - таки через тот же поток читай.
Далее. С SQLite - неочевидно, но даже если ты там кольцевой буффер намутил - эта хуйня не умеет чистить сама себя, что логично. Потому - тебе периодически надо Vacuum дергать, либо собирать SQLite с автовакуумом, иначе, через полгодика-годик оно тебе все место спокойно сожрет, если в базу активно пишут-удаляют.
690 3142570
>>142563
Знал бы ты как я svn ненавидел из-за раздувания sqlite файла до размеров в гигабайты. А ещё и тупейший вакуум с подходом stop the world
691 3142571
>>142570
А я знаю. На одном из мест работы - это чудо эксплуатировалось активно.
image.png38 Кб, 601x396
692 3143354
>>142102
>>142108
>>142123
>>142145
>>142563
Всем спасибо.
Решил всё такие MVP делать в одном приложении что бы было быстрее, потом если у бота будет популярность переделаю на 3 приложения.

Вот у меня вопрос по кешу
Есть
IMemoryCache cache;
И еще есть
MemoryCache cache;
В интерфейсе нету Count а в классе есть. Это как так? Что юзать? Нихуя не понятно, я начал чета юзать класс MemoryCache. Там типо делается так Get(key) и получаю object который потом нужно привести к к своему типу, чета я подумал что так будет долго и написал свой "кей" Dictinary<long,MyClass>. В кеше нужно юзать я так понял TryGetValue но его в классе нет он в интерфейсе, корочи нихуя не понятно.

И еще я сцыкнул конструкции
cache.TryGetValue(id, out User? user);
Вот у меня есть класс Storage он Singleton, в нем тот самый кеш. Таски обращаются за инфой в хранилище и хранилище возвращает к примеру User? user, что будет если первый таск выполнит строчку cache.TryGetValue(id, out User? user); далее пойдет дальше, а вэто время второй таск тоже выполнит эту же строчку, не изменится ли значение User? user?
Сейчас у меня пикрил, нужно ли там лок вставлять?
693 3143621
>>143354

>В интерфейсе нету Count а в классе есть. Это как так?


а вот так. клиенту для работы с кешем нужно читать и класть в него (что и предоставляет интерфейс). Ему знание Count не нужно.

>TryGetValue но его в классе нет он в интерфейсе


такого быть не может. если есть в интерфейсе - есть и в классе. Иначе класс просто не сможет реализовать интерфейс (и не скомпилится)

>Сейчас у меня пикрил, нужно ли там лок вставлять?


угу, будет двойное выполнение и нужно от этого защищаться. Так что нужно либо лок, либо кешировать Lazy<T> (что впрочем тот же лок только в профиль)
694 3143637
>>143621

> если есть в интерфейсе - есть и в классе


В какой то версии ебанулись и ввели дефолтную реализацию в интерфейсах
695 3143715
>>143637
которая ограничена тем что публично. Так что формально такие вещи существуют, но написать ты такой метод не можешь - у тебя просто не к чему внутри него обратиться для его работоспособности.
696 3144649
Пацаны.
Чем такой код хуже стандартной фигни с OnPropertyChanged в каждом классе который реализует INotifyPropertyChanged?
697 3144676
>>144649
Ничем не хуже. Фактически ты повторил реализацию из Reactive UI.
698 3144687
>>144676
Хм. Я умный получается?
Просто сейчас - начинается проект с десктопом, и я чет курю мануалы, как там в шарпах писать этот десктоп. Меня смутило что в туториалах в каждом классе этот OnPropertyChanged. Десктоп трогал последний раз, когда WinForms были актуальны.
699 3144693
>>144687
Ну, да, выходит так.
700 3144698
>>144687
Твой метод требует оптимизации чтобы меньше рефлексировать каждый раз, а также не учитывает что значение не изменилось и нечего шуметь (на деле это должно быть настраиваемое)

А так - вот эту писанину лучше доверить Fody или еще чему нибудь вон как в комьюнититулкит.
701 3144730
>>144649
Тем, что нужно использовать this, что бред само по себе, когда можно просто реализовать в родительском классе.
702 3144733
>>144649
Ну и в целом, рефлексия это медленно и еще у тебя нет проверки на равенство
703 3145793
Пачаны, нид хелп.
Я не писал апих на шарпе, ток лабы в унике.
Сейчас хочу перебраться со своих пердей, где есть дноработка на ноде+реакте в дс1/2 и пересесть на асп нет.

Так вот, подскажите, пожалуйста, что наиболее часто юзается в норм местах? В плане брокеры, grpc, и прочие штуки типа yarp.

И если есть какой-то убергайд в виде видосиков, курсов или еще чего, приближенного к реальному положению дел, буду очень признателен.

заебало педалить всякую рандомную хуйню в черную, хочу спокойно педалить че-то одно и в команде а не в одно ебало :c
704 3145815
>>145793

> убергайд в виде видосиков, курсов или еще чего, приближенного к реальному положению дел


Видосы Шмачилина на ютубе.
705 3145845
>>145815
чет мемное? там ток впф и 2.5 видоса выдало
706 3145900
>>145845

> чет мемное?


Да.
Легенда треда.
708 3146553
Ребят, ищу первую работу и выслали тестовое задание, к сожалению, я его сразу не уточнил, т.к. только бегло просмотрел, времени не было. И теперь вообще не вдупляю пункт 2.2 (про xml):

- Создать MVC веб-приложение, которое позволяет пользователям вводить и хранить документы в базе данных PosgreSQL;
- Документ должен представлять собой понятие - Договор на оказание платных услуг, содержащий в себе номер и дату договора, а так же возможность указывать строки (смету) - название и цена.

2. Взаимодействие с базой данных PostgreSQL:
- Настроить Entity Framework для работы с базой данных;
- Настроить обращение к базе данных из приложения на ASP.NET. Документ должен передаваться в хранимую процедуру в форме XML, результатом должна быть сумма цен всех строк документа.

Выглядит так будто нужно просто из БД в UI вернуть сумму строк, но причём тут XML? Прямо в процедуре брать данные из таблиц и превращать их в XML, просчитывать сумму и возвращать в .net приложение её?
Или что, dto документа из UI слоя превращать в XML и передавать в БД? Но причём тут тогда результат...

Может кто мысль подтвердить или новую подкинуть? Сам виноват, что не уточнил, теперь боюсь им писать.
709 3146561
>>146553
Ну нахуй. XML это либо госы либо ебанутый легаси на дотнет фреймворке, что из этого хуже стоит ещё подумать
710 3146620
>>146553
уточняй. Ничего плохого не случится.
если это так сократили "у нас выгрузка в виде xml туда сюда пук вот и база данных, готово", то нужно уточнять. ТЗ должно быть ясным. Если они считают что тз ясное и вопросы не нужны - неча тебе там делать.
А если в хранимке хмл крутить, то это дичь - неча тебе там делать 2.0
711 3146658
>>146553

>теперь боюсь им писать.


Не бойся. Очень часто в тестовых заданиях оставляют непонятки, как раз на тот случай, чтобы посмотреть умеет ли кандидат уточнять требования по ТЗ.
Если спросят, почему сразу не уточнил, можешь сказать, что занят был всем остальным функционалом, который понятен.
>>146561

>Ну нахуй. XML это либо госы либо ебанутый легаси на дотнет фреймворке, что из этого хуже стоит ещё подумать


Ты удивишься, но до сих пор половина бизнеса и весь банкинг на xml-ках работают. Многие причем просто пересылая их в виде файликов друг-другу через фтп или каталоги на серваках.
Конечно такая дичь, как запихивать xml-непосредственно в sql, встречается крайне редко и это действительно долбоебизм. Но сам формат xml - это база.
712 3146660
>>146658

> Ты удивишься


Не удивился. Разве не об этом я и написал?
16721289485620.gif4,6 Мб, 450x278
713 3146661
>>146553
>>146620
Поддвачану, написано так как будто UI должен конвертить документ в xml, xml в бд процедуру, а процедура должна считать в xml'e цену, но делать такие операции на стороне бд это немного шизофрения.
Уточни у них, если это так советую сказать им что ты перезвонишь.
714 3146664
*под UI я имел ввиду приложение само собой
>>146661
715 3146711
>>146660

> Разве не об этом я и написал?


Ты написал, что xml - это либо госы, либо легаси.
А я написал, что весь бизнес и почти весь банкинг на них работает.
716 3146717
Ладно, спасибо, ребята. Уточню завтра.

Других вакансий всё равно в моём городе пока нет, либо эта, либо "инженер-программист" на нпп/заводы, выбирать особо не приходится.
717 3146742
>>146717

> либо "инженер-программист" на нпп/заводы


А я бы пошёл. Но увы.
718 3146764
>>146661

> но делать такие операции на стороне бд это немного шизофрения.


Че эта?
Удобно. Допустим, настроил триггеры, у тебя этот XML сразу в БД формируется. Сверху можно еще вебхуки дергать по завершенюи транзакции, чтобы результирующий XML сразу отдавать куда надо. Одни плюсы короче. Ноль минусов.
719 3146822
>>146764
Удобно. Хз только, зачем вообще тогда нужен дотнет, если можно всё делать на хранимках, как деды.
720 3146831
>>146822
Так говоришь, как деды, будто что-то плохое.
А дотнет нужен потому что можно бысто круды хуярить, плюс - всякие там идентити, двухфакторные аутентификации, ну, там, ты понял.
Просто если вопрос про интеграцию дохуя всякого с одной базой - ну реально оказывается часто что БД это самый удобный узел системы, через который можно все со всем подружить.
721 3146911
>>146717

>Других вакансий всё равно в моём городе пока нет


Советую тогда не гнать лошадей, а сделать все пусть и неторопливо, но качественно, уточняя непонятные моменты (в меру конечно).
У меня в свое время товарищ будучи с нулевым стажем, не зассал и залетел на джун-плюс позицию, просто потому что основательно выполнил тестовое. Даже с учетом того, что он сделал его за две недели вместо одной как просили, но он задавал нормальные вопросы, проявил инициативу, попросил отсрочку с прицелом не на то, что он не успел, а что хочет сделать нормально.
722 3146914
>>146764

>Одни плюсы короче.


Есть один минус. Тот кому придется это дорабатывать за тобой - проклянет тебя, выследит и выбьет из тебя все дерьмо.
723 3147604
Надеюсь здесь люди, разбирающиеся в win2d и direct2d. Я столкнулся с одним странным багом - если отрисовать на холсте только текст, то он будет смещен на 1 пиксель вниз, из-за чего появляется мыло. Однако если вместе с текстом нарисовать хоть какую нибудь фигуру, то смещение пропадает. Это очень бросается в глаза, когда пишешь текстовый контрол с мигающей кареткой. При чем проблема только на масштабе не кратном 50 (125%, 175% и тд). Это можно как-то пофиксить?
724 3147654
>>147604
Помогло включение опции NoPixelSnap при рендеринге текста
725 3147660
>>147654
Нашел еще решение ещё лучше, вместо использования dips включил пиксели
726 3147719
Сейчас стою перед выбором, куда вкатываться основательно: к вам или к жабапидорам. Пробовал и то, и то - шарп нравится больше, но чет я наслушался про то, что работу тяжело найти и перекатиться в европку/швятые потом тяжело, и вообще работы нормальной нет, одно легаси говно. Это близко к правде, или это завистники слухи распространяют?
727 3147752
>>147719
Жава и шарп на рынке - занимают +- одинаковое пространство. Жава была сильно популярна на мобилках, пока не появился котлин.
.NET - для серверов считай второй по популярности стек, после LAMP
По кол-ву работы, если в мире - +- одинаково. Если в РФ, тут как обычно - надо распилить осводить бюджет, потому переписываем старое-негодное на ПХП/Жаве на что-то более модное-молодежное, похуй что потеряем половину функционала, зато модное ГОвно или еще что-то.
В РФ шарп активно применяется в проебизнесах, вузах, производствах и как клей чтобы несколько систем друг с другом сдружить.
Плюс. На шарпе есть юнька, которая конечно обосралась, но все еще замены ей внятной нет.
728 3147785
>>147719

>перекатиться в европку/швятые потом тяжело,


Язык программирования будет одним из твоих последних и незначительных препятствий при переезде.

>и вообще работы нормальной нет, одно легаси говно. Это близко к правде, или это завистники слухи распространяют?


Работы дохуя, но не для новичков.
Насчет легаси его полно и на шарпе и в джаве. Но есть ньюансы (чисто мои наблюдения, не претендую на истину). В джаве легаси размазано ровным слоем по всему рынку и ты с ним столкнешься практически везде куда бы ни пошел. В шарпе же легаси сосредоточено в отдельных отраслях - промышленность (те самые заводы), прикладные области, десктоп, древний internal web и т.д. Если идти куда-нибудь в финтех, B2B, продуктовые галеры, то там большую часть уже переписали на .Net6 и под линукс/контейнеры, есть места где уже в 8-й переходят. В шарпе как раз таки проще чем в джаве относятся к "выкинуть старое - написать новое", т.к. переезд со старых версий относительно не болезненный (опять же по своему опыту), плюс он в принципе без особых проблем ложиться на модное нынче импортозамещение (на те же российские линуксы с винды переходить на раз-два)
729 3148322
Как через апи картинку на клиент передать?
730 3148323
>>148322
Как в документации к апи написано - так и передавать.
731 3148324
>>148323
А если я её делаю?
732 3148328
>>148324
Значит, ты передаешь картинку НЕ через АПИ.
733 3148365
>>148328
Я тестовое делаю :(
734 3148527
>>148322
Смотря что ты подразумеваешь под API. Делать GET-запрос и в ответ получать image/png - это API? Или там шизозадание, где картинку надо закодировать в Base64 и передать внутри жсона?
735 3148539
>>148527
А в чём шиза?
Base64 гарантирует корректную передачу по сети.
Жсон универсальный формат, прочитается в любой среде на стороне получателя.
Шиза-то в чём?
736 3148557
>>148539
загрузи гигабайтный файл - и десериализуй на стороне получателя чтобы достать файл. И вопросы отпадут
737 3148565
>>148557
Я што дурак гигабайтный файл целиком грузить? Я его разобъю на фрагменты, и base64 поможет мне их собрать обратно на стороне получателя.
738 3148658
>>148565
грузить во много запросов вместо одного? ну ты даешь.
739 3148683
>>148322
>>148365
Чел, половина учебных проектов в веб-разработке - это буквально аналоги какого-нибудь онлайн маганзина (страничка каталога или экран корзины), или какой-нибудь еще херни с показом картинок (по подиночке или каруселью) и т.д. Если ты этого не знаешь или не можешь нагуглить, то слишком рано ты за поиск работы и тестовые зядания принялся.
740 3148880
Аноны, возникла потребность реализовать простенький текстовый редактор для десктопа. Из функционала печать текста и задание выделенной области различных свойств (жирность, курсив, шрифт, размер, цвет и тд). И я сейчас пытаюсь придумать, как реализовать хранение свойств. Пока есть идея делить текст на отдельные блоки с одинаковым форматированием. Но тогда будет жопа, если я выделю половину одного блока, и половину другого, установлю общую жирность, и мне придется каждый блок делить на два отдельных. Уже предвижу тут миллион возможных багов. Плюс не ясно, как выделять текст с такой логикой. Либо хранить для каждого блока его позицию в строке или параграфе, но тогда после добавления текста в один блок придется пересчитывать координаты последующих, либо хранить только текст и при каждом перемещении каретки вычислять позиции блоков заново.
741 3148899
>>148880
Кури docx или rtf или ещё какой формат. Уже всё придумано
742 3148953
>>148899
Ну покурил, там так и есть, весь текст разбит на отрезки текста с одинаковым форматированием. Но из структуры формата не ясно, как все таки реализовать выделение
743 3149243
>>148880
В чем проблема просто маркдаун использовать?
Во-первых, сам формат оч простой.
Во-вторых, при желании пользователь может открыть без всей этой ебатории с какими-то там редакторами.

Но если совсем простенький текстовый редактор, то вообще - можешь обойтись простым RichTextBox, тот все что тебе надо умеет. Тебе сверху накидать кнопок и заменять текст в выделенной области на те какие тебе там надо.
744 3149246
>>149243
Анон, проблема не в самом формате, тут я уже определился, проблема именно в процессе работы с текстом. То есть как хранить свойства во время работы, чтобы все работало быстро. И желательно логика была как можно проще.
А richtextbox увы, с одной стороны слишком сложен, а с другой в нем много всего прибито гвоздями. Я сейчас для рендера текста использую DirectWrite (IDWriteTextLayout), там куда больше возможностей для кастомизации текста, притом всю сложную работу вроде bidi и переноса строк он делает сам. Мне остается только скармливать ему текст и устанавливать свойства для отдельных промежутков. Плюс мне нужна высота строк для отрисовки линовки.
А markdown насколько мне известно не поддерживает толком форматирование разные шрифты, размер и тд текста.
745 3149289
>>149246

> То есть как хранить свойства во время работы, чтобы все работало быстро.



В виде дерева.
0ac13798e2e9cf0907a15e794a891e2a.jpg53 Кб, 474x711
746 3149297
Пацаны. Случилось страшное. Продукт дорос до состояния, когда им пользуются.
Собственно. Встала проблема. А как багрепорты и вообще вот это все получать?
Типа, от пользователя - не дождешься, чтобы он пояснил, че он вообще делал. Если кто-то и обращается, то в духе: ничерта не работает, ну вы и говно сделали, чините. Тестировщики - чуть лучше, но не сильно, типа да, описывает проблему, описывает шаги, но не повторяется проблема.
В общем. Я не хотел, но видимо придется впиндерить телеметрию. Чтобы в случае чего - можно было больше инфы иметь.
Но тут несколько проблем.
1. Я считаю что эт не оч этично. Типа, даже если пользователь дал согласие.
2. Как эту телеметрию делать правильно - я не ебу. Типа, ну, допустим, будет просто собираться какой-то дамп со стейтом и улетать на сервер. Хорошо, но типа это сразу сервер нужен дополнительный, нужно как-то это анализировать удобно, ведь без нормальныйх средств, это все равно что текстовые логи попросить, просто большой кусок данных, который хуй проанализируешь нормально.

В общем. Я прошу советов мудрых. Как таки упростить мне жизнь как разрабу, чтобы баги в проде легче находились и хотя бы понимать последние действия пользователя, которые выявили багулину.
1715243297501.png9 Кб, 395x401
747 3149410
>>149297
А как это сделано у других? Вот посмотри и повтори. Чо там сложного?
748 3149412
749 3149583
>>149289
Не мог бы ты развернуть мысль?
image.png422 Кб, 1136x991
750 3149817
>>149583
А что собственно развивать?
Твой текст - некий документ.
Значит что? Значит тебе нужна некая объектная модель того, как этот документ представлен в приложении.
Ну, а как быстро ходить по объектной модели документа, менять что-то в ней, совершать классические операции всякие типа добавить к куску документа стиль и прочее? Правильно, представить в виде дерева объектов. Корнем - является этот самый документ, а дальше - какие-то твои объекты, которые описывают структуру документа, какие стили к чему применяются, какие данные лежат где и прочее. Так ты просто можешь найти текущий кусок документа, и при редактировании - просто добавить либо данные, либо новую ноду, в которой лежит стиль который тебе нужен и прочее.

Можешь не изъебываться со своим форматом, а взять какой-нибудь готовый. В любом случае в твоем приложении он будет представлен в виде дерева, потому что операции с деревьями это быстро, это просто, это удобно для тебя как разработчика.
751 3150262
>>149817

>потому что операции с деревьями это быстро, это просто, это удобно для тебя как разработчика.


>операции с деревьями


"Но как же так, мне же сказали, что алгоритмы не нужны..."
Чет, слегка ржу.
752 3150266
>>150262
Пользуюсь хешсетом и словарем не вникая в реализацию (и тем более не пишу свою)
Мне пора уходить из профы?
753 3150276
>>150266

>Мне пора уходить из профы?


Пиздовать нахуй, мелким и быстрым шагом. Только не по тем причинам которые ты указал, а потому, что не можешь в юмор, слишком туп, чтобы за контекстом беседы следить и задаешь дурацкие вопросы.
754 3150395
Аноны, кто работает в энтерпрайзе, ваше мнение по поводу стремительно распространяющийся заразы Go и как с этим бороться разработчикам? Менеджеры хайпуют язык, спонсируя на кабаньи деньги митапы и конференции гошникам, и игнорируют современный дотнет. C# остается очень недооцененным на рынке (рф).
1715328947062.png62 Кб, 919x737
755 3150401
>>150395

> и как с этим бороться разработчикам?


Скрывать го-треды.
Игнорировать го-посты.
image.png72 Кб, 993x771
756 3150590
>>150395

>как с этим бороться разработчикам?


Показывай им подобные картинки.
757 3150625
>>150590
Справедливости ради, горутины не совсем таски. Плюс - сами по себе эти горутины - ну, пиздец какая удобная залупень. Я серьезно хотел бы чтобы что-то такое было в шарпе.
Типа пишешь метод как обычный синхронный, но при желании - берешь и запускаешь его как асинхронный, без всякой ебанины. С тасками - ты обязан сделать выбор: либо асинхронщина, либо синхронщина.
758 3150827
>>150625
а я бы не хотел. ничего не знаю про го, но знаю про котлин. и за "выглядит как синхронный код" приходится платить высокую цену с "работа с исключениями ад" и с тасками на 10 порядков проще.
759 3151023
>>097760 (OP)
Шарпаны, есть какие-нибудь нормальные печатные материалы по OpenTelemetry в разрезе Asp.Net Core. Только что-нибудь последовательное, где слона едят по частям. А то в большинстве случаев берут приложение, накидывают в него сразу кучу говен в виде метрик, трейсов, логов и т.д., потом запускают дашборд - "смотрите, как заебись". А что из этого зачем и что делает не очень понятно.
760 3151029
>>151023

>Шарпаны, есть какие-нибудь нормальные печатные материалы по OpenTelemetry в разрезе Asp.Net Core.


?
Знак вопроса забыл.
image.png154 Кб, 747x822
761 3151566
Как перебороть желание переписывать каждый раз Program.cs в прикриплейд? Может быть расскажете про скрытые подводные камни от этого, чтобы я уж точно перестал так делать. Потому что я чувствую себя ебанатом каким-то, который делает хуйню никому не нужную.
Для себя я оправдывал это вот чем. Типа юнит-тесты же. Вот. И вот таким макаром - можно было тестировать, что все правильные зависимости проставлены, все такое. Плюс, что приложение правильно стартует, правильно останавливается. Но все равно выглядит как страдание хуйней ненужной. Но желание переписать чтобы не как у других было - никуда не девается.
762 3151698
>>151566

>Как перебороть желание


Да не, норм все. Я тоже подбным страдаю наслаждаюсь постоянно. Только мне поебать на юнит тесты, я хочу маленькую компактную точку входа из которой вызываются нужные расширения для подключения нужного функционала.
изображение.png16 Кб, 742x209
763 3152064
Как в студии/vs code сравнивать жирные по количеству свойств объекты? Я хочу просто скопировать 2 объекта в отладке в текстовом виде (в виде значения свойств) чтобы понять в чем проблема. Всякие ozcode, object dumper не помогают, проект на дотнете 8 (мб поэтому не работают). Гребаное окно интерпретации не показывает все свойства а именно обрезает выхлоп и оставшиеся свойства для копипаста в kdiff не глянуть. Как заставить долбаное окно интерпретации выводить все, без долбаного обрезания?
764 3152315
>>151023
Раз выдалось время на выхах решил замутить один сервис и в рамках него упороться в otel.
Курю доку майков, доку отеля, сорсы на гитхабе и ещё этот видос глянул https://www.youtube.com/watch?v=bYc7u9HFG0s

С виду должна получиться пушка гонка
image.png284 Кб, 1844x1109
765 3152321
>>152064
Консоль в дебаггере в помощь
766 3152439
>>152064
nuget - JsonDiffPatch.Net
Может выдать json со списком отличий свойств одного объекта от другого. А ты уже с этим json-ом можешь делать, что хочешь для удобства представления инфы. Еще умеет сравнивать объекты разных типов по одноименным свойствам.
767 3152493
>>152315
По итогу сам отел взлетел с пол пинка с метриками и трейсами, а вот выбрать куда писать то ещё приключение.
По итогу остановился на егере (query и collector. agent решил не поднимать) с эластиксёрч стораджем (разбираться с не очень подходящей под это кассандрой нет желания). Сам эластик у меня уже есть, но давно хотел заменить на опенсёрч, надеюсь jaeger-collector не будет выёбываться
768 3152602
>>143715
А кто мешает присобачить к интерфейсу метод расширения
bool XXXMethodName(this IMyInterface interface, string[] arg)
{
try {return interface.InterfaceMethod()}
catch {return null}
}
769 3152640
>>152602
Что метод расширение, что метод в интерфейсе - никто из них не может обращаться к приватным полям класса.
770 3152718
>>152640
Я ошибся, и хотел ответить больше про методы, которых нету в интерфейсе

А вообще, РЕФЛЕКСИЯ
771 3152738
Как происходит событие FrameworkElement.Loaded? Как вообще родительский контрол "запускает" дочерние элементы, провоцируя OnLoaded?
772 3152746
>>152738
Да просто в определенном месте кода вызывается Invoke у делегата, который в свою очередь вызывает выполнение привязанных методов.
773 3152750
>>152746
Какого делегата?
774 3152912
>>152738
ну это тебе нужно копать исходники как происходит взаимодействие с фреймворком. Только зачем оно надо.
775 3152921
>>152750
Который привязан к событию.
776 3155367
>>152738

Примерно так, лол.

class FrameworkElement{

private void Load()
{

DoInternalLoadStuff();

var handler = Loaded;
if(handler != null) handler(this, CreateLoadedEventArgs());

}}
777 3155473
Вот как нормально-то имплементировать богатую модель, если типа для каких-то операций нужны другие сущности?

Я про что говорю. Вот допустим, у меня есть модель:

class Project(string name, string description, DateTime created, List<ProjectTask> tasks);
class ProjectTask(string name, string description, List<Employee> employees, TimeSpan estimatedDuration);
class Employee(string Name);

Вот, я хочу создать в проекте задачу и добавить туда сотрудников.
Но логика такая, что я не могу добавить сотрудника, который уже в другом проекте и у него по таскам - выходит так, что рассчетное время больше чем рабочих часов за время длительности проекта.

Ну. Вы поняли. Типа, если сотрудник и так загружен - логика такая, что нельзя незначить серху задачу.

Вот допустим - я делаю это в Project, как корневой сущности. И выходит, что я должен из одного проекта иметь доступ ко всем проектам, еще я должен иметь постоянный доступ к БД, чтобы вот эту вот логику реализовать.

Но ведь получается бредово же. Для другой операции с этой моделью мне не нужна никакая база, но я ее все равно пропихну. Или ок, я буду в методе требовать базу, но тогда тот кто дергает - должен предоставить эту базу. Короче. Выходит в любом случае какая-то хуйня.

Просто я почему спрашиваю. Мне скучно делать анемичную модель. Но вот попытки сделать богатую = выливаются в то, что становится тупо неудобно кодом пользоваться.
Как быть? Кто-нибудь пробовал на серьезных щах богатую модель делать, чтобы оно работало нормально?
778 3155782
>>155473

>Но логика такая, что я не могу добавить сотрудника, который уже в другом проекте и у него по таскам - выходит так, что рассчетное время больше чем рабочих часов за время длительности проекта.


Выглядит так, что во первых ты пытаешься запихнуть дракона в ослицу, т.е. это совсем не их логика. Во вторых как будто для такого нужны собственные сущности над ними. Типа "рабочая загрузка" или общий "план-капкан" или еще что-то, что по иерархии имеет доступ ко всему что в него будет входить (проекты, работники их загрузки и т.д.)
>>155473

>Просто я почему спрашиваю. Мне скучно делать анемичную модель. Но вот попытки сделать богатую = выливаются в то, что становится тупо неудобно кодом пользоваться.


>Как быть? Кто-нибудь пробовал на серьезных щах богатую модель делать, чтобы оно работало нормально?


Ну вот потому обычно реализации DDD у многих и выглядит как говно, т.к. сначала нашлепают анемичных моделей, а потом начинают вносить в них логику, которая "типа" им подходит или близка им по смыслу. А идти это должно в первую очередь от архитектуры и от грамотного ТЗ где прописываются все взаимосвязи и сценарии и ограничения. Но т.к. нормальные аналитики это редкий зверь, архитекторы, чаще всего просто бывшие аналитики имеем стандартные проекты ложащиеся на обычную слоеную архитектуру с анемичными моделями. Просто потом приходит ПМ, лид или еще кто и "пацаны у нас теперь все по ДДД, го запихивать весь service layer в домен"
779 3156033
>>155782
Ну. Допустим, в моменте с проектированием, я согласен.

Но вопрос про то как инфраструктуру и слой приложения на это натягивать.

Вот теперь у меня есть некий "Календарный план". Ок. Ему все равно же надо иметь доступ к БД, либо какой-то репозиторий/юнит оф ворк ему скармливать, либо тот же сервис, чтобы уже можно было что-то из этого делать. И получается, что я либо раздуваю конструктор, либо кучу параметров в метод передаю, либо создаю мусорные классы, для передачи разом настроек и зависимостей для этой операции.
780 3156143
>>156033
Ну честно говоря я х.з. как оно прям правильно. Но то с чем я работал по сути все равно имело отдельный DAL слой с репами и uow. Репы были тупыми, но могли работать со спецификациями. А спецификации были частью доменного слоя. Ну и сервисный слой так же сохранялся. По сути логика оказывалась размазанной между моделями/спецификациями и сервисами их обслуживающими.
Опять же всякие валидации тоже были либо в конструкторах моделей, либо в виде отдельных валидаторов, так же привязанных к сущностям.
781 3156647
Почему когда я пытаюсь запустить задачу асинхронно, я не могу передать свойства в качестве параметров?

>Task.Run(() => MyFunctionAsync(this.MyProperty));



Но такой вариант исключений не вызывает:

>bool myProperty = this.MyProperty;


>Task.Run(() => MyFunctionAsync(myProperty));

782 3156652
>>156647
Исключение в первом случае:

>System.InvalidOperationException: "Вызывающий поток не может получить доступ к данному объекту, так как владельцем этого объекта является другой поток."



И почему исключение говорит о другом потоке, когда речь идет об асинхронной функции?
783 3156667
>>156652
Потому что асинхрон работает поверх потоков.
784 3156685
>>156667
Хорошо, а как меняет ситуацию тот факт, что я свойство сохранил в переменную и передал ее в качестве параметра асинхронного метода?

Ведь переменная создана не в том потоке, что и выполняемая задача, а в том потоке, что и свойство. Что поменялось?
785 3156747
>>156685
Свойство это ссылка на метод, переменная полученная из свойства это уже ссылка на объект.
786 3157047
>>156685
Task.Run(() => MyFunctionAsync(this.MyProperty));

сначала запустится задача (на пуле потоков), задаче будет выделен поток и уже потом пойдет чтение this.MyProperty и ругается именно get метод свойства MyProperty потому что программист в него проверку запихал

никакой шарп никакие потоки не проверяет.
787 3159839
Как с помощью EF сделать вот такое:
У меня иерархическая структура.
Но т.к. поиск всех потомков рекурсивно долго - я делаю хак: в строке храню путь к родителю. Получается в духе 1.2.3, 1.2.4, 1.2.5
Вот.
Это оч сильно ускоряет поиск дочерних узлов. И работу с ними в общем случае.
Так вот. Теперь я хочу при изменении у родителя родительского узла - всем потомкам изменить.

На базе триггеров - это делается изи. Просто триггер на упдейт и все. Кайф. Красота. Все так же быстро и красиво. Одной транзакцией - хуяк и хоть миллион записей проапдейтили.

Но мы же говорим про ЕФ и независимость от базы. Так вот. Делать это на уровне приложения - это пиздец заеб, медленно и вообще, ебатория, если дерево здоровое.

Есть ли какие-то паттерны как не делать триггера но чтобы было быстро? Переход на носкуль не предлагать.
788 3159874
>>159839
Переходи на здравый смысл.
789 3159879
>>159874
Ну, т.е. не париться и сделать нормальный триггер как человек?
790 3159881
>>159879
Здравый смысл состоит в том, чтобы понимать, когда ORM полезны, а когда вредны.
791 3159991
>>159881
Всё просто
Всегда полезны и всегда вредны
792 3160109
Кто-нибудь пробовал слоеную архитектуру на вертикальные фича-слайсы переделывать?

Просто вот я фуллстек, и на фронте как-то само собой получалось, что чтобы не возиться со всей этой ебаторией с миллионом папочек - ты в определенный момент решаешь: вот у меня папочка, в ней ВСЕ что мне нужно. И было на самом деле удобно.

Но на бекенде я как-будто боюсь отойти от того как учился все это время делать. А потому - по шаблону: App.Application, App.Core, App.Infrastructure, App.Hosting, App.WebAPI, App.Bootstrap и вот это вот все.
793 3160174
>>160109
Для этого как раз и подходят всякие DDD, CQRS и т.д. Но опять же для этого архитектуру не переделывать нужно, а буквально пилить с нуля под такой функционал.

Хотя по сути на бэке всегда проще перекрыть интерфейс. Нет входящих данных - нет работы. Ну и тупо хостед-сервисы на паузу ставить.
794 3160234
Кто-нибудь прям кайфанул от "static abstract interface members"?
Не просто использовал а-ля "T Sum<T>(T[] array)", а для чего-нибудь более серьёзного: статические свойства имплементации интерфейса, переиспользование кода, оптимизации и т.д.
Например, как в дотнете в TensorPrimitives, где они используют один метод для множества операций, а операции реализуются через структуры:
https://source.dot.net/#System.Numerics.Tensors/System/Numerics/Tensors/netcore/TensorPrimitives.Abs.cs,d460a0e95bc8bd56
А то во многих выступлениях/презентациях/блогах по C# 11 упоминали какую-то мелкую хуйню, ну максимум упоминали generic math и этот "T Sum<T>(T[] array)".
795 3160287
>>160234
Использовал, когда на одном проекте надо было эндпоинты спрятать за фича-флагами.
Забыл что это добавили и сначала так горел, что надо ручками все это дело потом подрубать где надо.
Потом вспомнил и сильно кайфанул.

Ну, чтобы понятно было.

inteface IEndPoint<TRequest, TResponse>
{

Task<TResponse> Handle(TRequest request);

static abstract void ConfigEndpoint(IServiceCollection services);

static abstract void AddEnpoint(IWebApplication app, IConfiguration config);

}

И к этому делу - ConfigEndpointsFromAssembly(Assembly), AddEndpointsFromAssembly(Assembly)

В общем вышло оч аккуратненько и удобно. Так что в принципе понравилось.
796 3160335
>>160234
Чем вас методы расширения не устраивают?
797 3160421
>>160287
Интересно Прозвучало как-будто мне похуй, но нет, мне реально было интересно.
>>160335

>Чем вас методы расширения не устраивают?


В смысле? А причём здесь методы расширения?
798 3160597
>>160234
>>160335

Ниже я написал только про generic'и, а ведь эту фичу можно использовать и без generic'ов. По типу:
interface ICommand
{
static abstract string Description { get; }
}
или как в >>160287

Вот более простой пример:
IParsable<TSelf>
https://learn.microsoft.com/en-us/dotnet/api/system.iparsable-1?view=net-8.0
Позволяет написать generic метод парсинга: "T Parse<T>(string text) where T : IParsable<T>"

Что они в дотнете и сделали (пример посложнее), добавив доп. интерфейсы с некоторыми методами и свойствами:
https://source.dot.net/#System.Private.CoreLib/src/libraries/System.Private.CoreLib/src/System/Number.Parsing.cs
IBinaryIntegerParseAndFormatInfo<TSelf> и IBinaryFloatParseAndFormatInfo<TSelf> - для парсинга и форматирования.
IHexOrBinaryParser<TInteger> - используется в методе для парсинга из двоичного и шестнадцатеричного представления (для 10-тиричного представления там всё немного сложнее, поэтому там отдельный метод).
И вот один метод TryParseBinaryIntegerHexOrBinaryNumberStyle<TChar, TInteger, TParser>() который парсит из этих 2-х представлений. И он один может парсить разные типы целых чисел (все базовые integer типы: Int8, UInt64 и т.д.) благодаря всем этим интерфейсам и доп. типам (HexParser<TInteger>, BinaryParser<TInteger> и т.д.).

А вот почему ещё реализации IHexOrBinaryParser<TInteger> (HexParser<TInteger> и BinaryParser<TInteger>) являются структурами:
Все типы которые метод может парсить являются Value types, и в перечисленных методах и интерфейсах используются generic'и, а значит для метода TryParseBinaryIntegerHexOrBinaryNumberStyle<TChar, TInteger, TParser>() JIT сгенерирует отдельный оптимизированный (это важно) код для каждой комбинации generic аргументов и заинлайнит все нужные методы у этих generic'ов. Благодаря этому этот один(!) метод также эффективен, как если бы они написали метод для каждого целого типа отдельно (10 * 2 = 20 методов - 10 типов и 2 формата (двоичный и шестнадцатеричный)). В итоге: лучше поддерживаемость кода (нет кучи методов с почти одинаковым кодом), производительность (как если бы написать методы под каждый тип).

Вообще, когда первый раз такое видишь очень тяжело понять что происходит и зачем такие сложности.
Поэтому пример с TensorPrimitives лучше всех, потому что чтобы им добавить новую операцию нужно написать совсем немного кода который описывает саму операцию, а не целый метод, который нужно оптимизировать, векторизироввть и т.д. Вот чтобы добавить побитовой And: https://source.dot.net/#System.Numerics.Tensors/System/Numerics/Tensors/netcore/TensorPrimitives.BitwiseAnd.cs

Так что теперь generic'и решают проблему дублирования кода ещё лучше.
798 3160597
>>160234
>>160335

Ниже я написал только про generic'и, а ведь эту фичу можно использовать и без generic'ов. По типу:
interface ICommand
{
static abstract string Description { get; }
}
или как в >>160287

Вот более простой пример:
IParsable<TSelf>
https://learn.microsoft.com/en-us/dotnet/api/system.iparsable-1?view=net-8.0
Позволяет написать generic метод парсинга: "T Parse<T>(string text) where T : IParsable<T>"

Что они в дотнете и сделали (пример посложнее), добавив доп. интерфейсы с некоторыми методами и свойствами:
https://source.dot.net/#System.Private.CoreLib/src/libraries/System.Private.CoreLib/src/System/Number.Parsing.cs
IBinaryIntegerParseAndFormatInfo<TSelf> и IBinaryFloatParseAndFormatInfo<TSelf> - для парсинга и форматирования.
IHexOrBinaryParser<TInteger> - используется в методе для парсинга из двоичного и шестнадцатеричного представления (для 10-тиричного представления там всё немного сложнее, поэтому там отдельный метод).
И вот один метод TryParseBinaryIntegerHexOrBinaryNumberStyle<TChar, TInteger, TParser>() который парсит из этих 2-х представлений. И он один может парсить разные типы целых чисел (все базовые integer типы: Int8, UInt64 и т.д.) благодаря всем этим интерфейсам и доп. типам (HexParser<TInteger>, BinaryParser<TInteger> и т.д.).

А вот почему ещё реализации IHexOrBinaryParser<TInteger> (HexParser<TInteger> и BinaryParser<TInteger>) являются структурами:
Все типы которые метод может парсить являются Value types, и в перечисленных методах и интерфейсах используются generic'и, а значит для метода TryParseBinaryIntegerHexOrBinaryNumberStyle<TChar, TInteger, TParser>() JIT сгенерирует отдельный оптимизированный (это важно) код для каждой комбинации generic аргументов и заинлайнит все нужные методы у этих generic'ов. Благодаря этому этот один(!) метод также эффективен, как если бы они написали метод для каждого целого типа отдельно (10 * 2 = 20 методов - 10 типов и 2 формата (двоичный и шестнадцатеричный)). В итоге: лучше поддерживаемость кода (нет кучи методов с почти одинаковым кодом), производительность (как если бы написать методы под каждый тип).

Вообще, когда первый раз такое видишь очень тяжело понять что происходит и зачем такие сложности.
Поэтому пример с TensorPrimitives лучше всех, потому что чтобы им добавить новую операцию нужно написать совсем немного кода который описывает саму операцию, а не целый метод, который нужно оптимизировать, векторизироввть и т.д. Вот чтобы добавить побитовой And: https://source.dot.net/#System.Numerics.Tensors/System/Numerics/Tensors/netcore/TensorPrimitives.BitwiseAnd.cs

Так что теперь generic'и решают проблему дублирования кода ещё лучше.
799 3160608
>>160597

>10 * 2 = 20 методов - 10 типов и 2 формата


40 методов, ведь ещё есть UTF-8.
800 3162025
>>160608
ох если бы еще дженерик методы были так же эффективны в своем вызове....

какая же конченная капча просто пи....
801 3162223
>>162025

>ох если бы еще дженерик методы были так же эффективны в своем вызове....


Эффективны? В смысле производительность? Можешь пояснить чуть более подробно, что ты имеешь ввиду?

Если про производительность, то только виртуальные generic методы ужасно медленные:
https://devblogs.microsoft.com/dotnet/performance_improvements_in_net_7/#jit-helpers

>you may have heard the refrain that generic virtual methods are relatively expensive. They are, comparatively.


>GenericNonVirtual 0.4866 ns


>GenericVirtual 6.4552 ns

802 3162238
>>162223
щас уже не найду но была статья на хабре где рассматривался один случай что дженерик начинал работать медленнее стоило добавить в класс еще один пустой метод который и не вызывали вовсе. Что то там из за размера кеша методов. не помню. Про виртуальность или нет - тоже не помню.
803 3162242
>>162238
Приходит муж с работы, а жена ему сообщает новость:
- Ты только представь, наш сосед Иванов выиграл в лотерею ВОЛГУ!!!!
Муж говорит:
- НЕ ВЕРЮ!!!
Жена?
- Ну пойди проверь!
Муж уходит.... Возвращается через полчаса и говорит:
- Не Иванов, а Рабинович, не в лотерею, а в преферанс, не Волгу, а три
рубля, не выиграл, а проиграл.
804 3162246
>>162242
И тем не менее. Я не припомню чтобы там речь шла про виртуальные дженерик методы. Это вообще редкость - виртуальные методы такого рода в силу малой нужности.

А в шарпе этого хватает - вон Method Group и лямбда, казалось бы ну в чем разница, а бенчмарк вам растолкует. Я давно не следил за темой, но разве пофиксили?
805 3162248
>>162242
не говоря уже про new T(), который под капотом - УНЫЛОЕ Activator.CreateInstance[T].

Кто-то соптимизировал это наконец? Ответ знаете сами. Сколько десятков тысяч лет ждать фикса?
806 3162263
>>162242
ну вообще то ты прав. В преферанс
это было на ютубе.
https://www.youtube.com/watch?v=9OjWL4gP1Jo
и вот сам ишью
https://github.com/dotnet/runtime/issues/3877
никакой виртуальности там нет.
807 3162264
>>162238
Наоборот. Пустые методы фиксили производительность.
808 3162268
>>162264
да. поэтому и 3 рубля. Я ж не слон все помнить. Но саму суть это не меняет - у дженериков есть траблы которые влияют на перфоманс и мне по душе когда это фиксят разрабы CLR, а не всякие хаки дрюки.
809 3162286
>>162238
Я верю, ибо кодовая база райнтайма (особенно C++ часть) это сплошная каша, в которой куски времён .NET Framework'а (хоть их и уже практически нет), просто старый код или старые реализации для которых уже давно существуют современные альтернативы, и т.д. Там даже в большинстве своём C++ 03.Так что я не удивляюсь багам/странностям рантайма и JIT'а. Ну хоть NativeAOT они писали "по-современному" (очень много рантаймового кода на C#, C++ код по-новее и т.д.), вон даже exception handling они портировали из NativeAOT в CoreCLR:
https://github.com/dotnet/runtime/pull/88034

>>162263

>https://github.com/dotnet/runtime/issues/3877


>никакой виртуальности там нет.


Как я понял это был баг

Вон у них сколько висел другой баг (и то они пофиксили только частично):
https://github.com/dotnet/runtime/issues/6924

>Unused generic type parameter should not cause loader failure


>Nov 2, 2016



>>162242

>не говоря уже про new T(), который под капотом - УНЫЛОЕ Activator.CreateInstance[T].


Generic math частично заменяет это и теперь можно писать что-то типа T.Create(...) с соответствующими интерфейсами которые T реализует (что конечно не всегда возможно).
810 3162298
>>162286

>Как я понял это был баг


Баг. Но фикс лишь исправил иерархический поиск на "ищи сразу в глобальном кеше методов, что не самый оптимальный путь и хак "добавь пустые методы" не потерял актуальности.

>(что конечно не всегда возможно).


именно. конструкторы есть у всех, а эти интерфейсы не у многих. Поэтому добавление такого констрейна у дженерика попросту невозможно.
Им что жалко сгенерить какое нибудь подобие экспрешена раз уж CLR не может в нужное? Вижу что жалко.
811 3162322
>>162298

>Им что жалко сгенерить какое нибудь подобие экспрешена раз уж CLR не может в нужное? Вижу что жалко.


Видимо не в приоритете. Особенно после того как они добавили generic math.
812 3162328
>>162322
и то верно. у шарписта лоб большой - он запомнит все эти подводные камни. это ж вам не пхп где...ой.

Щас не знаю, а вот помню менял енумы (интовые) на прямые инты - скорость была х4. Спрашивается, ну как так то. Ответ - а вот так вот.
813 3162338
>>162328

>и то верно. у шарписта лоб большой - он запомнит все эти подводные камни. это ж вам не пхп где...ой.


Вообще они считают, что простой шарпист не должен упарываться во все эти мелочи (они и у себя некоторые ручные микро оптимизации отсекают с мыслью "этим должен заниматься JIT" (и потом улучают это в JITе только лет через 5)).

>Щас не знаю, а вот помню менял енумы (интовые) на прямые инты - скорость была х4. Спрашивается, ну как так то. Ответ - а вот так вот.


А вот тут хотелось бы поподробней.
814 3162363
>>162338
Просто заменил switch case с enum на просто числа.
815 3162378
>>162363

>Просто заменил switch case с enum на просто числа.


JIT походу (как всегда) обосрался, хотя разницы в кодегене не должно быть.

Капча с таймаутами..., как троллинг какой-то...
816 3162429
>>162378
Троллинг - это когда капча 404 not found, чтобы покупали пасскоды.
817 3162942
Почему когда я меняю тип возвращаемого объекта в переопределяемой функции, то студия не ругается? Это легально?
818 3162955
>>162942
А ты любишь чтобы тебя ругали? Мазохист?
А вообще гугли ковариантность и контрвариантность
А к ним еще in/out в описаниях типов
819 3162958
>>162942
Смотря что ты делаешь. Если возвращаемый тип наследует или реализует интерфейс нижележащего метода то схуя бы ему ругаться?
820 3162992
>>162958
Да я менял вообще на рандомный тип и не ругалась. Например реализовал интерфейс IClonable для собственного
класса с методом
public virtual object Clone()
а в наследнике переопределял
public override string Clone()
И студия даже не задала вопросов

>>162955
Чтобы понимать, что я делаю не так. Если я заменю тип в параметре переопределяемого метода, то студия ругается, а здесь почему-то нет.
821 3162994
>>162992
А string это по твоему не object?
И почему ты постоянно говоришь про студию если у тебя тупые вопросы к компилятору?
822 3163011
>>162994
ааа, вот он че. Вот я дебил.
823 3164385
Вроде не видел здесь упоминания.

Deep .NET
https://www.youtube.com/playlist?list=PLdo4fOcmZ0oX8eqDkSw4hH9cSehrGgdr1

>Writing async/await from scratch in C# with Stephen Toub


>Deep Dive on LINQ with Stephen Toub


>An even DEEPER Dive into LINQ with Stephen Toub


>Deep Dive into RegEx with Stephen Toub


>A Complete .NET Developer's Guide to Span with Stephen Toub



И почему они раньше не запилили это?
824 3165619
https://www.youtube.com/watch?v=ueO5Cb3Emcw
Майки контент подвезли...
825 3165654
>>165619
Выглядит интересно, но в том виде в котором показано на видео пиздец как сомниительно. Функционально ннчего не добавляет, но вносит кучу путаницы между реальными свойствами и новыми расширениями, которые под них маскируются, но по сути остаются обычными методами. А так же между наследованием и explicit расширениями. Я уже прямо предчувствую пучок вопросов для джунов на собесах, аналогичным тем как ведут себя конструкторы и переопределения, при наследовании А от Б от С и т.д. Только тут нужно будет запоминать кучу особенностей поведения для цепочек расширений.

Ну и опять же нужна будет нормальная поддержка в IDE, чтобы со всей этой кашей работать. Как минимум выделять всё это в отдельную категорию, чтобы можно нормально было все это отслеживать.

Ладно, мне все равно еще как минимум год с .net6 только работать, так что когда я с этим столкнусь, оно надеюсь будет уже допилено до вменяемого состояния.
826 3165680
>>165619
Вот раньше было Array.Length и Array.Count()
И как бы сразу понятно, что предпочтительнее. А теперь любую залупу будут пихать в свойство — просто потому, что лень писать скобочки.
827 3165922
>>165680
Ага, а еще обязательно какая-нибудь залупа с сериализацией/десереализацией вылезет.
828 3166020
>>165654
Свойства без хранения самого свойства или без переопределения существующих выглядит как ерунда. Лучше бы сделали прикрепляемые свойства для обычных классов, раз уж на то пошло.
829 3166246
List<int> test = new List<int>();

var t1 = test.Count;
var t2 = test.Count();
В чем разница? Что юзать то нужно?
830 3166250
>>166246
Нажми ф12 на каждом и посмотри
2024-05-2311-23-47.png22 Кб, 787x811
831 3166419
>>166250

>Нажми ф12 на каждом и посмотри


Майкрософт скрыла свой код, там разве что можно посмотреть сигнатуру.
Лучше использовать https://source.dot.net/ и забивать в поиск искомый класс. Вроде есть расширения для студии, которые по сути при нажатии F12 автоматом перекидывают на страницу source.dot.net, но мне показалось это неудобным калом т.к. перебивает работу F12 в других случаях.

>>166246
Count() это метод расширения для Enumerable — базового класса List. Задача которого быть универсальным для большинства коллекций. В качестве параметра, этот метод принимает объект, реализующий интерфейс IEnumerable, поэтому метод вообще не вдупляет какой реальный тип у коллекции, а ведь у каждого типа свои методы получения количества итемов. К примеру у списка за это отвечает свойство Count, а у массива — свойство Length. У некоторых вообще нет ничего подобного, поэтому приходится вычислять count методом перебора итемов энумератора.

Короче, внутри test.Count() все сводится к первому варианту test.Count + проверки на тип и выбор самого оптимального варианта. И самое главное, свойства Count и Length уже хранят готовые значения, в то время как метод Count() будет выполнять проверки каждый раз, когда ты этот метод запускаешь.

Поэтому вариант с расширением используют для чего-то универсального, для чего можно пожертвовать производительностью, хотя и это можно свести к минимуму, если понимать как работает Count() — просто не пихать его, например, в циклы, а заранее вывести результат в переменную.

Но если у тебя есть доступ к конкретному свойству конкретного типа, то лучше использовать это свойство. И самому надо стараться делать свойства с таким же подходом и не пихать в них громадную логику.

Поэтому ты наверно понял, какую свинью могут подложить разработчики с новыми расширениями, маскируя метод под свойство. И ведь кто-то возьмет и напишет это

>for (int i = 0; i < n.Count; i++) { }


А внутри будет запрятан метод Count() который каждый раз перебирает коллекцию. И этот перебор будет происходить при каждой итерации цикла.
2024-05-2311-23-47.png22 Кб, 787x811
831 3166419
>>166250

>Нажми ф12 на каждом и посмотри


Майкрософт скрыла свой код, там разве что можно посмотреть сигнатуру.
Лучше использовать https://source.dot.net/ и забивать в поиск искомый класс. Вроде есть расширения для студии, которые по сути при нажатии F12 автоматом перекидывают на страницу source.dot.net, но мне показалось это неудобным калом т.к. перебивает работу F12 в других случаях.

>>166246
Count() это метод расширения для Enumerable — базового класса List. Задача которого быть универсальным для большинства коллекций. В качестве параметра, этот метод принимает объект, реализующий интерфейс IEnumerable, поэтому метод вообще не вдупляет какой реальный тип у коллекции, а ведь у каждого типа свои методы получения количества итемов. К примеру у списка за это отвечает свойство Count, а у массива — свойство Length. У некоторых вообще нет ничего подобного, поэтому приходится вычислять count методом перебора итемов энумератора.

Короче, внутри test.Count() все сводится к первому варианту test.Count + проверки на тип и выбор самого оптимального варианта. И самое главное, свойства Count и Length уже хранят готовые значения, в то время как метод Count() будет выполнять проверки каждый раз, когда ты этот метод запускаешь.

Поэтому вариант с расширением используют для чего-то универсального, для чего можно пожертвовать производительностью, хотя и это можно свести к минимуму, если понимать как работает Count() — просто не пихать его, например, в циклы, а заранее вывести результат в переменную.

Но если у тебя есть доступ к конкретному свойству конкретного типа, то лучше использовать это свойство. И самому надо стараться делать свойства с таким же подходом и не пихать в них громадную логику.

Поэтому ты наверно понял, какую свинью могут подложить разработчики с новыми расширениями, маскируя метод под свойство. И ведь кто-то возьмет и напишет это

>for (int i = 0; i < n.Count; i++) { }


А внутри будет запрятан метод Count() который каждый раз перебирает коллекцию. И этот перебор будет происходить при каждой итерации цикла.
832 3166421
>>166419
1. В студии работает сорслинк, но может быть выключен. Все майковские пакеты с ним собраны
2. С решарпером по ф12 отрабатывает нормальный декомпилятор, а не стандартный обрубок
833 3166430
>>166421
С решарпером все понятно, а как первое поможет?
Потому что все рекомендации, которые я видел, типа "Enable navigation to Source Link and Embedded Sources", не распространяются на исходники от майкрософт. В итоге все сводилось к рекомендации установить расширение Ref12 (если не брать в расчет решарпер).
834 3166443
>>166430
Может тогда не жевать кактус а поставить решарпер или идешку сменить?

Только не нужно про платность загонять. Есть варианты от "мой хозяин на работе даёт альтимейт лицуху" до "пиратских серверов активации по аналогии kms"
835 3166695
>>166419

>Майкрософт скрыла свой код


где скрыла? все качается с гитхаба и показывается.
836 3166998
>>166443

>мой хозяин на работе даёт альтимейт лицуху


Мне на одной из работ поставили энтерпрайз версию студии, так в ней часть 'бесплатных' расширений отвалилась. Т.к. типа если ты на комьюнити версии, то можно пользоваться бесплатно, а если у тебя оплачена лицензия, значит бабки есть, плати и за расширения тоже.
837 3167115
Понимаю, что вопрос про софт а не шарп, но все же студия, все дела.
В общем. С недавних пор какого-то фига в студии бесконечно растет потребление памяти.
Просто, буквально. Я открываю солюшин. Минут 10 все вроде ок. Но потом я открываю диспечер задач, вижу, что студия жрет 28 гигов из моих 32. И это выглядит как: растет до состояния, что студия перестает как-то на меня реагировать, потом - хренак, падает до 1,4, и потом вот такими циклами происходит.
Че эт может быть? У меня из расширений - буквально нифига нет. Всякие штуки пробовал поотключать. но нифига не помогло.
Сейчас из-за всей этой хурмы пересел на VSCode. Жить можно, но блин, я как-бы привык уже к студии. Переставлять боюсь из-за того что настроечки же свои наделал, чтобы максимально удобно, окошки там попрятал лишние, ненужные кнопки убрать, снова этим заниматься не хочется особо.
838 3167188
>>167115
Настройки импортируй...
839 3167329
>>097760 (OP)
Почему у дотнета сообщество как в 1С? Его как бы нет.
840 3167332
>>167329
В эфире рубрика "Тейки с потолка"
841 3167339
>>162248
Вроде всё не так плохо, не?

>>162298

>Им что жалко сгенерить какое нибудь подобие экспрешена раз уж CLR не может в нужное? Вижу что жалко.


Как я понял, они кешируют нужную инфу. А вызывают конструктор через кешированный указатель на метод.
https://source.dot.net/#System.Private.CoreLib/src/System/RuntimeType.CoreCLR.cs,d90ca8e3a15370ca
image.png117 Кб, 1686x170
842 3167369
такую уебанскую запись можно получить только после калпиляции и обфускации?
843 3167754
>>167369
Обычная запись юникода через escape последовательности.
1716574423230.png13 Кб, 242x350
844 3168152
845 3168217
>>168152
Здесь так не шутят.
846 3168271
Конструктор класса запускает метод Initialize(), но этот метод не имеет доступа к ReadOnly свойствам, хотя по сути он должен использоваться только в конструкторе.

Че делать?
847 3168277
>>168271
Нашел
848 3168621
Я думаю многие видели это (и ещё extensions):
https://learn.microsoft.com/en-us/dotnet/csharp/whats-new/csharp-13
Но ещё есть:
https://github.com/dotnet/roslyn/blob/main/docs/Language%20Feature%20Status.md

>Ref/unsafe in iterators/async


Такую мелочь фиксить так долго...

>Ref Struct Interfaces


Байтоёбы стали счастливее
https://github.com/dotnet/runtime/issues/102671

>[API Proposal]: Employ allows ref struct in libraries



А что вы думаете по поводу C# 13? (discriminated union дебилы сразу идут нахуй)
849 3169325
>>168621
А что тут думать. Тред на гитхабе "сделайте блин ConfigureAwait настройку на уровне проекта/солюшена/вселенной" так и будет висеть вечность. А делают то, что нужно мало кому (ну мне в принципе нужно, но как то живу и без этого, а ConfigureAwait заипал.
850 3169326
>>169325
Опять ты со своим ConfigureAwait.
851 3169328
>>169326
и не только я. нас много.
852 3169332
>>169328
И кто то из этих "много" кинул пр с реализацией фичи?
Хочешь что то сделать хорошо - сделай это сам, а не ной как баба
853 3169336
>>169332
Ты дурачок какой-то.
854 3169339
А есть класс похожий на span, но позволяющий добавлять в него элементы? В чем суть, есть огромный массив, есть его отрезок в виде спана, я хочу иметь возможность работая с этим отрезком добавлять туда элементы, при этом не обращаясь к самому массиву.
855 3169366
Почему нет ни одного нормального курса на Udemy по C# Дотнету на русском языке?
Неужели это настолько невостребованный фреймворк?
856 3169367
>>169332
А вот эти фичи что в шарпе любом их тоже простой народ делает? А тотя как то пропустил

>>169339
Ну с массивом оно как бы span. Но да - простой фичи типа ListSegment почему то нет хотя вот это как раз делается элементарно, а в жава есть.
857 3169400
>>169366
Настолько невостребованный Udemy.
858 3169424
>>169366
Потому что шарп обновляется так быстро, что даже на английском языке иногда нет актуальной литературы и курсов.
По моему сейчас уже даже известные авторы забили на обновление текущих и написание новых книг. Потому что прохождение полного издательского цикла от написания до печати книги займет столько времени, что успеет пара новых версий .net-а выйти.
859 3169435
Как же мне иногда не хватает friend классов (по типу как в C++).
https://github.com/dotnet/csharplang/discussions/2073

Люблю обмазываться менеджерами и другой подобной хренью...
860 3169660
>>169435
Use internal Luke

Мне кажется, но все случаи, когда тебе нужны дружественные классы, легко разрулить модификаторами доступа, благо в шарпе есть internal и protected internal. Если прям трясешься от того, что из других классов сборки можно будет щупать другие методы, то просто выдели для таких классов отдельный проект.
861 3169741
>>169435
Звучит как желание иметь еще один слой зависимостей, от которых заебешься, когда будешь разгребать чужой говнокод. Не нужно.
862 3170024
>>169660
Ты прав.
Тебе кажется
863 3170069
>>170024
Давай тогда пример, когда не удастся. Будем тебя обоссывать.
864 3170095
>>170069
Да все удастся. можно вообще паблик сделать и тоже будет работать. Но те же понимаешь почему в природе существует не только паблик (хотя все при нем удается)?
865 3170099
>>170095
Ты конкретный кейс давай, когда friend-класс принесет значимые профиты, попутно не сделав код сильносвязанным говном. И пояснение за одно, почему в данном кейсе использование того же internal будет моветоном.
866 3170173
>>170099
ну там выше гитхаб дали -там тебе доводы.
ты понимаеш что френды и интерналы это разные вещи по уровню доступа и по уровню контроля открываемости?
867 3170196
>>170173
Не увиливай. Давай таой пример, когда оно тебе нужно в шарповом коде.

Как по мне, это плюсовая говнофича, которая делает код излишне связным и сложным в поддерже. И как бы то, что разрабы других языков и в том числе Шарпа не стремятся ее из плюсов в свои языки переносить как раз хороший аргумент в сторону ее ненужности в исходном виде.
Как по мне, это костыль языка, в котором до последнего времени не было нормальной модульности кода (в последних стандартах, слышал, что что-то для этого завезли), и в котором для того, чтобы использовать класс, лежащий рядом в проекте, нужно блядь по сути вставлять исходник с объявлением этого класса в свой исходник.
868 3170236
Как бы я не хотел эту фичу, я понимаю её проблемы и последствия.
В какой-то степени friend это костыль, как список исключений к правилу. Т.е., вот у нас есть инкапсуляция и т.д., а вот у нас есть список на кого эта инкапсуляция не распространяется, т.е. исключение из правила, а это хоть где нибудь, но будет создавать геморрой. Вот даже если добавить аттрибут по типу InternalsVisibleTo(Type[] types), и он никак не будет проявлять себя на уровне рефлексии, например, будет чем-то вроде хака в компиляторе, то тулзы всё равно должны будут его понимать (компилятор, анализаторы, Intellisense и т.д.). И вот в проверку видимости члена добавятся ещё исключения, но теперь более конкретные (если InternalsVisibleTo, на уровне сборки, уже был, то теперь появится конкретный список типов).
Ну хоть и сама фича относительно маленькая, но небольшие неудобности в реализации имеет и добавляет ещё материала при изучении языка.
Ну а плюс: friend сохраняет инкапсуляцию типов (в некоторых местах можно будет им заменить internal и не светить внутренностями на всю сборку).

>>170196
Так, блядь, friend это не про абстракцию (в основном), а, например, когда у тебя есть Foo и FooManager, и Foo не полностью самостоятельный объект и бесполезен без FooManagerа (FooManager их создаёт, владеет ими, удаляет их и дополняет их функционал).

>Как по мне, это костыль языка, в котором до последнего времени не было нормальной модульности кода (в последних стандартах, слышал, что что-то для этого завезли), и в котором для того, чтобы использовать класс, лежащий рядом в проекте, нужно блядь по сути вставлять исходник с объявлением этого класса в свой исходник.


Это всё не имеет отношение к friend. friend существует, чтобы выборочно нарушить инкапсуляцию своих членов (ну в C++ там всё немного серьёзнее).

>И как бы то, что разрабы других языков и в том числе Шарпа не стремятся ее из плюсов в свои языки переносить как раз хороший аргумент в сторону ее ненужности в исходном виде.


Ну а я бы сказал что большинство ООП языков, имеют это ООП в немного кастрированном виде, а потом со временем начинают придумывать различные костыли.
868 3170236
Как бы я не хотел эту фичу, я понимаю её проблемы и последствия.
В какой-то степени friend это костыль, как список исключений к правилу. Т.е., вот у нас есть инкапсуляция и т.д., а вот у нас есть список на кого эта инкапсуляция не распространяется, т.е. исключение из правила, а это хоть где нибудь, но будет создавать геморрой. Вот даже если добавить аттрибут по типу InternalsVisibleTo(Type[] types), и он никак не будет проявлять себя на уровне рефлексии, например, будет чем-то вроде хака в компиляторе, то тулзы всё равно должны будут его понимать (компилятор, анализаторы, Intellisense и т.д.). И вот в проверку видимости члена добавятся ещё исключения, но теперь более конкретные (если InternalsVisibleTo, на уровне сборки, уже был, то теперь появится конкретный список типов).
Ну хоть и сама фича относительно маленькая, но небольшие неудобности в реализации имеет и добавляет ещё материала при изучении языка.
Ну а плюс: friend сохраняет инкапсуляцию типов (в некоторых местах можно будет им заменить internal и не светить внутренностями на всю сборку).

>>170196
Так, блядь, friend это не про абстракцию (в основном), а, например, когда у тебя есть Foo и FooManager, и Foo не полностью самостоятельный объект и бесполезен без FooManagerа (FooManager их создаёт, владеет ими, удаляет их и дополняет их функционал).

>Как по мне, это костыль языка, в котором до последнего времени не было нормальной модульности кода (в последних стандартах, слышал, что что-то для этого завезли), и в котором для того, чтобы использовать класс, лежащий рядом в проекте, нужно блядь по сути вставлять исходник с объявлением этого класса в свой исходник.


Это всё не имеет отношение к friend. friend существует, чтобы выборочно нарушить инкапсуляцию своих членов (ну в C++ там всё немного серьёзнее).

>И как бы то, что разрабы других языков и в том числе Шарпа не стремятся ее из плюсов в свои языки переносить как раз хороший аргумент в сторону ее ненужности в исходном виде.


Ну а я бы сказал что большинство ООП языков, имеют это ООП в немного кастрированном виде, а потом со временем начинают придумывать различные костыли.
869 3170255
>>170236

>> Так, блядь, friend это не про абстракцию (в основном), а, например, когда у тебя есть Foo и FooManager, и Foo не полностью самостоятельный объект и бесполезен без FooManagerа (FooManager их создаёт, владеет ими, удаляет их и дополняет их функционал).



Решается либо вложенными классами, либо internal. Боишься, что internal-члены Foo будет трогать кто-то кроме FooManager - выделяешь для них публичный интерфейс, а саму реализацию выносишь в отдельную сборку. Либо добавляешь свой атрибут и один раз пишешь свой roslyn-анализатор, который будет это проверять. Все современные ide-ки (студия, Rider) умеют с ними работать и будут подсвечивать ошибку как в коде, при редактировании. Во время компиляции он тоже будет выдавать предупреждение. Можно настроить проект так, чтобы он считалось ошибкой и обрывало сборку. Потом этот анализатор можно будет запаковать в nuget и подключать к другим своим проектам. Пишутся они не сильно сложно.
https://habr.com/ru/articles/455844/

>> Это всё не имеет отношение к friend. friend существует, чтобы выборочно нарушить инкапсуляцию своих членов



Разрабы Шарпа и других языков вполне понимали необходимость иногда нарушать инкапсуляцию. Они и дали тебе инструменты, которых в плюсах нет, в силу их исторического наследия. Эти инструменты - вложенные классы и модули+internal. Просто при объявления класса френдом, ты даёшь ему доступ ко ВСЕМ private-методам класса. Потом это принесёт много страданий, так как хуй поймешь что от чего зависит, особенно если классы-друзья достаточно большие и имеют большую историю доработок разными разрабами, так как контрактом их взаимодействия по сути являются все члены класса, и их изменение может неожиданным образом зааффектить поведение класса-друга. internal-методы это же как раз возможность задать на такой случай дополнительный уровень контрактов.

>> Ну а я бы сказал что большинство ООП языков, имеют это ООП в немного кастрированном виде, а потом со временем начинают придумывать различные костыли.


Ну так friend это тоже костыль. И он никому из создателей более современных языков по душе не пришёлся.
869 3170255
>>170236

>> Так, блядь, friend это не про абстракцию (в основном), а, например, когда у тебя есть Foo и FooManager, и Foo не полностью самостоятельный объект и бесполезен без FooManagerа (FooManager их создаёт, владеет ими, удаляет их и дополняет их функционал).



Решается либо вложенными классами, либо internal. Боишься, что internal-члены Foo будет трогать кто-то кроме FooManager - выделяешь для них публичный интерфейс, а саму реализацию выносишь в отдельную сборку. Либо добавляешь свой атрибут и один раз пишешь свой roslyn-анализатор, который будет это проверять. Все современные ide-ки (студия, Rider) умеют с ними работать и будут подсвечивать ошибку как в коде, при редактировании. Во время компиляции он тоже будет выдавать предупреждение. Можно настроить проект так, чтобы он считалось ошибкой и обрывало сборку. Потом этот анализатор можно будет запаковать в nuget и подключать к другим своим проектам. Пишутся они не сильно сложно.
https://habr.com/ru/articles/455844/

>> Это всё не имеет отношение к friend. friend существует, чтобы выборочно нарушить инкапсуляцию своих членов



Разрабы Шарпа и других языков вполне понимали необходимость иногда нарушать инкапсуляцию. Они и дали тебе инструменты, которых в плюсах нет, в силу их исторического наследия. Эти инструменты - вложенные классы и модули+internal. Просто при объявления класса френдом, ты даёшь ему доступ ко ВСЕМ private-методам класса. Потом это принесёт много страданий, так как хуй поймешь что от чего зависит, особенно если классы-друзья достаточно большие и имеют большую историю доработок разными разрабами, так как контрактом их взаимодействия по сути являются все члены класса, и их изменение может неожиданным образом зааффектить поведение класса-друга. internal-методы это же как раз возможность задать на такой случай дополнительный уровень контрактов.

>> Ну а я бы сказал что большинство ООП языков, имеют это ООП в немного кастрированном виде, а потом со временем начинают придумывать различные костыли.


Ну так friend это тоже костыль. И он никому из создателей более современных языков по душе не пришёлся.
870 3170257
>>170255>>170255

Вложенные карты кака
871 3171243
>>170255

>Решается либо вложенными классами


Foo.FooManager это странно, а что делать когда есть Foo1, Foo2 и FooManager.

>выделяешь для них публичный интерфейс,


А что делать в случаях FooManager.DoSomething(IFoo[] foos)?

>а саму реализацию выносишь в отдельную сборку


Не всегда возможно. И к тому же, что, выносить все такие типы? всё дробить на сборки?

>roslyn-анализатор


Я не упомянул, но смотрел различные варианты: от EditorBrowsable(EditorBrowsableState.Never) до анализаторов. Думал про source генераторы, если бы можно было бы обращаться к членам, которые ещё только будут сгенерированы source генератором, то генератор, например, бы просто заменял такие обращение на методы с UnsafeAccessorAttribute. Такое решение было бы идеально (как friend классы, весь класс пишется как обычно). Текущие рещения с анализаторами и генераторами - решения с разной степенью костыльности (как и сам friend).
Все эти решения мне не нравятся, потому что они побольшому счёту workaroundы. Но решение с интерфесом самое адекватное из этих вариантов. Только вот городить интерфейс даже когда это менеждер с его "детьми" является сам internal, т.е. чисто для внутренней реализации, делать всё public/internal?
Тут нужно уточнить, что я в принципе против делать всё члены internal для типа, даже если он internal для сборки. Ну может я не понимаю, как работает инкапсуляция, и что делать всё внутренние типы и члены internal это норма.

>Просто при объявления класса френдом, ты даёшь ему доступ ко ВСЕМ private-методам класса.


Ну тут выбор: либо internal - видно только то что нужно, но всем в сборке, либо friend - видно всё, но только нужным классам.

>Потом это принесёт много страданий, так как хуй поймешь что от чего зависит, особенно если классы-друзья достаточно большие и имеют большую историю доработок разными разрабами, так как контрактом их взаимодействия по сути являются все члены класса, и их изменение может неожиданным образом зааффектить поведение класса-друга.


Тут согласен, но я не считаю это настолько большой проблемой.

>Они и дали тебе инструменты, которых в плюсах нет, в силу их исторического наследия.


Ну тут я согласен, что у C++ большое легаси и у разных языков, разные аудитории и разные общепринятые подходы.

Были ещё предложения с internal, но в пределах неймспейса (что тоже было бы неплохо или даже лучше).
871 3171243
>>170255

>Решается либо вложенными классами


Foo.FooManager это странно, а что делать когда есть Foo1, Foo2 и FooManager.

>выделяешь для них публичный интерфейс,


А что делать в случаях FooManager.DoSomething(IFoo[] foos)?

>а саму реализацию выносишь в отдельную сборку


Не всегда возможно. И к тому же, что, выносить все такие типы? всё дробить на сборки?

>roslyn-анализатор


Я не упомянул, но смотрел различные варианты: от EditorBrowsable(EditorBrowsableState.Never) до анализаторов. Думал про source генераторы, если бы можно было бы обращаться к членам, которые ещё только будут сгенерированы source генератором, то генератор, например, бы просто заменял такие обращение на методы с UnsafeAccessorAttribute. Такое решение было бы идеально (как friend классы, весь класс пишется как обычно). Текущие рещения с анализаторами и генераторами - решения с разной степенью костыльности (как и сам friend).
Все эти решения мне не нравятся, потому что они побольшому счёту workaroundы. Но решение с интерфесом самое адекватное из этих вариантов. Только вот городить интерфейс даже когда это менеждер с его "детьми" является сам internal, т.е. чисто для внутренней реализации, делать всё public/internal?
Тут нужно уточнить, что я в принципе против делать всё члены internal для типа, даже если он internal для сборки. Ну может я не понимаю, как работает инкапсуляция, и что делать всё внутренние типы и члены internal это норма.

>Просто при объявления класса френдом, ты даёшь ему доступ ко ВСЕМ private-методам класса.


Ну тут выбор: либо internal - видно только то что нужно, но всем в сборке, либо friend - видно всё, но только нужным классам.

>Потом это принесёт много страданий, так как хуй поймешь что от чего зависит, особенно если классы-друзья достаточно большие и имеют большую историю доработок разными разрабами, так как контрактом их взаимодействия по сути являются все члены класса, и их изменение может неожиданным образом зааффектить поведение класса-друга.


Тут согласен, но я не считаю это настолько большой проблемой.

>Они и дали тебе инструменты, которых в плюсах нет, в силу их исторического наследия.


Ну тут я согласен, что у C++ большое легаси и у разных языков, разные аудитории и разные общепринятые подходы.

Были ещё предложения с internal, но в пределах неймспейса (что тоже было бы неплохо или даже лучше).
872 3171258
>>170255

>И он никому из создателей более современных языков по душе не пришёлся.


А чем covariant return, не пришёлся по душе разрабам шарпа, что он появился только в C# 9 (.NET 5, 2020 год) (и это ещё с учётом того, что касты, что в mono, что CoreCLR, что в NativeAOT - no-op, если убрать проверки). И это ещё к моему тейку, про языки ООП-кастраты.
Ну и как аргумент это не очень (там вроде разрабы шарпа примерно так же говорили). К тому же у нас есть GC язык с hardware intrinsicами, арифметикой управляемых указателей, подержка простых указателей (в т.ч. указателей на функции), вся каша с ref (и она становится только больше) и т.д. Много таких языков? Т.е. одна часть языка - модная, современная, для полудомохозяек, а другая - high performance. Даже scoped ref добавили и всё ещё собиратся добавить больше: https://github.com/dotnet/csharplang/blob/main/proposals/expand-ref.md

Ну, а вообще ты прав.
Friend не даёт ничего принципиально нового, что нельзя сделать сейчас (и это ещё один минус для новой фичи), просто мне хочется видеть развитие и улучшение ООП (хоть я и понимаю его минусы), а не добавление новых парадигм и полуготовые фичи которые доделывают через пару лет (in, primary contructors, collections expressions и т.д.).

И да, половина моих тейков это ИМХО и ранняя стадия C++а головного мозга. К тому же я слишком тупой, чтобы нормально задефать свое мнение. Пусть хоть местные аноны что-нибудь напишут, а то >>167332 1С тред поживее будет.
873 3171369
>>171243

>Ну тут выбор: либо internal - видно только то что нужно, но всем в сборке, либо friend - видно всё, но только нужным классам.


так то кул было бы иметь возможность приватное на уровне неймспейса, но у нас же шарп - тут много чего нет.
874 3172253
Хочу решить проблему, когда я уверен, что метод возвращает не нулевое значение, но компилятор все равно требует проверку на null.

Я заметил, что для метода словаря Dictionary.TryGetValue даже несмотря на возвращение nullable-объекта, компилятор не требует проверки. Посмотрел в исходниках (пикрил 1), и там на выходном параметре стоит аргумент [MaybeNullWhen(false)]

Пытался повторить (пикрил 2). Создал тестовый класс, добавил собственный метод TryGetValue, который имитирует аналогичный метод в словаре.

Далее сделал метод TestMyFunction(), в котором использую свой TryGetValue, и как видите, в строке

>var n = myClass.Name;


видно подчеркивание, которое сигнализирует о рекомендации проверки на null экземпляра myClass.

В качестве сравнения, сделал метод TestDictionary(), где все ровно тоже самое, но только для метода словаря Dictionary.TryGetValue(). И вот здесь никакого предупреждения нет. Почему?

Я пытался использовать другие аргументы, типа [NotNullWhen(true)] и все работает, но я хочу понять почему не работает вариант, который использовался в метода для словаря?
875 3172261
>>172253
А, понял.

[MaybeNullWhen(false)] сообщает, что метод может вернуть ноль.
Поэтому в параметре возврата не указывается nullable-тип:

> out MyClass result



А [NotNullWhen(true)] сообщает, что nullable-объект в случае успеха гарантированно что-то возвращает, поэтому здесь наоборот указывается nullable-тип:

> out MyClass? result

876 3172457
В каких случаях используют WeakReference?
Попробовал, но ссылка пропадает непредсказуемым образом.
877 3172472
>>172457
очевидно когда не нужно мешать сборщику мусора ее собрать
Пропадает она когда не остается строгих ссылок и проснулся GC

Применений валом. Например в подписках. Вон в WPF активно используется. Нельзя же бегать разбираться (на самом деле можно и нужно, но есть нюанс) кто когда куда исчез, поэтому там weak подписки
878 3172693
>>172472
Но вот я пытался там сохранить ссылку на метод. Когда сразу же хочу получить ссылку, то она возвращается. Но почему-то спустя непродолжительное время TryGetTarget возвращает false, при том что я совершенно точно уверен в существовании экземпляра класса, на метод которого была дана ссылка.
879 3172723
>>172693
Кажется дело в ссылке на метод. Если эту ссылку предварительно сохранить в поле, и уже ссылку на поле передавать в WeakReference, то тогда TryGetTarget возвращает true.

Но как тогда работают подписки? Почему там можно передать напрямую ссылку на метод? Или это из-за того, что она передается внутри класса, где происходит подписка.

Короче непонятно поведение методов.
880 3172959
>>172693

>уверен в существовании экземпляра класса


Экземпляр класса и ссылка на его метод - 2 разные сущности. Если никто, кроме weak, не удерживает ссылку на что либо, то GC конечно его скушает.

Подписки так и работают. Только ты не путай обычные подписки - они стронг и вообще представляют собой сахар шарпа, и weak у которых совсем другой и весьма тупой синтаксис, который по факту реализация на коленке.
Они не пытаются удержать ссылку от сбора GC. Они смотрят жив ли адресат, но не мешают его уничтожению.

Например, в MVVM фреймворках мессенджеры сделаны обычно weak потому что там нужно слать сообщения между вьюмоделями, а в них сложно отписываться - это обычно делается в Dispose, но сам Disposable паттерн слишком неудобен для этого поэтому мессенджер удерживает ссылку на адресата как weakref и не мешает его убить и тем самым избегает утечки памяти.

Этакий костыль для тех кто не умеет в лайфтаймы (но это уже оффтоп)
881 3173663
>>172959
Спасибо за ответ, я понял.
882 3173773
>>173663
ссылка на метод === ссылка на делегат (который уже, в свою очередь, ссылается на метод и его владельца). и поскольку никто кроме weak не удерживает ссылку на этот делегат, то делегат убивается GC

Еще кстати есть типа словаря с weak ключами - ConditionalWeakTable
883 3174722
>>173773

>и поскольку никто кроме weak не удерживает ссылку на этот делегат, то делегат убивается GC


ааа

>ConditionalWeakTable


про это я читал, да
884 3174729
А как в MVVM пнуть представление из модели сродни методу?

К примеру, мне надо поднять окно на передний план экрана. Свойством это бессмысленно делать т.к. нет возможности и желания отслеживать состояние нахождения окна на переднем плане.

Я могу в модели создать событие. Представление получая дата контекст может на это событие подписаться. Но тогда подписка не дает представлению помереть в нужный момент. Может есть какие-то решения подобной проблемы? Не всегда удается решить задачу через свойства.
885 3174763
>>174729
1 weak подписка на свойство или событие даст помереть виду
2 стронг подписка требует отписки. Но события анлоадед может не быть
- в случае виртуализации его нет. Попап не выгружает контент тоже.
- закрыл окно и не будет анлоадед
Поэтому я с лайфтаймами делаю лайфтайм контрола метожом который подписывется на анлоадед контрола и на зак эл закрытие окна
В случае виртуализации можно подписывать и отписывать в датакониекстчэнжед

Но ты юзай слабые подписки и не мучай жопу.
886 3174848
Пацаны, такое дело, кароче в виде хобби прогаю на Сшарпе, в визуал студио. Сейчас я немного оторван от моего нормального компа, на руках только древний некроноут из 2009-ого с виндоовс 7. Какая прога подойдёт чисто консольные приложухи писать, калькуляторы там и хеллоу ворлды? Желательно чтоб прям что-то очень лёгкое, а то визуал студио у меня и на мощном стационарном компе только запускается по 10 минут нахуй. Можно и без подсветки синтаксисов и без всяких свистоперделок, так даже лучше будет, без подсказок для практики я думаю.
Визуал студио не ставится,визуал студио код тоже.,
887 3174859
>>174848
Notepad++
888 3174879
>>174848
Мне вима хватает для всяких утилиток.
889 3175164
>>174848
Тут вопрос в том, а должно ли это что-то уметь компилировать код?

>Можно и без подсветки синтаксисов


Как раз таки текстовых редакторов с подсветкой синтаксиса хоть жопой жуй — тот же Notepad++ или Sublime Text (выглядит современнее). Но все они не умеют компилировать — в них можно только писать код.
890 3175188
>>175164
Студия сама по себе тоже не умеет. Запускаешь dotnet watch в соседнем окне и пишешь
891 3175192
>>174848

>древний некроноут из 2009-ого с виндоовс 7


Где вы такое говно откапываете? У меня даже планшет пятилетней давности смог потянуть вижуал студию (правда смог только запустить), не говоря уже о вижуал студио коде.

Ну да ладно. Если есть доступ к интернету, то можешь попробовать онлайн компиляторы, типа
https://sharplab.io/
Там вообще ничего устанавливать не нужно. Но вот если придется пользоваться кастомными библиотеками или нюгет пакетами, тогда будет проблема.
Но вот самое-самое начало для освоения синтаксиса и проч сойдет. Хоть на телефоне пиши код. В качестве бонуса отображает IL-код.
892 3176104
Почему, если кто-то говорит про Vertical Slices - заебись, новое слово в архитектуре, как удобно, нет этих ненужных абстракций.
Но если я сделаю класс User, который сам себя в БД пишет, дает доступ из любого места программы ко всему списку юзеров, еще и может отрисовать окошко с редактированием пользователя - пиздец, блядь, БОЖЕСТВЕННЫЙ КЛАСС, УУУУ, SRP, Уууууу, Ууууу. Как же - все в одном месте? Как же удобство работы и вот это вот все?
893 3176167
Как забиндиться к ридонли депенденси проперти? Мне нужно отобразить статус что какое-то представление открыто, при этом логика определения статуса расположена в представлении, по принципу IsLoaded, которая вообще никак не связана со вьюмоделью.

Биндиться по имени контрола не вариант т.к. иконка статуса находится в жопе UI. Мне надо этот статус как-то пробрасывать через вью-модель.

Но тут возникает две проблемы:
1. Ни один из режимов привязки не работает с ридонли свойством контрола. Пикрил 1 - как выглядит свойство. Пикрил 2 - как я пытался забиндить. (регистрация ДП при помощи RegisterReadOnly тоже пробовал)

2. Даже если я решу первую проблему, свойство вьюмодели, в таком случае должно иметь доступ и на чтение и не запись, но это дает возможность другим элементам попытаться изменить данное свойство, что нехорошо.
894 3176188
>>176104

>Как же удобство работы и вот это вот все?


Удобство ведь только в теории, но на практике может прострелить колено.
Я встречался с ситуациями, когда самодеятельность суб-элементов приводила к тому, что они гадили в те моменты, когда их никто не просил. В итоге начинаются усложнения с запрещением этой самой самодеятельности.

Твой элемент будет шатать БД в не самое удачное время, потому что он не в курсе когда это время удачное. А если таких элементов куча, и эти элементы пинают другие элементы, то как ты собрался этот бедлам контролировать?
895 3176203
>>176104
Может в твоих Vertical Slices подразумевается, что User должен бить челом к пахану и спрашивать его разрешения сохранить в БД, а сам-то User простой мужик и только маляву передает. Иначе это уже беспредел.
896 3176225
>>176104

>Но если я сделаю класс User, который сам себя в БД пишет, дает доступ из любого места программы ко всему списку юзеров, еще и может отрисовать окошко с редактированием пользователя - пиздец, блядь


Ну как бы да, звучит как ебейший пиздец.
897 3176249
>>176167
Оневэйтусорс и есть вызов сеттера
А чтение геттера это онетайм и оневэй
.png19 Кб, 325x651
898 3176296
>>176203

> Может в твоих Vertical Slices подразумевается, что User должен бить челом к пахану и спрашивать его разрешения сохранить в БД, а сам-то User простой мужик и только маляву передает. Иначе это уже беспредел.



В том что я читал - подразумевается, что у тебя есть папка Feature, в ней подпапка FeatureName, и вот в этой подпапке - все что нужно чтобы твоя фича самостоятельно была этой самой фичей. Т.е. все константны, все обработчики, события, эндпоинты, эксепшины и прочее. С минимальным уровнем абстракции. Примерно прикриплейд

>>176225
По мне и вот эта вот фигня с папочками - тоже как пиздец выглядит. Но ее уже зафорсили на фронте, и фронтендеры за обе щеки уплетают, говорят - заебись. Я вот хочу разобраться, чем обычная слоеная архитектура - хуже вот этого вот. Они как аргумент постоянно рассказывают, что вот, я с папочкой работаю, все что мне надо - там есть. Я говорю: ИДЕ тебе позволяет по F12 куда надо прыгнуть. Мне говорят: Я В ВСКОЛ/ВИМе пишу. Я хз что на это кроме совета в одном файле все делать ответить.
899 3176457
>>176296
Ну можешь прыгать прыгай никто не запрещает.
Feature folder рулит. Не нужно никуда прышать, весь контекст в одном месте, всё структурно и позволяет легко дробить на классы не создавая хаос вида "это нужно только этому, но лежит рядом со всеми или отдельно от всех" (оба варианта говно)
900 3176492
>>176457
Так один класс - еще лучше же в таком случае. Все в одном файле, на🌶. Весь контекст.
И хаоса не будет, если ты нормально структурируешь класс, и как деды - #region'ами разделишь че куда.
Нормально же. Че не так?
А еще лучше - вообще один файл Program.cs на проект - вот там-то вообще будет ВЕСЬ КОНТЕКСТ.

Плюс, с этими фичафолдерами - начинается 🌶ня, как только у какой-то фиче появляется что-то, что хотелось бы в другой фиче использовать. С обычной слоеной архитектурой, у тебя бы был скорее всего генерализованный сервис где-то на уровне application и ты его мог как угодно на всех уровнях выше дергать. С фичаслайсами - начинается 🌶ня: а че делать? Вынесем это в Shared, а вдруг никому больше надо не будет, может просто скопипастишь что тебе надо, ой, там был баг, в 2 местах теперь поправить не забудь.

Короче. Мне чет не оч нравится. Со слоями как-то удобнее.
901 3176493
🌶...
902 3176586
>>176249
Ни один из режимов не работает, я же писал.
903 3176840
>>176492
Не нужно утрировать.

ты и так делишь все на класссы. Просто распихиваешь ЗАЧЕМ ТО связанные логически классы в 100005000 мест только потому что кто КТО-ТО сказал что вот эти классы должны лежать там, а эти там.
Но при этом тебя не удивляет что ты качаешь какую то либу с нюгета, а либа почему то делает что то одно и не говорит тебе "качай миллион либ, я распихал одну функциональность по миллиону мест". Можно же одну мегалибу сделать, удобно же да?
То есть фича пакет для тебя почему то норм. А чем в общем то фича пакет отличается от фича неймспейса? да ничем.

Если ТЕБЕ удобно бегать по всему проекту, то бегай. Другим вот удобно когда все связанное лежит связно. Фича подход не отрицает слои.
904 3177220
>>175192

>Где вы такое говно откапываете?


У родителей в деревне, ноут из моего детства, хули.

>>175164

>Тут вопрос в том, а должно ли это что-то уметь компилировать код?


Я надеялся что компилятор есть везде, но изучив эту тему теперь я понимаю что в мире программирования всё должно быть через жопу.

>>174879
Люди про него страшные вещи пишут.

>>174859
Пикнул твой вариант, пасиба за совэт. Пишу код в нотпаде++, затем командной строкой его в программу переделываю, затем только запускаю и смотрю чё там внутри. Пиздец конечно, но что поделать.
905 3177334
>>176840

>Просто распихиваешь ЗАЧЕМ ТО связанные логически классы


Нет. Распихиваются не просто "логически" связанные классы, а по их функционалу. Внутри слоев ты точно так же можешь группировать классы по фичам/домену/желанию левой пятки, просто поддерживаешь везде одинаковую структуру и все.
906 3177405
🌶
ASP NET 907 3177485
Почему вместо нормального отображения как на пик2 у меня отображается какая-то залупа на пик1?
908 3177499
>>177220

>затем командной строкой его в программу переделываю, затем только запускаю и смотрю чё там внутри.


Вместо того, чтобы каждый раз вручную писать инструкции в консоль, ты можешь написать батник и компилировать приложение по даблклику на батнике.

Или даже сам себе сделать приложение, которое будет и инструкции отправлять, а потом запускать собранное приложение. Делов на пару вечеров.
909 3177820
>>177485
Потому что у тебя:
- русифицированная студия
- светлая тема.

А если серьезно, то у тебя просто похоже ResourceView вместо SolutionExplorer включился.
Выбери View -> Solution Explorer, или нажми Ctrl+Alt+L
910 3177978
Вот смотрите.
Есть к примеру сайт, его задача максимально быстро отвечать на запросы. Но также нужно записывать лог в mysql, дату юзер агент и тд и тп. На сколько хороша идея писать в базу асинхронно ?

ну типо
WriteLogAsync(info);
return "example string";
911 3178033
>>177334
По какому функционалу. Контроллеры отдельно, вьюмодели отдельно, вид (неважно чей) - тоже отдельно, валидаторы отдельно, команды отдельно, хендлеры отдельно - все отдельно. И уже ВНУТРИ их идет деление по фичам либо в имени файла либо в необходимости создания подпапки. В итоге классы для реализации одной фичи размазаны по куче мест. Если тебе это удобно - ну рад за тебя.

Feature Folder противовес этому. Зачем распихивать одну фичу по 100 мест? какую это привносит пользу? типа "если мне нужен хендлер я иду в хендлеры и там ищу"? ну так вон он у тебя хендлер тут лежит в фиче сразу. Ибо не путается среди сотни чужих хендлеров. А если нужно много для фичи - ну так выдели ты подпапку "хендлеры".

И это мы говорим только про навигацию.
А еще возьми ту же модульную архитектуру, где подключение модуля привносит сразу все (и даже его вид). Где лежат части этого модуля? в ТВОИХ семантических папках? нет. они лежат в модуле. Так если эта штука удобная когда делаешь подключаемые модули, то почему вдруг не делать так везде?
912 3178080
>>177978
Плохая.
1. Ты теряешь тачку
2. Если будет 2-3к рпс сам понимаешь лишняя нагрузка
3. Если это через еф то можно получить исключение что контекст не тредсейф
4. Ты продолжаешь держать скоуп

Складывай в очередь и в каком нибудь хостедсервисе разгребай раз в N секунд батчами
913 3178085
>>178080
1. Таску
914 3178124
>>178080
Спасибо.
Тоже вторая идея была накапливать записи к примеру 1к и потом пачками их записывать. А во время записи пачки в бд накапливать новые записи в другой список.
915 3178233
Авалония знатоки, нужна помощь, как портировать старый код (перевожу код написанный не мной на Авалонии 0.10 до 11.0) с RaisePropertyChanged где в качестве первого аргумента подается StyledProperty или DirectProperty вместо ожидаемого DirectPropertyBase. Там такого навалом, хз что делать в таком случае, чтобы не отломать функционал
916 3178319
>>174848
В твоей ситуации юзал SharpDevelop, неплохая штука если студия недоступна по производительности
917 3178422
>>178319
Блядь, почему ты единственный кто мне про него написал? Идеальный вариант, поставил и всё работает как надо без ебли в жопу. Спасибо, брат, век не забуду.

А все остальные советчики идите в очко блядь, дегенераты ебанные.
918 3178431
>>178422

>Блядь, почему ты единственный кто мне про него написал?


Потому что последняя версия в 2016-м году была. Тебе вообще повезло, что про него хоть кто-то еще помнит.
919 3178446
>>178422
Обращайся.
920 3178448
>>178422
Не за что, чел...
921 3179470
>>178422
Не за что, дам еще 1 совет - SharpDevelop неплох но когда речь пойдет уже о serious coding то готовься как можно побыстрее проапгредить тачку чтобы нормально работать со студией и вообще если производительность ПК ограничивает тебя в использовании более удобных средств разработки то вливай деньги в апгрейд ПК. Помни что ПК - твой велосипед для мозга, и если этот велосипед тебя тормозит, то это не дело. Говорю как человек который год откладывал апгрейд железа.
922 3180164
Я тут посмотрел процессы при помощи Spy++ на примере вижуал студии. Оказывается, что многие окна состоят из нескольких дочерних окон. Даже какой нибудь тулбар — это не юзер контрол, а отдельное окно. Пикрил 1 — иерархия окна свойств студии.

А как это реализовано? Когда я делал функционал стакающихся окон (ну когда пользователь мог перетащить одно окно внутрь другого) то я не окна перемещал, а грубо говоря манипулировал юзер контролами внутри окон.

Но в студии как-то по другому сделано. Да в хроме, когда активируется режим "картинка в картинке", и возникает плавающее окно с видео — оно тоже состоит из нескольких окон. Пикрил 2, красная и желтые рамки — это два окна. Пикрил 3 - иерархия.

Есть какая-то технология? Зачем так делать? Почему не перемещать юзерконтролы, ну или просто спавнить новые? MVVM это позволяет.

Я знаю, что при помощи WinApi можно окну указать родителя или владельца. А как это делать средствами WPF или Forms? Я имею ввиду, чтобы не выглядело как костыль.
SetParent.mp4917 Кб, mp4,
784x884, 0:08
923 3180735
>>177499
Можно даже при помощи Win32 API указать свое окно в качестве родителя относительно окна блокнота. Но вот как создать окно без режима дизайнера — это уже другой вопрос.

Собсно как здесь >>180164 многие приложухи это окна внутри окон.
924 3180807
>>180735
> Но вот как создать окно без режима дизайнера — это уже другой вопрос.
Создать дизайнер через System.ComponentModel.Design.DesignSurface
925 3183008
Как такое понимать? Почему многие флаги имеют одинаковые значения?
https://learn.microsoft.com/en-us/windows/win32/winmsg/window-styles
926 3183016
>>183008
И ладно бы когда функционал тот же самый, типа Minimize и Iconic. Но ведь Group и MinimizeBox вообще никак по функционалу не схожи.
927 3183052
>>183016
Очевидно что group и minimizebox конфликтуют и имеют применение в разном контексте
928 3183524
Здравствуйте. Хочу сохранять refresh_token в бд, когда он приходит от identity.server, а access_token в куках. С куками разобрался. А вот как сохранить токен в бд вообще не ебу. Нужно получить db контекст, чтобы засунуть его в метод, который потом этот токен сохранит в бд. НО. Как, блять, получить этот контекст? Попробовал так: IServiceProvider serviceProvider = builder.Build().Services; получил InvalidOperationException: The service collection cannot be modified because it is read-only. Подскажите, пожалуйста, как в метод прокинуть db контекст или как сделать по-человечески, чтобы работало.
929 3183526
>>183524
У context есть HttpContext у которого есть RequestServices (это скоуп для реквеста). Кури доку
930 3183531
>>183526
Охуеть, буду знать. Спасибо большое, всё заработало
931 3184034
Мб посоветуете как селениум сделать безпалевным? Неужели нет каких то готовых приблуд то?
171778656856584308.jpg60 Кб, 960x498
932 3184134
Шарпаны, там M$ нам всем каминг-аут устроила
933 3184137
Тред пидарасов...
934 3184139
>>184134
Там ещё варианты есть. Не знаю даже какой из них лучше
935 3184145
>>184134
А программисты то реально пидорами оказались
936 3184399
Планирую написать клиент двача для винды на wpf, какие подводные?
937 3184401
>>184399
Депрессия после работы с стилями в WPF
938 3184403
>>184401
Никогда не было проблем со стилями в wpf. Всё очень легко кастомизируется.
939 3184522
>>184403
система стилей в впф говно.
940 3184748
>>184522
Почему?
941 3184751
>>184403

>Всё очень легко кастомизируется.


Если у тебя не было проблем со стилями, то ты просто неглубоко копал. Например попробуй через стиль реализовать поведение ListView, который в зависимости от контекста, мог быть и ListBox и GridView, как это делает ListView с дефолтным стилем.
Или попробуй реализуй систему скинов, подгружаемых из файла.
Я уже молчу про случаи, когда тебе кажется, что все хорошо, но на самом деле все плохо. Например начитавшись вредных советов на SO мерджить словари ресурсов прям в контролах. Особенно это забавно, когда чел поливаясь потом оптимизировал функцию, чтобы сохранить пару килобайт памяти, но после действий с мерджингом, словари одним взмахом кушают 150Мб и не собираются останавливаться.

>>184522

>система стилей в впф говно.


Это просто жертвы ради гибкости, но впф позволяет сделать многое. Есть сырые вещи, типа системы тем, а есть неоднозначные и неинтуитивные, типа "generic.xaml", о которых тебе не скажут, пока не наткнешься случайно. Сложно с впф работать, если каждый раз начинать все с нуля, но если под себя настроить инфраструктуру, то получается легко. Я формсы терпеть не могу.
942 3184763
>>184399

>Планирую написать клиент двача для винды на wpf, какие подводные?



Подводные в виртуализации.
Во-первых, не все списковые контролы поддерживают виртуализацию. Без виртуализации у тебя все элементы списка будут загружаться разом и где-то после 1тыс. элементов, приложение вовсе зависнет. В режиме отладки есть окно, которое показывает иерархию контролов — хорошо по нему проверять вот такие вот проблемы.

Во-вторых, если начнешь делать подсветку текста, то скорее всего начнешь пробовать RichTextBox, а он изначально в WPF не создан для больших объемов текста (я вообще не знаю для чего). Это огромная проблема, которая до сих пор не решена. Для этого даже сделали либу, не помню как называется, но она позволяет делать подсветку синтаксиса в впф. Но там тоже надо покурить мануал и попариться. Многие редакторы основаны на это либе, например Sublime Text.
943 3184780
>>184763
Кажется библиотека называется AvalonEdit
944 3184799
>>184763

> Многие редакторы основаны на это либе, например Sublime Text.


Сомневаюсь, sublime text старше этой либы и не использует wpf.
>>184751

> Например попробуй через стиль реализовать поведение ListView, который в зависимости от контекста, мог быть и ListBox и GridView, как это делает ListView с дефолтным стилем.


Не вижу смысла реализовывать такое через стили, когда есть темплейтселектор
945 3184814
>>184399
Лучше возьми Eto.Forms.
946 3184858
>>184748
потому что явное применение стиля к контролу напрочь ломает неявные стили. И нужно брать бубен и плясать в неудобное наследование.
Также невозможно нормально создать либу и указать "вот ищи стиль тут у меня, я либа, я гуишная твою мать либа и у меня есть стили которые нужны лично мне, дай мне скоуп для этого" - хрен тебе. нужно все в App.xaml добавлять иначе IDE не видит нихрена, и само добавление подразумевает мерж стилей, что как бы вообще не то что надо.
947 3185604
>>184858

>И нужно брать бубен и плясать в неудобное наследование.


В чем заключается неудобство?

>Также невозможно нормально создать либу и указать "вот ищи стиль тут у меня, я либа, я гуишная твою мать либа и у меня есть стили которые нужны лично мне, дай мне скоуп для этого"


Можно. Для этого ты должен соблюсти два требования:
1. твой стиль должен находиться в проекте по адресу Themes\generic.xaml (либо в том словаре мерджиться), потому что это место по-умолчанию, где будут искаться недостающие стили.

2. В статическом конструкторе надо переопределить стиль.

Кроме того, ты можешь стиля передавать внутрь своего класса темплейты по имени. Наверно ты видел в шаблона, когда обязательно дают контролу имя по типу "PART_blablabla". В классе вызывается событие OnApplyTemplate, в котором по указанному имени можно и получить экземпляр на этот контрол. Так примеру работает Slider, где ты указываешь контейнер для элемента ползунка, а класс слайдера может это ползунок двигать.

Единственный минус всего этого — это все делается дооолго. Но зато можно кастомизировать что угодно.
948 3185910
>>185604

>В чем заключается неудобство?


Его нужно указывать явно. Для этого нужно знать что указать. А если ты в либе и просто не знаешь имени будущего стиля в приложении? завязываться на дефолтный стиль глупо ведь на то он и дефолтный. Оставлять записку "будь добр создай вот этот стиль вот тебе ключ такой" бррр дичь.

>Можно. Для этого ты должен соблюсти два требования


ты путаешь стили для кастомного контрола если я пишу его по всем правилам и просто стили. В либе просто НЕКУДА поместить стиль чтобы студия на него не ругалась если ты не положил его в ресурсы App.xaml в итоге. И насрать студии что стиль будет доступен в рантайме.

И мерж словарей с совпадающими ключами....нужно выдумывать ключи типа MySuperLib_TheSyle? Бредятина

>Кроме того, ты можешь стиля передавать внутрь своего класса темплейты по имени


А это вообще не про стили
949 3185911
>>185604

>В чем заключается неудобство?


ну и он конечно не может наследоваться от 2+ стилей
950 3186264
>>185911

>ну и он конечно не может наследоваться от 2+ стилей


Это как? У одного стиля бэкграунд черный, у другого — красный. На какой сам сядешь, на какой мать посадишь?
951 3186269
>>186264
сказал он написав ответ в браузере, который отображает страницу которая имеет развитую систему стилей в которой такая коллизия сплошь и рядом, но почему то победил не хамл, а веб
952 3186278
>>186269
Можешь объяснить на пальцах, а как эта коллизия решается?
953 3186282
>>185910

>И мерж словарей с совпадающими ключами....нужно выдумывать ключи типа MySuperLib_TheSyle?


А как надо? Если ты хочешь переопределить ресурс, то добавляешь ресурс с тем же ключом. Если ты хочешь новый ресурс, то называешь по новому.

У меня вроде как по началу тоже горело, и я хотел видеть что-то виде неймспейсов. Я помню, что меня бесило, что какой-то локальный ресурс был виден во всем приложении. Но потом вроде как смирился.
954 3186329
>>186278
не хочу. пусть это тебе фронтендеры поясняют. я веб знать не хочу. но я прекрасно вижу ограниченность стилей в WPF. Я обычно не попадаюсь ибо мне срать на темы, но даже мне приходится иногда мудрить - например делать пустые стили лишь бы им имя дать лишь бы их указать в Style={Static...потому что нужно разделение. Это костыли

>>186282
я не хочу ничего переопределять. Я просто хочу использовать стили. свои, и, для, себя.
Допустим, я пишу либу. В ней я хочу использовать обычные стили которые используются как Style={Static...
И возникает обычный вопрос - а куда все это добро класть?
А ответа нет. Потому что у либы в его юзерконтроле нет родительского чего нибудь в иерархии. А раз нет, значит студия не может найти определение стиля.
Решение для аппки - запихать все это в итоге в App через мерж словарей (и вот тут возникнет вопрос коллизии имен, но внутри аппки это решается ибо ты сам себе пишешь)
Но вот в либе у тебя жопца - и начинаются костыли о которых регулярно тут всплывает
- раз у нас нет иерархии, значит....впихнем все в словарь и это словарь укажем в ресурсах каждого б...ь контрола
- а поскольку дробление суперпортянок хамл неизбежно, то этих контролов может быть много
- ой блин, так каждый такой словарь дублируется в памяти. идем на со искать как не дублировать словари
и читаем 100500 тем на эту тему с сотней костылей.
955 3186390
>>184134
БЛЯДЬ, ЭТО ЧТО, ПРАВДА? СКИНЬ ССЫЛКУ, ПИЗДЕЦ!
956 3186862
>>186278
Очень легко, применяется цвет в последнем указанном стиле
2024-06-1016-14-20.png25 Кб, 1046x660
957 3186926
>>186862

>Очень легко, применяется цвет в последнем указанном стиле


Так в WPF тоже самое.
Если у тебя два ресурса с одинаковым ключом, то возьмется самый последний ресурс. Но это не является множественным наследованием стилей.

>>186329

>Допустим, я пишу либу. В ней я хочу использовать обычные стили которые используются как Style={Static...


Во-первых, шатать стили — не зона компетенции библиотек. Этим занимается конечное приложение, которое определяет итоговый стиль контролов.

Единственный случай, когда стиль допускается в библиотеке, это если ты создаешь собственный контрол, либо наследуешь существующий. Вот тогда ты пихаешь базовый стиль в Themes\generic.xaml. И уже потом, приложение, которое этот контрол использует, переопределяет стиль на свой собственный, либо юзает базовый.

Во-вторых, статик — говно, если ты уж хотел что-то динамичное. У тебя куча функционала просто отваливается. Ты не сможешь в одном словаре определить цвета, чтобы другие словари ими пользовались — а на этом и основана дизайн-система. Ты не можешь в риалтайме менять словари ресурсов. Статическая привязка типа должна экономить ресурсы, но по факту эта экономия либо нулевая, либо условная.
Возможно вся ненависть к WPF и основана на том, что ты юзаешь статик ресурсы.

>не хочу. пусть это тебе фронтендеры поясняют.


На фронтенде используют дизайн-систему и все ей подчиняются. Дизайн-система определяет четкие названия ключей, по типу пирилейтед. А то что в твоих проектах она отсутствует — это все равно что сказать "да мне пох на бэкенд, эти ваши паттерны и кодстайл, я тут насрал, там насрал, и у меня появились проблемы. Значит ваш бэкенд говно!".

>раз у нас нет иерархии


Есть. Объединяемые словари не сливают ресурсы в единый список. Они хранятся в отдельном списке MergedDictionaries, который есть у каждого словаря, и в этих списках могут быть ссылки на другие словари, у которых тоже есть MergedDictionaries. Это и есть иерархия. Ты эти словари можешь отключать и подключать. У меня на этом основан менедежер тем и скинов.
2024-06-1016-14-20.png25 Кб, 1046x660
957 3186926
>>186862

>Очень легко, применяется цвет в последнем указанном стиле


Так в WPF тоже самое.
Если у тебя два ресурса с одинаковым ключом, то возьмется самый последний ресурс. Но это не является множественным наследованием стилей.

>>186329

>Допустим, я пишу либу. В ней я хочу использовать обычные стили которые используются как Style={Static...


Во-первых, шатать стили — не зона компетенции библиотек. Этим занимается конечное приложение, которое определяет итоговый стиль контролов.

Единственный случай, когда стиль допускается в библиотеке, это если ты создаешь собственный контрол, либо наследуешь существующий. Вот тогда ты пихаешь базовый стиль в Themes\generic.xaml. И уже потом, приложение, которое этот контрол использует, переопределяет стиль на свой собственный, либо юзает базовый.

Во-вторых, статик — говно, если ты уж хотел что-то динамичное. У тебя куча функционала просто отваливается. Ты не сможешь в одном словаре определить цвета, чтобы другие словари ими пользовались — а на этом и основана дизайн-система. Ты не можешь в риалтайме менять словари ресурсов. Статическая привязка типа должна экономить ресурсы, но по факту эта экономия либо нулевая, либо условная.
Возможно вся ненависть к WPF и основана на том, что ты юзаешь статик ресурсы.

>не хочу. пусть это тебе фронтендеры поясняют.


На фронтенде используют дизайн-систему и все ей подчиняются. Дизайн-система определяет четкие названия ключей, по типу пирилейтед. А то что в твоих проектах она отсутствует — это все равно что сказать "да мне пох на бэкенд, эти ваши паттерны и кодстайл, я тут насрал, там насрал, и у меня появились проблемы. Значит ваш бэкенд говно!".

>раз у нас нет иерархии


Есть. Объединяемые словари не сливают ресурсы в единый список. Они хранятся в отдельном списке MergedDictionaries, который есть у каждого словаря, и в этих списках могут быть ссылки на другие словари, у которых тоже есть MergedDictionaries. Это и есть иерархия. Ты эти словари можешь отключать и подключать. У меня на этом основан менедежер тем и скинов.
958 3186933
>>186926

> Если у тебя два ресурса с одинаковым ключом, то возьмется самый последний ресурс. Но это не является множественным наследованием стилей.


Потому что применяется только последний стиль. А в css, применятся все указанные стили, перезаписывая свойства, если они встречаются в нескольких стилях.
959 3186935
>>186926

> Ты не сможешь в одном словаре определить цвета, чтобы другие словари ими пользовались — а на этом и основана дизайн-система


Спокойно сможет, главное этот словарь включить в app.xaml , перед другими словарями
960 3186941
>>186926

>У меня на этом основан менедежер тем и скинов.


У меня ресурсы разбиты на отдельные словари:

- Есть словарь, где хранится цветовая схема приложения т.е. это условно 20 цветов, которые абстрактно описывают цвет всего интерфейса.
- Есть словарь, где хранятся радиусы элементов, данные о шрифтах и т.д.
- Контролы хранятся отдельно и при помощи динамической привязки ожидают ключи из первых двух словарей.

Дальше менеджер скинов, который наследует ResourceDictionary внутри комбинирует словари по моим условиям. Этот менеджер добавляется в App.xaml
Система чуть сложнее, потому что есть куча прослоек, чтобы скин можно было более тонко настроить, чтобы к примеру менять контрастность интерфейса при одной и той же цветовой схеме.
961 3186947
>>186933

>Потому что применяется только последний стиль. А в css, применятся все указанные стили, перезаписывая свойства, если они встречаются в нескольких стилях.


Знаешь про "BaseOn"?
962 3186952
>>186947
Ты дурак?
963 3186973
>>186952
Может ты дурак?
964 3186979
>>186973
Но я не несу хуйню, приплетая basedon, когда речь идет о поддержке множественных стилей.
965 3187066
>>186926

>Во-первых, шатать стили — не зона компетенции библиотек


Стили не только средство изменения внешнего вида. А средство избавления от копипастинга и много чего. Внешнему приложению просто нет до этого дела. Поэтому эти стили и ИМЕЮТ x:Key ибо предназначены исключительно для того, для кого предназначены.

>если ты уж хотел что-то динамичное


вообще не говорил про динамику. ни слова. Моя претензия к системе стилей вообще - невозможность определить скоуп, невозможность разделять стали по функционалу и потом свести их воедино (BasedOn указывает только одного родителя), необходимость запихивать все в одну точку поиска по имени.

>ты юзаешь статик ресурсы


Ненависть у меня ко всему подходу где что-то может компилироваться, но при этом в рантайме тихо проглотит ошибку. Или, наоборот, из-за одной проблемы в ошибках будет каскадных сотня ошибок и хрен поймешь где реально ошибка (ее может даже не быть в окошке Errors O_O). Или когда БАЗОВЫЕ контролы сделаны так что ради изменения фона выделения нужно перегружать весь шаблон.

Еще раз - Themes\generic.xaml это про темы. Если я помещу туда стиль с x:Key то я НЕ МОГУ использовать его в ЭТОЙ ЖЕ либе как StaticRes. Студия просто его не найдет - будет подчеркивать, не смогу перейти по клику, не будет работать дизайнер. DynamicRes не является лечением этого, да и StaticRes в рантайме отработает. Это не проблема статик/динамик. Это фундаментальное отсутствие работы с этим без костылей.

>А то что в твоих проектах она отсутствует


вообще не понял что ты тут нагородил. я просто сказал что я не фронтендщик и не знаю как там решают проблемы имен. Однако я достаточно осведомлен чтобы знать что CSS позволяет навесить миллион классов на элемент и там есть такое понятие как локаторы "элемент Б лежит в элементе А - вот он нам и нужен, а не любой элемент Б". Возможно там сверхгибкость, но в WPF явный недостаток гибкости

>Они хранятся в отдельном списке MergedDictionaries


Ну иерархия вместо плоского списка...ну ок
Как это влияет на разрешение стилей по именам? А никак. 2 стиля с одним именем играют в маклаудов.
965 3187066
>>186926

>Во-первых, шатать стили — не зона компетенции библиотек


Стили не только средство изменения внешнего вида. А средство избавления от копипастинга и много чего. Внешнему приложению просто нет до этого дела. Поэтому эти стили и ИМЕЮТ x:Key ибо предназначены исключительно для того, для кого предназначены.

>если ты уж хотел что-то динамичное


вообще не говорил про динамику. ни слова. Моя претензия к системе стилей вообще - невозможность определить скоуп, невозможность разделять стали по функционалу и потом свести их воедино (BasedOn указывает только одного родителя), необходимость запихивать все в одну точку поиска по имени.

>ты юзаешь статик ресурсы


Ненависть у меня ко всему подходу где что-то может компилироваться, но при этом в рантайме тихо проглотит ошибку. Или, наоборот, из-за одной проблемы в ошибках будет каскадных сотня ошибок и хрен поймешь где реально ошибка (ее может даже не быть в окошке Errors O_O). Или когда БАЗОВЫЕ контролы сделаны так что ради изменения фона выделения нужно перегружать весь шаблон.

Еще раз - Themes\generic.xaml это про темы. Если я помещу туда стиль с x:Key то я НЕ МОГУ использовать его в ЭТОЙ ЖЕ либе как StaticRes. Студия просто его не найдет - будет подчеркивать, не смогу перейти по клику, не будет работать дизайнер. DynamicRes не является лечением этого, да и StaticRes в рантайме отработает. Это не проблема статик/динамик. Это фундаментальное отсутствие работы с этим без костылей.

>А то что в твоих проектах она отсутствует


вообще не понял что ты тут нагородил. я просто сказал что я не фронтендщик и не знаю как там решают проблемы имен. Однако я достаточно осведомлен чтобы знать что CSS позволяет навесить миллион классов на элемент и там есть такое понятие как локаторы "элемент Б лежит в элементе А - вот он нам и нужен, а не любой элемент Б". Возможно там сверхгибкость, но в WPF явный недостаток гибкости

>Они хранятся в отдельном списке MergedDictionaries


Ну иерархия вместо плоского списка...ну ок
Как это влияет на разрешение стилей по именам? А никак. 2 стиля с одним именем играют в маклаудов.
966 3187070
>>186979

>Но я не несу хуйню


Ты не можешь сформулировать ответ на вопрос как происходит работа с наследованием нескольких стилей? А потом рвешься. Все твои ответы выглядят так, как будто речь идет о последовательном переопределении одного стиля.
967 3187082
>>187070
Я тебе ответил, что свойства из стилей применяются в порядке указания самих стилей (а точнее классов, на которые эти стили нацелены). Таким образом при наличии одного и того же свойства в нескольких стилях будет использоваться его значение из стиля, указанного позже. Ты в ответ зачем-то написал про BasedOn, хотя это банальное наследование стиля и не имеет никакого отношения у обсуждаемой теме указания более чем одного стиля для элемента.
968 3187085
>>187066

>Однако я достаточно осведомлен чтобы знать что CSS позволяет навесить миллион классов на элемент и там есть такое понятие как локаторы "элемент Б лежит в элементе А - вот он нам и нужен, а не любой элемент Б". Возможно там сверхгибкость, но в WPF явный недостаток гибкости


Почему еще не перекатился в Avalonia? Там всё это есть
969 3187089
>>187066

>Еще раз - Themes\generic.xaml это про темы.


Это не про темы. Там хранится дефолтный стиль твоего контрола, который будет обнаружен даже без добавления в App.xaml

> 2 стиля с одним именем играют в маклаудов.


Ничто там не играет. Берется последний стиль в списке.
Если я не хочу перезаписывать стиль целиком, то я просто использую BasedOn.

>Как это влияет на разрешение стилей по именам?


Я ответил на вопрос.

>вообще не говорил про динамику.


Ну ты не говорил, но тебе нужно.

>Внешнему приложению просто нет до этого дела.


>Поэтому эти стили и ИМЕЮТ x:Key


Я не понимаю что ты хочешь. Хранить стили в библиотеке ты можешь. Твое предыдущее сообщение выглядит так:

>В либе просто НЕКУДА поместить стиль чтобы студия на него не ругалась если ты не положил его в ресурсы App.xaml


Ты можешь последовательно описать чего ты хочешь добиться? Получить ты этот стиль из любого места тоже можешь.
970 3187098
>>187085
шрифты в авалонии убогие. Ну да это проблема Skia, но проблема есть проблема. А еще если глянуть на примеры селекторов в их доке то не особо видно "в КОНКРЕТНОМ онтроле А есть контрол Б" могут ли они так.

>>187089

>будет обнаружен даже без добавления в App.xaml


чушь. упадет сразу в рантайме при попытке разрешить StaticRes.

>Ничто там не играет. Берется последний стиль в списке.


Это и есть маклаудизм. "выживет только один".

>Если я не хочу перезаписывать стиль целиком, то я просто использую BasedOn.


у тебя в огороде бузина
есть 2 либы. у каждой есть СВОЙ стиль x:Key="FooStyle". Причем тут BasedOn?

>Я ответил на вопрос.


Нет. это я ответил - НИКАК. Внутреннее хранение смерженных словарей НИКАК не относится к проблеме коллизии имен. Ах да - "берется самый последний стиль". так это и есть проблема коллизии и "выживет только один" - НЕ ЯВЛЯЕТСЯ РЕШЕНИЕМ!!!!!!!!!!!!!!!!!!!, а собственно является проблемой
(я достаточно много поставил !!! чтобы ты наконец перестал выдавать ПРОБЛЕМУ как решение?). Или ты из тех которые на вопрос "так это ж нужно жрать говно" говоришь "но это же описано в документации значит нормально"?

>Хранить стили в библиотеке ты можешь


Хранить могу. Получить НЕ МОГУ. Они НЕ БУДУТ работать ибо не будут найдены пока я не добавлю их и в то место, где их будут искать. Никакого автоматического поиска в generic не будет (да и вообще не должно бы ведь это USERConrol-ы, у них нет дефолтных стилей). Значит нужно куда то явно добавлять. А в случае либы таких мест всего 2
1 - App.xaml с его мержем словарей (и насрать иерархия это или что). из 2х одинаковых имен выживет только один. В ЭТОМ И ЕСТЬ ПРОБЛЕМА!! (и тут миллион !)
2 добавить в ресурсы самого контрола чтобы "тут же и нашел именно МОЙ стиль, а не чужой выживший". Но тогда происходит дублирование словарей в памяти.
image.png26 Кб, 830x307
971 3187102
>>187098

>шрифты в авалонии убогие. Ну да это проблема Skia, но проблема есть проблема.


Только если специально сранивать. Да и вообще поебать, не мне апой пользоваться...

>А еще если глянуть на примеры селекторов в их доке то не особо видно "в КОНКРЕТНОМ онтроле А есть контрол Б" могут ли они так.


Буквально один из первых примеров
972 3187103
>>187089
и речь не про стиль юзерконтрола, а то ты можешь и к этому придраться
речь про общие стили которые нужны элементам внутри моей либы. Это обычные ...что угодно в общем то поэтому и x:Key
973 3187106
>>187102

>Только если специально сранивать


там шрифты больше поэтому, а значит потребляют больше места.
а значит меньше поместится в ту же таблицу на экране

>Буквально один из первых примеров


в упор не вижу в примере где там про "конкретный вот ЭТОТ StackPanel, а не любой"?
974 3187109
>>187106

> в упор не вижу в примере где там про "конкретный вот ЭТОТ StackPanel, а не любой"?


Что ты понимаешь под конкретно этот? Можешь добавить селектор имени. Но вообще для таких целей определяют стиль в ресурсах конретно этой StackPanel
975 3187140
>>187098

>чушь. упадет сразу в рантайме при попытке разрешить StaticRes.


Это не чушь, это официальная рекомендация.

>есть 2 либы. у каждой есть СВОЙ стиль x:Key="FooStyle".


Именно по этой причине я и писал, что за конечный стиль отвечает приложение, а не библиотека. А в Themes\generic.xaml базовый стиль определяется без ключа.

>Это и есть маклаудизм. "выживет только один".


Хуже когда стиль внезапно модифицировался, и ты этого не ожидал. Потом ищи что на что повлияло и когда.
976 3187230
>>187109

>Можешь добавить селектор имени


ну банальщина же для css
#thispanel > button.red

>Но вообще для таких целей определяют стиль в ресурсах конретно этой StackPanel


ага. и получаем мегапортянку. потом разбиваем портянку на отдельные элементы и каждому свой хамл и оппа - оказывается что эти элементы знать не знают ни про какого родителя в компильтайме. В итоге толку от IDE как от блокнота. все же любят писать статически типизированный код в блокноте, ведь так же )

>>187140
я (надеюсь тебе) говорил что если в документации написано "жрите говно", то это не значит что это хорошее решение. Смекаешь? (видимо риторический вопрос ибо ты не смекаешь).
Так и напрашивается тут одно средство передвижения из мультфильма "южный парк" с особым способом крепления водителя ибо "так задумано, а значит правильно" )))))

>>187140

>за конечный стиль отвечает приложение, а не библиотека.


я, автор библиотеки А, определяю свой стиль и ок разрешаю приложению его переопределить если ему так хочется.
Автор библиотеки Б делает то же самое и знать не знает про библиотеку А.
А ты, как приложение, должен теперь решить как тебе усидеть на двух стульях.

>Themes\generic.xaml базовый стиль определяется без ключа.


отличай стили по типам и по ключам. Если у типа еще есть понятие "свой элемент" ибо у типа есть нейспейс, то стиль по ключу применяется к общему элементу у которого нет никакой уникальности. Поэтому и нужен ключ, чтобы не применялось ко всему на свете.

>>187140
Или, наоборот, должно работать, а ничего не произошло. И иди ищи. Как тебе в обоих случаях поможет IDE? а никак. в браузере же хоть и лютая дичь, но есть F12 где можно посмотреть кто повлиял, а кого нах послали.
977 3187237
>>187230

> #thispanel > button.red


Ну то есть по имени. Как я и сказал, такое там есть
978 3187242
>>187237
ну а я сказал что может и есть, но в доке это не очевидно ибо в примерах нет.
в любом случае шрифты говно и это не изменить.
И вообще выглядит уг по скиа-шному
979 3187258
>>187242

> ну а я сказал что может и есть, но в доке это не очевидно ибо в примерах нет.


Ты просто не очень умный, бывает. В доке есть пример селектора имени и селектора дочерних элементов, чтобы сложить 2 + 2 не нужно иметь семи пядей во лбу.
980 3187271
>>187258
Вообще то из первого второе не следует. И если для тебя это следует, то это ты не очень умный.
И можно легко быть как ты, а потом с удивлением узнать что оказывается система селекторов там СВОЯ, а не так как ты ожидаешь посматривая на css

ну да, бывает, что фантазируешь на тему. Вон мой оппонент фантазирует что стили в впф удобные.
981 3187277
>>187271

> Вообще то из первого второе не следует.


Конечно же следует, ведь каждый селектор это в сущности выражение linq, возвращающее перечисление, и возможность их комбинировать, применяя последовательно, это само собой разумеющийся функционал
982 3187284
>>187277
нет не следует.
то что в примере подается
<Style Selector="StackPanel > Button">
как эквивалент
new Style(x => x.OfType<StackPanel>().Child().OfType<Button>());

это НЕ значит что выборка по id будет точно так же транслирована. А если для тебя значит, то тест на логику ты провалил

Вот "на LINQ можно написать более точный селектор на который способен LINQ" - вот это да, значит. Но это не значит что DSL селектора за тебя напишет этот LINQ

И кстати про LINQ. Я вижу там LINQ и если он реально LINQ....то это работа с коллекциями. Поиск по айди в коллекции с помощью LINQ имеет сложность O(n).
Сильно не уверен что в css так же, вернее уверен что не так, ибо в DOM можно быстро найти по айди не обходя все дерево. А значит в авалонии скорее всего нет искаробочного решения такого. Поэтому и в доке нет. Решение через LINQ по природе костыль причем тормозной.
983 3187288
>>187284

> это НЕ значит что выборка по id будет точно так же транслирована. А если для тебя значит, то тест на логику ты провалил


Во первых с чего она должна работать иначе, будь ддя каждого селектора отдельная костыльная логика, это не позволило бы реализовать их композицию. Во вторых там буквально есть пример того, как работает выборка по имени

> x.Name("myButton")

984 3187301
>>187230

>если в документации написано "жрите говно"


Это ты жрешь говно, пытаясь в базовый стиль пихать глобальные ресурсы, да еще и при помощи статической привязки.

>я, автор библиотеки А, определяю свой стиль и ок разрешаю приложению его переопределить если ему так хочется.


Бля, да для этого и сделали Themes\generic.xaml
Если отрицаешь, то не жалуйся.

>отличай стили по типам и по ключам.


>Поэтому и нужен ключ, чтобы не применялось ко всему на свете.


Ты чет вообще не догоняешь. Ты создал себе контрол типа MyControl. В Themes\generic.xaml создаешь стиль, где в качестве ключа и таргет тайпа указываешь {x:Type xxx:MyControl}. И куда бы ты теперь не подгрузил либу, твой MyControl будет имет базовый стиль, который ты можешь переопределять как угодно потом.

Базовый стиль нужен чтобы просто отобразить твой контрол, как кнопку ты добавляешь и она уже имеет какой-то цвет и форму. Нахуй ты срешь себе в штаны ключами?
985 3187309
>>187301

>пытаясь в базовый стиль пихать глобальные ресурсы, да еще и при помощи статической привязки.


Да ты упорот. причем тут статическая привязка вообще????????????????? что статическая. что динамическя - РАБОТАЮТ О-Д-И-Н-А-К-О-В-О в рантайме если нужно стиль навесить один раз.
Не всем нужна смена темы в рантайме. И динамика тоже. Но конкретно в этом случае она НЕ ПРИЧЕМ.

>Бля, да для этого и сделали Themes\generic.xaml


Я по моему на русском пишу. И по моему понятно написал что стиль с ключем помещенный туда не виден нигде без добавления этого файла явно в App.xaml что в общем то и делается ибо "а что еще делать если другого варианта нет"

>Ты создал себе контрол типа MyControl


Ты достал. я не знаю как ты читаешь
я ему говорю про случаи
<Button Style="{StaticResource MyStyle}"
причем тут вообще создание контрола.

А про создание контрола это типа про АВТОзагрузку Themes\generic.xaml которая к этому не имеет никакого отношения
986 3187342
Сап шарпач. Есть желание съебаться нахуй из хуюнити и гейдева, все равно в этом говне нету души, шансы примазаться к интересному проекту равны нулю, конкуренция ебейшая, вакансий нихуя, выживаю только за счет случайных заказов (а ведь всего несколько лет назад ситуация была совершенно другая).
Какова ситуация в российском вебе/ентерпрайзе и насколько котируется C# вне гейдева? Или тут рынок также перегрет и лучше забыть о C# и вкатываться во что-то друге, ну или дрочить юнити до сеньерства?
987 3187356
>>187342
Сколько стаж? Если есть 2+ честного то просто открывай резюме и жди звонков
988 3187415
>>187342
А что там с Unigne? Он тоже на шарпе.
989 3187587
>>187342

>в российском вебе/ентерпрайзе и насколько котируется C# вне гейдева


Нормально. Как минимум половина от того объема, что занимает Java.
Но только сразу скажу, весь твой опыт в C# на юнити - нифига не котируется в вебе. Даже в чистом бэкенде.
990 3187841
>>187587

> Но только сразу скажу, весь твой опыт в C# на юнити - нифига не котируется в вебе. Даже в чистом бэкенде.


А если опыт на wpf?
991 3188533
>>187841
опыт впф в бэкенде роли не играет (хотя по факту бэкенд это фигня если писал на любых RoR подобных фреймворках на любом языке)
впф хорошо идет там где это внутренний продукт.
992 3188979
В общем. Попробовал я авалонию. И если честно - говной воняет. При всем уважении.

Может быть дело в том, что я слишком уж привык к ангулярам-реактам-вью в качестве фронтенда. Но реально - неудобно и больно. Плюс - пугает количество открытых ишью с багами по поводу мемориликов, и ответы в духе - мы не будем это фиксить, если таки хотите фикса - покупайте расширенную поддержку.

В связи с этим вопрос. Кто-нибудь дружил .net приложение с электроном у которого используется какой-нибудь фреймворк, а не Electron.NET который хочет разор-пейджи?

Просто как-бы я понимаю концептуально как подружить. Но у меня тупые вопросы возникают, типа - вот я хочу, чтобы порт для взаимодействия приложений - автоматически присваивался при старте и потом они друг с другом общались. Я хочу - вебсокеты, чтобы "сервер" о своем состоянии клиенту говорил, я хочу чтобы к "серверу" только одно приложение могло приконнектиться и куча остальных тупых вопросов. Но при гуглеже связки .net + electron мне либо хардкод попадается, где предположение, что порд 6666 всегда свободен, либо Electron.NET который с разорпейджами работает.
993 3189086
>>177820
Спасибо
994 3189782
>>188979
ничего не поделаешь. все в мире есть говно.
Для меня вот говножс и все что рядом с ним говно. Не в обиду всяким говнореактам, говноангуларам (хотя я обожаю жетпак компоуз у которого подобный подход, но там все же убогий говножс/говнодарт/говно-любойтрансляторвжс)
И если нужен уи то это выбор среди говна. Либо что то к чему то приколочено, либо огорожено, либо дичь.

Для меня вот самая няшность это jetpack compose с его выразительностью, гибкостью и главное статической типизацией (все описывается кодом, никаких вам хтмл, хмл, ммм, смс и прочее). Но...это котлин, да и только под мобилу если. На десктопе гуи нужен то побогаче.

А что впф что авалония что ваши электроны особенно - говно говна. Но сам сижу на впф ибо хоть оно говно, но все же дает достаточную свободу без необходимости костылить клиент серверное приложение будто я имбецил какой.
(была надежда на мауи что они таки сделают MVU с описанием уи кодом (хотя бы такой убогий как флаттер), но они все просрали)
995 3189783
>>189782
поправка. "но там же убогий говножс" - это относится к реактам и прочему
в жетпак компоуз котлин - а это язык со статической типизацией и мощными возможностями типа скоупов, от чего получается "няяяя". (эх шарпу был это, но у них "мы делаем жаву с сахаром, а когда не делаем то упарываемся в байтоебство.")
996 3190171
Поясните вкатуну, в связи с санкциями у шарпа и NET есть перспективы в рф или работы будет становиться все меньше?
997 3190199
>>190171
Нет. Перспектив никаких. Вкатывайся в 1С.
998 3190209
>>190199
Ты вкатился в 1с?
999 3190268
У меня есть enum флаги

> [Flags]


> public enum MyEnum : int


> {


> . . . None = 0, // 0000 0000


> . . . Primary = 1 << 0, // 0000 0001


> . . . Secondary = 1 << 1, // 0000 0010


> . . . Tertiary = 1 << 2, // 0000 0100


> }



Я хочу создать универсальный метод объединения флагов enum:

> public static void AddFlags<T>(this T targetFlag, params T[] addedFlags) where T : Enum


> {


> . . . for (int i = 0; i < addedFlags.Length; i++)


> . . . {


> . . . . . . targetFlag |= addedFlags;


> . . . }


> }



но генерики отказываются воспринимать операторы.
Есть вариант через dynamic:

> targetFlag |= (dynamic)addedFlags;


Есть решение более производительное?
1000 3190288
>>190268
- ансейф
- каст к лонгу
- через values as underlying type
Но в целом задача звучит бессмысленно
1001 3190324
Предлагаю не перекатывать тред еще 1000 постов и сидеть в андерграунде, а то джаваскуфы будут несмешно троллить и дизморалить шарпоняшек в связи с последними санкциями.
1002 3190331
>>190324
+
Кстати, здорово придумали с фейковым шарпотредом на первой странице, шизики высираются там и не доползают сюда.
1003 3190342
>>190324
Ты лучше вкатуну (мне) поясни какой положняк, а то ты (или не ты) вяло пошутил про 1с.
1004 3190355
В чем причина?
Получаю enum флаги стиля окна через win32 api, но метод ToString() вместо списка флагов выводит число.

Беру этот же enum и комбинирую флаги вручную и теперь ToString() отрабатывает ожидаемо: выводит список названий флагов.

Пикрил 1: код
Пикрил 2: вывод в печать
Одно и то же перечисление, одно и то же число, но результат ToString() разный.
1005 3190356
>>190288
спасибо
1006 3190508
>>190209
Конечно. Именно поэтому я и сижу в шарпотредах.
1007 3190513
>>190268

>Троллейбус_из_буханки.jpg

1008 3190533
>>190342

>Ты лучше вкатуну (мне) поясни какой положняк, а то ты (или не ты) вяло пошутил про 1с.


Если ты трясун ("ой, а вдруг запретят"), то тебе в 1С. Если ты ровный пацан, то учишь, ищешь работу, устраиваешься, работаешь.
1009 3190543
>>190171
Нет перспектив, гроб гроб кладбище пидор!
Каждое скачивание дотнета теперь стоит 15 рублей, все вакансии сократили, дотнетчикам в подворотне ебало бьют.

Вкатывайся в джаваскрипт и хайлоад на ноде, не прогадаешь
1010 3190600
>>190513
>>190288

>Но в целом задача звучит бессмысленно


>Троллейбус_из_буханки.jpg



Мне нужно из комбинации флагов удалить флаг и делаю я это достаточно редко, чтобы вспоминать как это сделать. Я решил сделать метод и не париться.
1011 3190603
>>190600

>Мне нужно из комбинации флагов удалить флаг и делаю я это достаточно редко, чтобы вспоминать как это сделать.


Чем тебя вариант с маской по AND не устраивает?
1012 3190605
>>190603
Я видел вот такой пример:

>sourceFlag &= ~targetFlag;


Через месяц я забуду как это делать. Не очень частая конструкция.
1013 3190608
>>190268
Мне нехуй было делать, поэтому, вот, generic методы для "|" енумов (всё тестил на .NET 8).
Пик 1: .NET 8, самый эффективный.
Пик 2: pre .NET 8, чуть-чуть менее эффективный (лишние zero extension на типах меньше int).
JIT всё соптимизирует до простого "x | y".

> public static void AddFlags<T>(this T targetFlag, params T[] addedFlags) where T : Enum


> params


> Есть решение более производительное?


Лол.
Весь метод (AddFlags) это говно без задач, не используй его, ну или хотя бы не используй params, если тебе нужна эффективность.
Но я всё же проверил его (с константами и ожидал на выходе константу; метод кстати с ошибкой: или targetFlag по ref, или возвращай T) и JIT инлайнит метод, но: цикл остаётся, массив остаётся, как и чтение из него.
1014 3190619
>>190605

>Через месяц я забуду как это делать.


Я хуй знает как такое забыть. Это ж база, как таблица умножения.
Даже нет - еще проще. Это как базовые правила сложения/умножения. Просто логика, бля.
1015 3190622
>>190608
А зачем столько приведений типов? Возьмем к примеру x
(sbyte)(object)(х)
И зачем x взят в скобки? Дальше вообще тройное приведение
(T)(object)(sbyte)
Я так понял напрямую (sbyte) в (T) не получается, но разве object не порождает аллокации? Это эффективнее dynamic?
1016 3190650
>>190619
Не, ну я конечно разобрал пример

> 0000011000001000 //типа есть у нас набор флагов



> 0000000000001000 //мы хотим удалить этот флаг


> 1111111111110111 //при помощи тильды инвертируем



> далее при помощи AND сравниваем биты


> 0000011000000000


> в итоге незатронутые нули единицы такими и остаются, а


> инвертированная единица превращается в ноль



Но я побитовые операции не использую часто и в итоге опять буду гуглить (и я уже гуглил когда-то, но забыл). Проще метод сделать и забыть.
1017 3190674
>>190622

> И зачем x взят в скобки?


Так получилось, можно убрать.

> Я так понял напрямую (sbyte) в (T) не получается, но разве object не порождает аллокации?


Нет, не порождает.

> Это эффективнее dynamic?


Да

Вообще (<тип>)(object)(<пер_типа_T>) и (T)(object)(<пер>) относительно известные конструкции в generic коде, JIT нормально их оптимизирует. Но такие конструкции порождают большой IL, поэтому JIT инлайнит их плохо, поэтому нужно AggressiveInlining.

Если что, то генерируемый код я смотрел в sharplab, а потом уже в VS2022, .NET 8.0.5, X64, COMPlus_JitDisasm=*
Например код для StringSplitOptions, как generic метода так и у обычного:

> mov eax, ecx


> or eax, edx


> ret

1018 3190695
>>190674
Понял, спасибо за разъяснение!
image.png58 Кб, 905x443
1019 3190724
>>190695
Вот ещё, к слову другие варианты (пик).
Они все эффективны (по крайней мере на .NET 8).

Я даже хз какой вариант лучше, ведь, например, (sbyte)(object) - странно, ведь реальный тип T не sbyte, а какой-то enum. BitCast требует struct (в .NET 9 не будет). int/uint вариант - странная каша из (T)(object) и указателей. long/ulong вариант не такой компактный, как int/uint вариант.

К слову всё это максимально эффективно, пока типы совпадают. А то в >>190608 на 2-ом пике, когда в метод приходят sbyte и short, код немного хуже, т.к. типы не совпадают а JIT тупой и вместо 3-х инструкций получается 5.
1020 3190732
>>190650

>Но я побитовые операции не использую часто и в итоге опять буду гуглить (и я уже гуглил когда-то, но забыл).


>Проще метод сделать и забыть.


Серьезно? Т.е. по твоему проще наворотить мутантов как тут >>190724 или тут >>190608 , чем запомнить простые конструкции вроде 1&1=1 или 1&0=0 и т.д. Там буквально три функции AND, OR, NOT. Все остальное это их комбинации.
1021 3190748
>>190732
Ну я потому и написал в тред, чтобы понять насколько это целесообразно. А так я просто сделаю пометку себе в журнале.
Ну и новое узнал сегодня, спасибо анону >>190724
>>190608

>Там буквально три функции AND, OR, NOT.


Да если бы я по десять раз на дню это юзал, применительно к байтам. Если я что-то использовал один раз и не записал это, то моментально вылетает из головы.
1022 3190763
>>190732
даже в JetBrains их запоминать не хотят и у них есть хелпер класс для битовых полей
1023 3191364
>>190355
Бамп вопросом

Почему если комбинировать флаги перечисления через оператор OR

> WindowStyleFlags windowStyles1 = WindowStyleFlags.SysMenu | WindowStyleFlags.ClipChildren;


метод windowStyles1.ToString() выдает список имен флагов "SysMenu, ClipChildren",
а если присвоить число, которое представляет из себя комбинацию все тех же флагов

> WindowStyleFlags windowStyles2 = (WindowStyleFlags)(34078720);


метод windowStyles2.ToString() выдает число "34078720"?

напоминаю что:

> (WindowStyleFlags.SysMenu | WindowStyleFlags.ClipChildren) == 34078720

1024 3191385
>>191364
Загадка дыры. В sharplab.io все нормально выводится. Что не так?
1025 3191399
>>191364
>>191385
дело в отрицательном значении флагов

> SysMenu | ClipChildren | ClipSiblings | Visible | Popup


возвращает -1777860608
1026 3191444
>>191399
Короче хз как это решать, похоже это баг. Особенно забавно, что для того чтобы сконвертировать флаги перечисления в список, на SO предлагают такую последовательность действий:
- enum перевести в строку
- при помощи Split разбить строку
- распарсить элементы массива в enum.

Мало того, что это дебилизм даже когда оно работает, но оно еще и не всегда работает, учитывая отрицательные числа.
5lqJ81dbIY.jpg83 Кб, 888x495
1027 3192474
Какая же хуета этот ваш шарп.
В enum можно переопределять значения:

> [Flags]


> public enum DaysOfWeek


> {


> Sunday = 1 << 0,


> Monday = 1 << 1,


> Tuesday = Monday,


> }



Здесь Tuesday и Monday равнозначные. И вот я хочу в комбобокс вывести список доступных итемов перечисления, используя для этого ObjectDataProvider. И какой же я список увижу?

> Sunday, Tuesday, Tuesday


потому что Monday это Tuesday, а Tuesday это Tuesday.

Вот какого хрена? Вот как эту залупу пофиксить? Ну выводи ты либо список оригинальных имен, либо не выводи дубликаты. Ну пиздец, ну сколько можно?
1028 3192491
>>192474
Ты сам себе проблему создаёшь специально а потом борешься с ней.
Если тебе позволяют что то сделать это не значит что нужно это пихать везде не включая голову
1029 3192549
>>192491

>Ты сам себе проблему создаёшь


Заходишь сюда
https://learn.microsoft.com/en-us/windows/win32/winmsg/window-styles
и видишь, что стили окна WinApi имеют совпадающие значения.

Если посмотришь примеры, где из этих стилей создают перечисление в шарпе, то увидишь, что там используются переопределения. А подход уровня "ну если это плохо работает, ну ты прост не используй это)))" — такой себе. Это просто откладывание проблемы на потом.
1030 3192561
>>192549
Это отлично работает и решает свои задачи. В коде это всё прекрасно работает и матчится.
С стилями и флагами ты уже заебал, если ты зелёный на вкате то не пизди что везде проблемы, а башкой и гуглом думай почему так сделано.
Каждый вкатун думает что умнее всех
1031 3193626
>>192549
>>192561
Короче, решил через конвертер значения и вывод аргумента

> [Display(Name = "EnumItemName")]



По другому хз как.
1032 3193659
>>193626
Не, не выйдет.
Все варианты получения атрибута идут через указание строкового имени значения. А переводя элемент перечисления в строку, я получаю не оригинальное имя, а переопределенное.
image.png97 Кб, 474x399
1033 3193734
Бля снова запутался пздц.
Кому вообще в здравом уме понадобится использоваться Blazor Server ? Зачем отрисовывать страницу с большим пингом?
Почему микрософт пытается придумать свой велосипед? Блять придумали свою залупу в виде net core, одумались сделали net, начали какую то хуйню делать в Startup.cs одумались сделали нормальный с более понятной структурой Program.cs
В блазор сделали блять какие то режимы,@rendermode InteractiveAuto не работает без клиент. Спрашивается нахуя тебе клиент? Почему автоматический его не сбилдить? Делаем один проект помечаем компоненты @rendermode InteractiveAuto и все блять.
Я просто не понимаю смысла во всем этом.
Вот хочу я приложение сделать которое бы в бд писало строку, а потом мне показывало строки.
СОздаю проект Blazor Auto, я ожидаю что я буду писать код в клиенте обращаясь к классам и методам в сервере, а оно уже как то само http запросы будет делать и связыватся. Но хуй там плавал, создавай сам запросы, пиши web api и проче. Вопрос нахуй нужен тогда серверный проект?
Мне просто не понятна логика тех людей которые это сделали. Как они объясняют это вообще?
1034 3193741
>>193734
Если тебе не нужно, то и не используй.
1035 3193744
>>193741
Я вот не знаю.
Может и нужно просто я не понимаю.
Это как с интерфейсами, я пока не понял зачем они вообще не использовал.
1036 3195766
Насколько реально найти фриланс на wpf и совмещать с основной работой?
1037 3196013
>>195766
ну ты либо найдешь
либо не найдешь.
1038 3196075
>>195766
Ты никогда не найдёшь фриланс на WTF.
1039 3203790
Как устроена привязка к свойству? Я знаю про мягкие ссылки и мягкую подписку, и про событие PropertyChanged, которое содержит имя изменяемого свойства, и что обязательно должна быть связка DP + INPC или DP + DP, но не INPC + INPC. Но вот что конкретно меня интересует. Допустим мне во вьюшку приходит экземпляр модели и я хочу отследить изменение определенного свойства этой модели.

Способ 1. Я могу подписаться на PropertyChanged, а потом устроить что-то вроде if с проверкой имени изменяемого свойства. Проблема в том, что это событие будет возникать гораздо чаще, чем будет изменяться интересующее меня свойство. Плюс проверка стрингов как-то не очень эффективна на мой взгляд, особенно когда свойств будет несколько десятков.

Способ 2. Я могу создать подписку при помощи
BindingOperations.SetBinding, ну или обычным биндингом в XAML. Но вопрос в том, как эта привязка работает, и будет ли она более эффективной, чем вышеописанный способ 1? Потому что для привязки указывается путь к привязываемому свойству в виде той же строки, и это выглядит так, что она подписывается на все тот же Source.PropertyChanged и все так же при помощи Path определяет необходимое свойство.
1040 3210234
>>203790
Дык биндинг 2 внутри себя будет делать то же что и 1 если есть INPC иначе через TypeDescriptor будет следить через какую то там магию с подпиской на изменение свойства (с мемори ликом ведь это будет стронг привязка)

Насчет проверки стрингов - используя nameof ты получишь интернирование. Насчет [CallerMemberName] - возможно тоже (это нужно посмотреть что он там сгенерит)
1041 3210245
Посоветуйте годный видео-курс для самых-самых вкатунов. Желательно по структурам данных и типизации. А то эти ваши листы, словари, енумераблы и Class[] ломают мне мозг после PHP.
1042 3210296
>>210234
Понял, спасибо
1043 3210300
>>210245
Так этих курсов полно. В этом вся и проблема, что они для начинающих в основном.

Единственное, что смотреть зашквар, это: Романа Сакутина и Гошу Дударя. И пусть тебя не смущает, что один критикует другого — оба прожженые инфоцыгане и советуют дичайшую ересь.

Можно с осторожностью смотреть XpucT, но лучше защититься от пси-лучей говнарства и секты WinForms. И при получении минимальных знаний незамедлительно дропнуть и не возвращаться.

Можно навернуть SimpleCode, а если не боишься умереть от кринжа и петросянских шуточек, что попробуй ExtremeCode. У каждого в начале много воды - можно скипнуть, и возможно установка вижуал студии 2015 уже не актуальна, но все остальное все еще имеет смысл. Там одним массивам уроков десять посвящено.

Ну или на торрентах искать туторы.
1044 3210352
>>210300
Simplecode просто лучший, посмотрел все видео у него и про c++ тоже. Жалко что нацистом оказался
1045 3210534
>>150625

> Типа пишешь метод как обычный синхронный, но при желании - берешь и запускаешь его как асинхронный


Task.Run разве не это делает?
image.png16 Кб, 948x115
1046 3210859
strokeColorcolor of progress bar string
Это блять че, это блять как?
https://antblazor.com/en-US/components/progress#API
1047 3210966
Как без аллокаций преобразовать массив интов в массив байт?
1048 3210976
>>210966
MemoryMarshal.AsBytes
MemoryMarshal.Cast

Unsafe.As - собственно его MemoryMarshal и юзает под капотом
1049 3211073
>>210534
Task.Run - просто запускает метод в тредпуле и оборачивает его в таску, чтобы ты мог как с таской работать. Со всеми плюсами и минусами этого дела.

С горутинами - там, по сути - сделали свои софтверные потоки, которые поверх потоков ОС крутятся, и рантайм имеет возможность поместить ожидающий чего-то поток обратно в очередь и начать выполнять другую рутину. Т.е. примерно, как шарповские таски и работают или промисы в других языках. НО, при этом - ты метод свой писал абсолютно как синхронный, ты все еще можешь использовать его как синхронный, если надо, а если надо - можешь его как горутину запустить.
sage 1050 3214751
>>214727 (Del)
Репорт.
1051 3217476
Имеется табличка из 3 колонок, надо сгруппировать по имени и посчитать сумму.
С SQL-запросом проблем никаких нет.
Как его переписать на EF? Сейчас не получается вытащить Id записи.

https://pastebin.com/fKKKvr2d
image.png4 Кб, 894x92
1052 3217492
Вот это что такое?
Мне нужно простенькое приложение под андройд написать. На чём писать его? На Мауи?
А ебала на скриншоте это что?
1053 3217497
>>217476
Я может тупой но твой SQL работать не должен банально потому что id нет в гроуп бай. Да и вообще какой id ты хочешь получить? Их же сколь угодно может быть при группировке по нейму
1054 3217647
Вы чо?? Стоит в отпуск уйти - никто не перекатывает.
1055 3217650
>>217647
Перекати.
1056 3217654
>>217650
Если до пятницы не перекатят - таки перекачу.
1057 3217680
>>217497

> Да и вообще какой id ты хочешь получить? Их же сколь угодно может быть при группировке по нейму


Тут мой косяк, копипастил из другого места, а sqlite прощает такие ошибки, попытался упростить называется.

По итогу, разобрался, виновник в лице sqlite был найден.
В очередной раз убеждаюсь какой же sqlite убогий, стандарт SQL поддерживает через одно место и позволяет писать так, как нельзя писать ни в одной другой нормальной реляционке.

Там 2 таблицы, связь один ко многим, поэтому имена могут повторяться и мне нужно было вытащить айдишник, имя и сумму по данному имени.
Расследование (полная схема + тестовые данные):
https://pastebin.com/f77ZEx00

> Я может тупой но твой SQL работать не должен банально потому что id нет в гроуп бай


Не должен, но sqlite плюёт на правила:3
1058 3217687
>>217680
В ефе есть навигационные поля и не нужно всё руками джойнить
1059 3217697
>>217680
Точнее ты плюёшь на правила, а sqlite всего лишь не ударил линейкой по рукам.
1060 3217702
>>217687
Явное лучше неявного.

>>217697
Всё дело в стандарте, как выше писал.
1061 3217707
>>217702
В стандарте прям так и написано, что в этом случае обязательно должна возникнуть ошибка?
1062 3217770
>>217707
Да, он в открытом доступе, можешь почитать.
1063 3217792
>>217770
Понял, спс.
1065 3218907
>>097760 (OP)
>>218884

ОТМЕНА
https://2ch.hk/pr/res/3218902.html (М)
https://2ch.hk/pr/res/3218902.html (М)
https://2ch.hk/pr/res/3218902.html (М)
Легитимный. Прошлый не попал в каталог так как видимо я не написал /csharp/
Или я хуй знает почему он не попал в каталог
Корчои удалите тот который не правельный
Тред утонул или удален.
Это копия, сохраненная 12 июля в 00:33.

Скачать тред: только с превью, с превью и прикрепленными файлами.
Второй вариант может долго скачиваться. Файлы будут только в живых или недавно утонувших тредах. Подробнее

Если вам полезен архив М.Двача, пожертвуйте на оплату сервера.
« /pr/В начало тредаВеб-версияНастройки
/a//b//mu//s//vg/Все доски