Вот с другой стороны - разбить бы ебало пидору, который: 1. Сделал возможность наследования по умолчанию. Приходится как дебил постоянно sealed добавлять 2. Сделал enum таким кастрированным. Вот срсл, сравнить с С++ или жавой. 3. Нахуевертил вот этой хуйни с интерфейсами, которая сейчас. Это реально пиздец. 4. Нахуевертил эксепшинов там где они нахуй не нужны. Вот серьезно, какого хуя-то отключение сокета на другой стороне - должно кидать исключение-то? Ошибка со статусом - нормально было бы. Нет, блядь, лови в ебало эксепшн(Охуенно-то как если у тебя какой-то парк устройств, свет вырубился - твое приложение - на 5 минут - ушло в себя обрабатывать все это добро) 5. Перекатывает после 500 поста
>>2740901 >Но он же сертифицированный работник майкрософт! Если эти умельцы создали медиаплеер, у которого субтитры чисто белые, без контрастного фона или обводки, то хули ты от них хочешь?
Как будто у них есть специальный отдел по самым уебанским решениям на свете.
>>2740335 → >Сейчас по моему кроме автофака и майковского уже ничего не осталось актуального. И фич второго хватает в 95% случаев. "фича" майков только одна - когда они влепили его в асп.нет то использовать там "свой любимый" стало неудобно. А так DI от майков - просто базовый. Ни тебе декораторов, ни условных иньекций, ни вмешаться в процесс конструирования графа. Простая автофабрика со скоупами.
>>2740797 >Сделал enum таким кастрированным при этом он хоть и является этаким особым наследником int/byte но работает медленнее >Нахуевертил эксепшинов там где они нахуй не нужны. увы но должен быть один подход - либо коды ошибок либо ексепшены. либо это 2 параллельных апи, а кому оно надо
>>2741034 Вот есть у тебя папка "Картинки", в ней лежат пикчи и вложенные папки "Аниме" и "Хуйцы". Когда ты открываешь папку с картинками в проводнике Windows, ты же не видишь в ней пикчи с аниме и хуйцами? Надо отдельно открывать вложенные папки. С неймспейсами почти тот же принцип, разве что иерархия неймспейсов не обязательно соответствует физическому расположению каталогов с исходниками.
>>2741709 Ну, во первых win2d это библиотека для uwp, а во вторых она работает напрямую с directx, минуя фреймворк, за счет чего достигается крайне высокая скорость работы с графикой.
>>2741613 Если поверхностно судить, то судя по всему Skiasharp это чет универсальное, а win2d майкрософтовское. Очевидно что за универсальность придется платить функционалом или производительностью.
win2d все так же поддерживается и есть для NET.6 Тут вопрос в том, каковы планы анона, и если за пределы шиндоваса не выходят, то я бы выбрал двухмерный вин против школошарпа.
Но опять же, тут нужно навернуть оба говна, чтобы понять в чем нюансы. По себе знаю, что хватает отсутствия одной детали, чтобы перечеркнуть все плюсы.
Вообще, проблема win2d в том, что документации почти нет. Есть доки на гитхабе https://microsoft.github.io/Win2D/WinUI2/html/Introduction.htm и собственно все, в инете инфы по либе кот наплакал. SkiaSharp же обзавелся большим сообществом и на любой вопрос можно найти ответ.
Господа, как вижле заставить адекватно работать следующее: 1) Не "съедать" скобку если такая уже стоит справа от курсора. 2) При создание типа переменной не выполнять автоподстановку по нажатию на пробел (ппц гении).
>>2741911 Чел, все эти проблемы вылезают в 10% случаев. Второе вообще возникает при хреновом именовании собственных объектов. В попытке борьбы с этими 10%, ты рискуешь обрести гемор с противоположными 90%.
>>2741931 Стандартные средства WPF. Конкретно с производительностью проблем не испытал (мб потому что веткор), но вот взаимодействие, типа редактора узлов кривой, выбор объектов, трансформации геометрии, чтение SVG — пришлось самому делать.
Но я щас посмотрел на доки, и даже с виду какая-то залупа. Все эти свойства и методы есть в стандартном Media, кроме читальщика svg или RgbToHue (мне пришлось самому писать конвертеры в различные цветовые схемы, HSV, HSL и CMYK).
>>2742004 Ну смотря какие у тебя цели. Насколько я знаю, в винфомрсах тупо красятся пиксели. В WPF у тебя каждый штрих или кривая — это отдельный объект (причем со структурой из сегментов, патчей и фигур с поддержкой булевых операций). Мне нужно было второе, чтобы я мог кривую переместить, повернуть, отмасштабировать, перекрасить.
Зато впф определенно сосет в ричтекстбоксах. Настолько сосет, что сделать какой нибудь редактор кода с подсветкой синтаксиса официально невозможно.
>>2742013 >и когда их очень много, то все очень не очень. Ну дык все графические редакторы вещь тяжелая. Я знаком с векторными редакторами и структура объекта в WPF была очевидной и неизбежной. И в Corel Draw и в Illustrator устроено абсолютно так же.
Возможно для растра этого не нужно, хотя в фотошопе вроде тоже появились всякие blending options, смарт объекты и динамические градиенты, которые подразумевают хранение не только координат штриха, но и что-то еще.
Если уж зашла речь о редакторах, как бы вы реализовали рисование различными кистями? К примеру есть кисть с текстурой карандаша, как сделать, чтобы при рисовании текстура не накладывалась сама на себя множество раз, превращаясь в сплошную линию?
>>2742191 >при рисовании текстура не накладывалась сама на себя множество раз, превращаясь в сплошную линию?
Не понял о чем речь. Как у тебя реализована кисть? Если это грубо говоря точки вдоль контура с неким шагом и с неким размытием, то решается это все собственно 1. шагом, 2. текстурой. Она не всегда однотонная именно для этих целей. Если мы говрим об условном шуме, то там есть темные и светыле пятна, при наложении друг на друга никогда не дадут однородынй цвет. 3. радиальным размытием кисти 4. режимом наложения (add, multiply, difference, color burn и т.д.) https://ru.wikipedia.org/wiki/Методы_наложения_(компьютерная_графика)
Ну а в более сложных подходах (как это было в зибраше) у текстуры есть еще карта высот и на это реагирует свет, создавая ту самую естественную текстуру + учет вектора кривой, чтобы расположить текстуру вдоль собсно кривой. Вроде на презентации win2d я видел, что можно из коробки рендерить карут высот и выставлять источник света
Но ты заебешь одну эту технологию пилить, если по уму. Я год потратил на своё.
>>2742729 >Как это фиксить? Не читать метанит, который предназначен для совсем маслят? Вот даже в твоем вопросе нарушение логики. Если что-то спросили и ты не знаешь — выучи это и будешь знать.
>>2742198 Не понял тебя >>2742680 > Не понял о чем речь. Как у тебя реализована кисть? Если это грубо говоря точки вдоль контура с неким шагом и с неким размытием, то решается это все собственно Есть точки, есть кисть пик например, сейчас у меня для каждой вычисленной точки использую алгоритм Wu отрисовывается данная текстура, с центром в этой самой точке. > шагом, Если увеличить шаг, то линия не будет одной толщины, и в целом не будет плавного рисования, когда штрих следует за курсором. И это в любом случае будет выглядеть не очень, так как наложение так и так будет происходить.
> текстурой. Она не всегда однотонная именно для этих целей. Если мы говрим об условном шуме, то там есть темные и светыле пятна, при наложении друг на друга никогда не дадут однородынй цвет. Опять же все зависит от частоты. > радиальным размытием кисти Как это поможет? > 4. режимом наложения (add, multiply, difference, color burn и т.д.) Думал об этом, но в данном случае пространство между брызгами прозрачное как и остальной холст, поэтому хз что здесь можно наложить
>>2742778 Чел ... ты видел как устроены кисти в фотошопах, зибрашах? Если ты подобную монохромную текстуру загрузишь в фотошоп, то будет ровно тоже самое, поэтому шум кисти всегда имеет оттенки, либо не имеет, если зудожник использует кисть для маски. Сейчас, у тебя текстура не предназначена для твоих целей. Формально, у тебя не текстура, а альфа. Посмотри пикрил текстуоы карандаша, там тон неоднородный — есть светлые и темные участки, которые при наложении не сольются (само собой и альфаканал там должен присутствовать).
Художники обмазаны килотоннами альфа-кистей под разный пук, с разным контрастом, текстурой и масштабом детелей. В Substance Painter к примеру все эти кисти настраиваются процедурно: масштаб "капель", контраст и вообще куча шумов намешано.
> радиальным размытием кисти > Как это поможет? Это не твоя забота тащем-та, художник занет зачем. Если вкратце, то блюр может помочь избавиться от "швов" накладывающихся друг на друга паттернов.
> шагом, > Если увеличить шаг, то линия не будет одной толщины, Епта, посмотри на настройки кисти в фотошопе и других редакторах. Конечно может и иногда художники это юзают для рисования например швов ниток. Суть в том, что это параметр обязан быть.
Еще раз, ты должен ХУЙдожнику дать набор параметров, а он сам подберет нужную альфу, нужный размер кисти, нужный нажим, нужный блюр, режим Lazy Mouse (это когда кисть реагирует на движения юзера с задержкой — позволяет рисовать плавные изгибы).
Настоятельно рекомендую изучить как все устроено в других приложениях и не городить велосипед. Я тоже сидел и анализировал что и как в разных приложениях устроено. Кажыдй делал так, как считал нужынм. К примеру в Corel Draw колоприкер реализован через таймер, от чего колорпикер безбожно тормозит в попытках перерисовать контрол с градиентом. В фотошопе колорпикер хитро подменяется на иконку курсора, что позволило повысить избавиться от фризов.
Тут нужна наблюдательность. Установить все программы и смотреть что и как кто сделал.
У нее бы был метод void Apply(DrawEvent e, Canvas c);
DrawEvent - содержит сплайн по которому шло рисование, кисть, размер точек в частях сплайна
Ну, далее, в этом Apply бы и происходила логика с наложением в зависимости от метода наложения. Где-то бы происходило умножение, где-то бы вычитание, где-то бы если уже прошлись по этим координатам - нихуя не делаем.
>>2742191 Ну а в твоем случае, чтобы просто было - просто накладываем текстуру на весь холст, далее - вычитаем все что не по сплайну прошло.Т.е чирканули - накладываешь текстуру на холст, потом - вычитаешь из того что наложилось сплайн, потом инвертируешь наложение. Тогда текстурка будет равномерно и не перекрывать сама себя.
>>2743036 > Берм квадратную альфу кисти, и дальше распределеяем копии по сплайну с неким шагом, учитывая перпендикулярный вектор относительно сплайна. И получаем в местах поворота сплайна наложение текстур при повороте, от которого хотел избавиться чел что спрашивал.
> А пытаться тайлить холст — это провальная идея. Она даже выглядеть будет супер пососно. Ну, тут зависит. Вполне нормально может выглядеть, если текстура норм. Другое дело, что сильно компуктерно.
А нормальное решение - я предложил изначально постом выше. Выделить блендмод и там порешивать, как че накладывать. Кисть при этом - это отдельная сущность которая несет информацию только о форме, силе нажатия тексткрек, степени размытия краев, наклоне и т.д.
>>2743039 >от которого хотел избавиться чел что спрашивал. Так надо советы давать не губительные, с этим челвоеки давно уже разобрались. Все гарфические редакторы работают по моему принципу. Все. А с талингом нужно делать бесшовную текстуру, нужно учитывать разрешение экрана, нужна своя библиотека текстур, которая не будет подходить к дурим редакторам.
>Вполне нормально может выглядеть Я те отвечаю, что будет выглядеть как говно, ибо отсутствует вариативность шума. Как хужожник художнику отвечаю, что юзер при работе постоянно меняет радиус кисти,чтобы создать ту саму вариативность шума.
Если так нужен подобный эффект, то художник сам возьмет текстуру и маской ее обтравит.
>И получаем в местах поворота сплайна наложение текстур при повороте, от которого хотел избавиться чел что спрашивал. Иногда не стоит идти на поводу претензий. Возможно причина проблемы в другом - в самой текстуре.
Есть ли в c# аналог vb.net модификатора доступа Shadows? Объясню как он работает. Он затеняет метод\свойство базового класса, но не переопределяет как overrides. Метод в базовом классе по прежнему существует, но не виден при обращении к наследнику.
Обычно такой подход используют для ситуаций, когда элемент базового класса не помечен как overridable (или virtual). Тогда его затеняют, а теле метода обращаются к базовому классу.
Public Shadows Sub Add(item as T) . . . MyBase.Add(item) //аналог base.Add(item) End Sub
Как такое сделать в шарпе? Я наследую список, и мне нужно переопределить метод Add.
>Более правильно будет - сделать класс, который не наследуется Да мне там надо всего пара методов поправить, чтобы он добавлял в итем себя в качестве родителя.
>>2743475 Я бы кстати эту фичу отключил бы, если бы знал как. Лично для меня - она чаще мешает. Я привык как раньше - хуячишь, потом мышечной памятью выбираешь че там intellisense предложит выбирать. А теперь так делаешь - и в результате у тебя не то что надо, приходится назад исправлять. Бесит.
>>2743505 Да ну. Мне например нравится, что когда инжектишь сервисы, она тебе сразу и ридонли поле полностью прописывает и параметр конструктора и сразу связывает их, причем с именами по кодстайлу. Удобна.
Подскажите по проблеме плиз. Есть edmx, database first. Мне нужно поудалять свойства из EntityType, так как их дохера и мапинг занимает кучу времени. Удаляю - выдает ошибку 3023. В чем ошибка-то, если я удалил эти свойства из модели, почему от меня требуется, чтобы я указал сопоставление? И как вообще сделать так, чтобы в таблицах, добавленных из бд, было только несколько нужных мне свойств, а не все 100?
>>2743572 Хуй знает, никогда не работал с database first. Но чисто по логике и исходя из сообщения об ошибке, оно похоже ругается из-за того что свойство в БД не nullable и он не сможет его отрезолвить при обратной записи в БД. Сделай столбец в БД nullable или задай ему дефолтное значение.
Сап хуйтишники, крч решил я это омгмгм вкатиться в этот ваш закрытый гей-клуб на C#, так сказать язык для элит. Но мне нужно чисто так, для юнити, я просто недавно такой проснувся и понял, что я Кадзима-Гений и мне срочно нужно запилить свой шедевр российского геймдева. Ну крч, я туповат и в школке на паскале прям тупил постоянно, чё то для меня слишком много букаф и цифр было на клавиатуре. Но в институте я "паумнел"(учусь на ЫНЖЕНЕРА) и стал любителем Софии. И крч я понял что ООП это типа философия на минималках. И прям щас на изичах хаваю учебник "че-то там изучем си шарп хуярим игры для унити 5 издание"(кста норм учебник?). Но к чему это я. Какие вообще есть пути дальнейшего развития на этом языке? Мне просто прям чёт вкатывает вся эта ваша залупная хуйня для задротов комнатных.
>>2743825 Если минимальная база по программированию имеется, то советую свой проект пилить, не важно на сколько это будет хуево и убого. На этом будешь учиться. Постоянный гуглежь и вопросы к gpt чату в помощь. Параллельно можешь читать что-то самое примитивное, для совсем вкатунов по твоему направлению. Вроде были раньше советы по книгам в шапке, но проебались. Загугли книжки сам. Бери самую простую и популярную.
Когда мало-мальски прошаришься во внутренние кухне направления и фреймворка. Ищи форумы, обсуждачи, группки и тд где такие же как ты сидят, только поопытнее. Сиди там ридонли, ну или базарь, как хочешь. И становись челом который про разработку реальных игра что-то знает. Про первый совет не забывай - постоянно что-то пиши, заимствуй любой код, который делает что-то прикольное, изучай его в отладке чтобы понять как он работает и тд.
Чтобы не забить на все это дело, нужна нихуевая мотивация время свое просирать непонятно на что. Так что если осилишь базу своего направления, то ищи челов, которым нужен прогер-разраб любой хуевости для своего гавно-инди. Примыкай к таким и развивайтесь вместе. Ничего из этого не выйдет скорее всего, но ты получишь опыт и знания.
Если базы нет, то сперва придется вкатиться в программирование. Не важно на каком языке. Иди учи язык, тот же шарп, по видосам с ютуба. Когда сможешь сам осилить самую простейшую консольную хуйню из задачников, то смотри первый совет.
>>2743825 Делаешь собственный проект и по ходу понимаешь где соснул. Я свой уже четвертый раз переделываю (за полтора года), узнавая что-то новое. Иначе никак.
Я тут недавно от одного чела узнал базу, с которой я внезапно согласен — проект должен быть объемным и долгосрочным. На микрописюльках просто нет шансов узнать что-то новое.
Единственный минус такого подхода — твоя собственная сила воли. Я как любитель игр жанра выживач, обожаю аутировать и в целом не против длинных марафонов да потом еще все переделать заново.
>>2744195 Ты врун. Свойство по сути является мотодом, поэтому не работает в качестве передачи переменной. Алсо в бейсике работает, но компилятор достаточно умен, чтобы потом оптимизировать и подставить временную переменную.
>>2744213 >Алсо в бейсике работает, но компилятор достаточно умен, чтобы потом оптимизировать и подставить временную переменную. И нахуй ломает всю инкапсуляцию.
>>2744197 Я хочу сделать в жанре survival horror в духе ps1-ps2 игр(RE, Тихие Холмы). Голливудский сюжет уже запилил в своей голове. Я так-то заходил на геймдемовские гейские ру форумы . Но чет разочаровался в таможних аутистах делающие говно игры на унити. У челов реально нет фантазии. Какое-то однотипное и скучное говно а не игры. Слишком дохуя НПС пытающиеся пилить игрули своей мечты. Ну справедливости ради походу не каждому дано быть псевдотворцом Кадзимой.
>>2744269 >нет фантазии. Какое-то однотипное и скучное говно а не игры какая фантазия может быть. ты их жизнь видел? они ЖИЗНЬ пилят. Вот из свежего - "симулятор жизни в хрущевке". А ты со своими фантазиями в жизнь лезешь. Ничего не понимаешь
>>2744336 >какая фантазия может быть. ты их жизнь видел? Так лол, а сильно ли отличается жизнь желтолицых?) Почему они могут высерать хотя бы поверхностного говно, берущее атмосферой и визуалом, а наши Васьки нет?)
Слушайте, а вот такой вопрос. Стоит ли читать какие-то книги? У меня под рукой лежит Рихтер, но там по версии фреймворка 4.5. По сути, большая часть того, о чем он пишет, есть на msdn в более актуальной форме или даже на тех же метанитах.
Я понимаю, читать какую-то не привязанную к технологиям классику вроде "Грокаем алгоритмы". С другой стороны, хочется рассказывать теорию как сеньор-помидор, а не отталкиваться от практики.
>>2744365 Стоит. Интересны не какие-то книги на обобщенные темы (это с легкостью заменят туторы на ютубе и msdn), а когда обсасывают конкретную тему.
Я полгода ругался на WPF, словари ресурсов, на все это убожество (как я считал), выстраивал безумные теории, изобретал квадратные колеса, по сути ухудшая себе положение нарушением соглашений, да и аноны ИТТ в основном заднеприводные и про фронтенд не особо знакомы. А в книгах есть такие нюансы, которые строят объемную картину по конкретной тематике.
Не скажу, что я знаю всё, но в 10 раз больше, чем описано в мдсн, метанитах и туторах на ютубе.
>>2744390 Намеренная политика, когда эффективно пользуется системой только её разработчик и приближенный, а остальные барахтаются в говне не понимая что делают, это дает конкурентное преимущество майкрософт. Эту обфускацию довели до того, что теперь без нейросети не поймешь даже с какой стороны подходить. Но и нейросети манипулируемы, их можно заставить выдавать неактуальные данные, а настоящие придерживать для себя.
>>2744467 А где им еще быть. Оно там и должно. перегрузки это не фича ооп, это диспетчеризация методов. А сокрытие это уже инкапсуляция - один из китов ооп. Структуры же - хитрожопые подобия классов со своими премудростями
>>2744390 >Стоит. Интересны не какие-то книги на обобщенные темы (это с легкостью заменят туторы на ютубе и msdn), а когда обсасывают конкретную тему. > Что посоветуешь?
>>2744467 Ты бы с этим вопросом к создателю ресурса и обратился. Метанит - это не какой-то академический справочник сделанный по всем канонам, а просто ресурс одного чувака, который начал когда-то для себя систематизировать материалы и не смог остановиться.
А в шарпе есть оператор "And Also"? В этмо случае сперва проверяется первый операнд и если он уже вернул False, то второй операнд не будет даже проверяться.
>>2744796 Если использовать в режиме "Бля, как же эта хуйня называется/кодится. Вот бля, забыл" По быстрому посмотреть и вспомнить. Вобщем как сборник заметок, которые пролистать проще, чем в МСДН ковыряться.
А где старая шапка, которая очень объемная такая была? Там еще много полезной литературы было по возрастанию сложности. Куча всяких ресурсов и прочего. Почему её убрали?
Есть приложение, которое разворачиваю в Докере, сначала всё ок. Но если подождать какое-то рандомное время и попробовать отправить запрос, то в ответ будет нихуя. Само приложение при этом точно работает, один фоновый сервис в лог пишет в нём. Если перезагрузить контейнер, то всё снова будет ок, но заёбывает. Гуглил проблему, нашёл что-то типа такого: https://github.com/dotnet/aspnetcore/issues/45215, но у меня дотнет 6. Единственное: у меня нет launchsettings.json в проекте, конвертил его из консольного в WebApi и как-то забил на это, вроде и так работает
Промониторил вакансии у меня в стране. На сишарп почему-то мало откликов. Около 50. На джаву по 200-300. Почему так? Стоит ли вкатываться в сишарп в таком случае раз никто не идет туда? Хочется успеть на поезд пока пиздец с вакансиями еще не докатился до моей страны
>>2745516 Пипец. 23-й год на дворе, а мне еще на SO и другие погромисты втирают что-то про "да не парься, компилятор оптимизирует лучше тебя".
Что мешает компилятору самому принять решение в столь очевидной ситуации? У меня что, где-то на середине процесса из воздуха появится параметр в методе? Даже если я его переопределю, то у меня должна быть та же сигнатура.
Нахуй и в пизду. Не доверяю я этому вашим оптимизациям. Они странные. С одной стороны "не парься" а с другой залупа, вроде "нельзя передать метод в out" или "помечай метод ридонли".
>>2745529 Не стоит вкатываться в сишарп. На сишарп мало откликов. Около 50. На джаву по 200-300. Если вкатишься, что не успеешь на поезд, а ведь скоро пиздец с вакансиями докатится до твоей страны.
>>2745585 Песню про поезд и пиздец с вакансиями я ещё в 2016 слышал. Теперь вот прям точно ВСЁ? Следующего ещё большего ВСЁ не ждать? Прям точно-точно?
>>2745580 ну сегодня ты не сделал readonly и "пусть компилятор выведет" - завтра ты метод изменил и не учел его ридонлитость, и компилятор вывел что "он не ридонли" - только теперь ты об этом не знаешь. Так что помимо опитимизаций все эти гарантии еще проверяются - readonly, scoped кое как защищают тебя от некоторой стрельбы по ногам по причине "я ж не слон все помнить"
в шарпе еще и val не хватает к var. Но это ж шарп - тут много чего сделали через жопу.
Взять хотя бы тут не раз упоминаемые делегаты и LINQ, когда передавая ламбду все хорошо, но стоит передать Method Group, так сразу "радость" GC
>>2745266 У меня было что в линухе висит слушаемый порт, процесс вроде тоже жив, а байты будто в трубу улетают. Решилось заменой дедика то есть в моём случае была проблема с осью/железом
>>2745613 > завтра ты метод изменил Во-первых, это не так-то просто сделать, т.к. вероятно этот метод уже используют. Поэтому изменение сигнатуры вызовет ошибку.
В-вторых, учитывая глобальные изменения по решению первого пункта, это будут осознанные изменения, и совершенно очевидно что с этого момента метод и не должен быть ридонли.
Хорошо. Допустим, что я добавил optional параметр, и объекты вызывающие этот метод условно говоря ничего не заметят, и компилятор не выдаст никаких ошибок. Но какой для меня имеет смысл факт того, является ли метод ридонли или нет? Оптимизация? Ну и какая там потеря производительности? Байтоебство на пустом месте (чем рекомендуют не заниматься успешные шарп-господа).
Вообще забавно как шарп пытается усидеть на двух стульях "серьезности языка" и "юзер френдли сахарка".
>>2745914 Структуры существуют для оптимизации. Если ты вместо класса выбираешь структуру, то значит тебе важно байтоебство (иначе о чем мы сейчас говорим)
Далее этот кейворд нужен если у тебя мутабельная структура (и если она такая значит тебе так надо) . А мутабельная структура обладает таким свойством что попав в ридонли семантику компилятор не будет делать обширные изыскания (что ненадежно), а просто влепит защитную копию И получишь ты оверхед на ровном месте
Привет, программач. Начал учить C#, пока дается относительно легко, т.к. в школе задрачивали питоном для огэ/егэ. Начал читать "C# Для чайников", но столкнулся с тем, что около половины не понимаю/понимаю плохо, но да похуй, не в этом суть.
Вопрос вот в чем, шарпы используются в вебе, играх и приложениях. Душа у меня к вебу вообще не лежит, ближе к играм или приложениям(желательно играм), насколько сложно найти работу и сколько примерно займет изучение БАЗЫ для среднестатистического вкатуна?
>>2746070 >C#, пока дается относительно легко >но столкнулся с тем, что около половины не понимаю/понимаю плохо Ты противоречия в своих словах не видишь?
>сколько примерно займет изучение БАЗЫ для среднестатистического вкатуна От полугода. С учетом вышеозвученного я бы сказал год-два. А на поиск
>насколько сложно найти работу Еще полгода-год приплюсуй к сроку освоения. Хотя может банально повезти ну или ты согласишься работать совсем за еду (но и на такие места тоже очереди бывают)
>>2746084 >Ты противоречия в своих словах не видишь? да увидел, не дописал малек. с той же базой огэ/егэ все понятно, проблемы скорее с чем-то сложнее школьного курса типа ООП, функций(в питоне они как-то легче давались)
>или ты согласишься работать совсем за еду если будет возможность не ездить куда-то то вполне готов и так работать, стаж лишним не будет, чтобы потом устроиться на место получше
>>2745529 На джаве порой такой легаси кал из солянки разных либ, что даже если будут платить в два раза больше, ты убежишь. Я серьезно, повезет даже если на какой-то древний спринг попадешь.
>>2746086 >проблемы скорее с чем-то сложнее школьного курса типа ООП, функций(в питоне они как-то легче давались) Ну так это база и есть, а то что знаешь ты, так - букварик.
>если будет возможность не ездить куда-то то вполне готов Залететь на первую работу сразу на удаленку, шаеес где-то 1 к 20. Даже за еду.
>>2746490 Глянул вакансии там написано алгоритмическая подготовка и структуры данных, не все же учить, это довольно обширная тема, что чаще всего используется в разработке из этих тем?
>>2746434 Понял, тогда постараюсь с этим буквариком дотянуть до ооп. "За еду" в понятии наносеков это сколько? Я типа не привередливый особо тыщ 20-40 вполне хватит на первое время.
>>2746521 >Сортировка, поиск, списки, множества, хеш-таблицы, деревья. Разве это не реализовано в библиотеках, а за попытки костылять вручную не выгоняют с работы ссаными тряпками?
>>2746824 >Разве это не реализовано в библиотеках В библиотеках даны обобщенные решения, которые для некоторых частных случаев могут уступать в эффективности в разы.
Теоретически возможно проверить сигнатуру вызываемого метода в рантайме и если он асинхронный пустой, то его реализацию можно подменить. Для этого берут библиотечку, которая умеет генерить ил программно и реализацию проблемного метода окружают трай кечем.
Получается что-то вроде этого:
>private static MethodInfo WrapMethodWithTryCatch(MethodInfo method) >{ > // Получаем метод тела оригинального метода > MethodBody methodBody = method.GetMethodBody(); > > // Получаем IL-код оригинального метода в виде массива байтов > byte[] ilCode = methodBody.GetILAsByteArray(); > > // Создаем динамический метод, который будет содержать обертку try-catch > DynamicMethod dynamicMethod = new DynamicMethod( > method.Name + "_Wrapped", > typeof(void), > Type.EmptyTypes, > typeof(Program).Module); > > ILGenerator il = dynamicMethod.GetILGenerator(); > > // Вставляем начало блока try > il.BeginExceptionBlock(); > > // Вставляем IL-код оригинального метода в динамический метод > for (int i = 0; i < ilCode.Length; i++) > { > il.Emit(ilCode); > } > > // Вставляем конец блока try > il.BeginFinallyBlock(); > il.EndExceptionBlock(); > > // Вставляем return > il.Emit(OpCodes.Ret); > > // Создаем делегат для динамического метода > MethodInfo wrappedMethod = dynamicMethod.CreateDelegate(typeof(Action)) as MethodInfo; > > return wrappedMethod; >}
На деле все немножко сложнее. Я видел доклад где демонстрировался рабочий код.
В любом случае пидарасу который допустил существование async void в безопасном шарпе уготован особый котел.
>>2747811 Сссссука как же заебал этот internal. Что за ублюдок рпидумл ставить его автмотом для библиотеки классов? Разве это не подразумевает, что я 999999% случаев буду использовать снаружи проекта?
>>2747623 Но как так? Ведь его выпустили в 2007, когда железо было на несколько порядков слабее. И учитывая его популярность работал он нормально. А тут 2023 на дворе, мощные процессоры, мощные видеокарты, а он лагает как сука, не может простейшую анимацию с translate x плавно вывести, каждую секунду какие-то подергивания.
>>2748352 Ах, я даже пытался делать анимацию через собственный контрол, вызывая метод onrender с помощью таймера 60 раз в секунду и рисуя картинку в нем. Но даже так меня ждали все те же микролаги.
Возникла острая необходимость генерировать типы в рантайме.
Загуглил, базово сделал.
Теперь - возникла необходимость генерировать у этих типов женерик методы.
Гуглил-гуглил, не нашел как делать, чтобы оно интерфейсу удовлетворяло.
Собственно, в чем проблема то. Есть интерфейс, есть класс, который ему удовлетворяет, но не имплементирует. Шарп в утиную типизацию - не может из коробки. dynamic использовать - не хочется. Делал велосипед. Споткнулся о женерики.
Я не хочу все эти вот GetMethod("Zalupa") и прочее делать. О dll я знаю только место где она лежит, при этом загружать ее в проект и связывать - не хочу, суть как раз в том, чтобы можно было добавлять новые ДЛЛ и динамически подгружать из них нужные штуки. В сборке так же - нету какого-то общего интерфейса. Ну, вот так вот, в этом тоже задумка.
Теперь. Чего хочу. Хочу чтобы можно было:
var zalupaType = externalAssembly.GetType("ZalupaType"); object instance = Activator.CreateInstance(zalupaType);
IZalupa zalupa = Utils.ToProxy(instance, typeof(IZalupa)) as IZalupa;
Это я сделал.
Но ВНЕЗАПНО, я обнаружил, что в шарпе есть женерики. И интерфейсы могут объявлять женериковые методы. А как мне женерики делать со всей это илогенерацией - я не знаю(((
>>2748444 А чем оно будет принципиально отличаться?
У меня есть интерфейсы: public interface I1{ public T Foo<T>(); }
public interface I2{ public IEnumberble<T> Bar<T>(); }
Есть классы:
public class A{
public T Foo<T>(){} public IEnumberble<T> Bar<T>(){}
}
public class B{
public T Foo<T>(){} public IEnumberble<T> Bar<T>(){}
}
Я хочу в своем коде иметь возможность сделать:
var a = new A(); var b = new B();
var list = new List<I2> { (Utils.ToProxy(a, typeof(I2)) as I2), (Utils.ToProxy(b, typeof(I2)) as I2) };
Тут же никакой принципиальной разнцы не возникает.
Сама проблема - из-за того что A и B - из внешних сборок, а какого-то общего интерфейса у них нет, но я заведомо знаю, что они-то под него подходят. Хочу, соответственно - работать с ними через этот общий интерфейс.
Ну да ладно. Видимо придется дальше курить че там с TypeBuilder'ом еще сделать можно, чтобы оно работать нормально стало.
Анончики, а как быстро в этом вашем шарпе тесты работают? Помню где-то полгода-год назад анон в мвп-треде показывал скринкаст как он запускает тесты и они буквально за пару секунд прокатываются... это +/- всегда так? А то у меня в питухоне две сотни тестов минуту-две крутятся (веб дрисня, тесты по типу "дёрни эндпоинт и сравни тело ответа с тем что должно быть", но есть десяток-другой более тяжёлых которые тестовую бд грузят), вот и стало интересно...
>>2748516 Тебе один из методов расширения объект вернул. Об этом явно его сигнатура говорит. Неявное это когда у тебя что-то боксится и ты про это не узнаешь, если ил не посмотришь.
>>2748521 Какой он объект вернул? ни var, ни new ... не сообщают об этом. Кроме того, в документации буквально написано impicitly create (пикрил). Обычно при создании экземпляра явно указывают либо слева либо справа тип объекта. А то что ты пишешь — это уже моча уровня джава скрипта (наведи мышкой на перменную и прочитай тип), даже в бейсике такое зашквар.
>>2748541 >Чел. Когда ты используешь методы класса, ты так же кричишь про неявное? Естественно! var имеет смысл только в одном случае — когда тебе приходится дважды писать тип класса при создании экземпляра. Поэтому ты либо пишешь var слева и тип класса справа, либо тип класса слева и просто new справа.
Какие же говноеды ИТТ, пиздец просто.
>>2748535 >Обычный сахарок. Не нравится вар Я-то поставлю, а вот другие — нет. Официально приравниваю сишарп к уровню джва скрипта (там тоже хош явно инициализируешь, хош неявно. Хош ставишь ; а хош не ставишь. Хош объявляешь переменную, хош не объявляешь).
>>2748541 Ну на первой пикче стринг визуально очевиден, на примере выше Url неочевиден (если ты не держишь в голове существование расширения). Для возврата длины предпочтительно указывать тип (особенно если учесть, что int и var имеют одинаковое количество символов). А вот на второй пикче я бы даже настоятельно рекомендовал, ибо слишком длинная простыня с НЕОЖИДАННЫМ финалом.
>>2748544 На его скриншоте только сетапящие методы вызываются. Там еще не может быть результата. Это очевидно любому кто хоть раз с флюент шаблоном дело имел.
>>2748543 > var имеет смысл только в одном случае — когда тебе приходится дважды писать тип класса при создании экземпляра Да. Мне так хочется писать: AbstractFactoryProvider<ServerBase<DefaultTcpListner, DefaultTracer, DefaultDebuger, MySecretProtocolContextFactory,MySecretProtocolMapper,MyApplicationHandler, MyMessageDispatcher, DefaultConnectionManager>> factory = GetDefauiltServerFactoryProvider<ServerBase<DefaultTcpListner, DefaultTracer, DefaultDebuger, MySecretProtocolContextFactory,MySecretProtocolMapper,MyApplicationHandler, MyMessageDispatcher, DefaultConnectionManager>>();
А то без этого - я же не пойму, что там блядь такое же было. Этот же код не я писал. А кто-то другой.
>>2748544 var - работает явно: что справа - то будет слева. Ты в любом случае же чтобы этот метод расширения использовать - добавил юзинг необходимый, значит знал что делал. У меня вот на работе есть код:
public static UdpClient CreateUdpClient(this string host) Ничего, ни у кого на ревью не возникало вопросов, что да после :
"proto://host:123".CreateUdpClient()
произойдет.
>>2748551 Финал - ожидаем. Явно указывать тип - следует только в случае, если он отличается от того что возвращает правая часть. Т.е. если бы мне надо было ICollection<IEnumerable<string>> - да, в остальных случаях - это просто мусор визуальный.
>>2748558 >"proto://host:123".CreateUdpClient() Что здесь не так? Тут все очевидно.
>Ничего, ни у кого на ревью не возникало вопросов А какие могут быть вопросы к расширению для стринга, блеаять? Вот если бы CreateUdpClient() мог бы возвратить один из 100500 вариаций ZalupaClient, а код выглядел бы так var client = "proto://host:123".CreateUdpClient(); То тебе бы обязательно перезвонили.
>А то без этого - я же не пойму, что там блядь такое же было. Да это какое-то петросянство, которое не удобоваримо по своей структуре. Тут уже вопрос в другом.
>добавил юзинг необходимый, значит знал что делал. Я-то может и знал, а другие вряд ли.
>>2748622 >CreateUdpClient() мог бы возвратить один из 100500 вариаций ZalupaClient И тут ты такой рассказываешь нам, каким же образом, в шарпе, один и тот же метод может возвращать разные типы.
>>2749862 > Но твое решение максимум неоптимизированное. В чем неоптимизированность? > Хуйню какую-то городишь, но ничем не могу помочь — не понимаю в чем проблема. У меня картинки нормально скроллятся. Пиздишь же. Размести картинку, добавь translate x анимацию и наслаждайся микро лагами.
public IEnumerable<IMyInterface> Foo(IEnumerable<MyEntity> i) => from it in i select ...
Собственно вот и проблема. Я хочу чтобы то что выбралось селектом - удовлетворяло интерфейсу. Заводить отдельный класс/рекорд имплементирующий инерфейс - не хочу.
>>2750119 Я видимо криво выразился. В IEnumerable<MyEntity> - нет объектов, которые бы имплементировали интерфейс. Но я хочу передать то что из линку получилось дальше, при этом не создавая под это дело класс/рекорд. Cast - кинет исключение. А надо чтобы анонимному типу - навесился интерфейс.
Сука, имаджинируйте моё ебало, когда я узнал, что в wpf невозможно (вообще никак) сделать пикрил. Просто нет поддержки PathGradientBrush. Самое смешное, что в WinForms такая поддержка есть! Вообще, чем больше изучаю WPF, тем больше охуеваю с кучи ограничений, которых были лишены формы, появившиеся на несколько лет раньше. Ощущение, словно майки вложили в формы всю душу, а впф так, на отъебись склепали.
>>2751039 >Сука, имаджинируйте моё ебало, когда я узнал, что в wpf невозможно (вообще никак) сделать пикрил.
Можно, плохо исследовал тему. В впф есть кривые безье (Windows.Media?), дуги вот это все со свойствами, которые на 90% описывают свойства кривой в векторном редакторе типа CorelDraw, Illustrator.
И по-моему там есть даже сектор — типа дуга от круга, где начало и конец определяются углом. Выставляешь нужную толщину контура. Далее тебе надо выставить Ens Cap и Start Cap на Round — чтобы получить те самые закругления на концах. Тени делаются при помощи эффектов (тоже из коробки), они динамические.
Все что тебе остается, это конвертировать процентаж в углы.
>>2751106 Анон прав. Это графические элементы Windows.Media. А Path вообще уберштука.
>>2751114 Какой градиент? Я его не вижу. Вижу только тень. Но если тебе нужно как пикрил >>2751407 (говеный если что), то есть для этого радиальный градиент и его можно заюзать как опасити маску.
А можно сделать что-то вроде динамических enum? Проще показать проблему. Вот смотрите пикрил, есть таблица — это список голосов говорилки яндекса.
Каждый заголовок столбца — отдельное свойство моего класса. Посмотрите на столбец "Амплуа", это манера речи и у каждого голоса их может быть несколько. К примеру у голоса "jane" их три.
Так вот, как сделать так, чтобы когда я обращался к свойству Amplua, мне IntelliSence выдавал подсказку с доступными вариантами по аналогии с enum? Я же не могу под каждый голос пилить отдельный enum? А просто массив неинформативен и потребует дополнительных действий, чтобы понять, что в нем находится и сколько. Dynamic срабатывает только во время выполнения — тоже не подходит. Tuple не подходит т.к. количество элементов у каждого экземпляра разное.
>>2753097 > И по-моему там есть даже сектор — типа дуга от круга, где начало и конец определяются углом. Выставляешь нужную толщину контура. Далее тебе надо выставить Ens Cap и Start Cap на Round — чтобы получить те самые закругления на концах. Тени делаются при помощи эффектов (тоже из коробки), они динамические. Я все это знаю, и дугу нарисовать могу без проблем. А вот раскрасить ее нужным градиентом нельзя, увы. > Какой градиент? Я его не вижу. Ты слепой? У дуги начальный цвет фиолетовый, а конечный синий. > для этого радиальный градиент Это совсем другое. Вот 2 пика, на первом радиальный, на втором нужный мне градиент из skia sharp circular
>>2753514 >Ты слепой? У дуги начальный цвет фиолетовый, а конечный синий. И? В чем проблема? На самом деле я юзал что-то вроде вроде цветового мэша (не помню точно как называется), но колорпикер выполнет полностью стандартными средствами
>>2753117 >Так вот, как сделать так, чтобы когда я обращался к свойству Amplua, мне IntelliSence выдавал подсказку с доступными вариантами по аналогии с enum? Такие вещи не хардкодят. Ты там собираешься отдельную ветку кода для каждой локали городить что-ли? Это хуевый подход.
>>2753629 В смысле хардкодинг? Если взять выше прикрепленную таблицу за основу, то у меня есть набор пикрилейтед №1. Основной класс Voice, он представляет строку в таблице, и есть энумы типа пола, амплуа. Единственное нет кода языка — у яндекса он пишется через дефис, а это гемор через конвертеры, чтобы сериализовать в json. Хочу чтобы я пришел через миллион лет и не сидел перебирал возможные варианты и гуглил доки.
Все это собирается в статический класс, в котором есть словарь голосов типа Voice, плюс каждый голос выведен в свойство, которое берет параметр из словаря.
А как еще? Всё в стрингах держать? Пока что свою проблему решил через xml документацию к каждому голосу (пикрил 2), чтобы примерно представлять что где лежит, но решение так себе.
Антоны, помогите вкатуну. Стараюсь написать консольное приложение - простенький конвертер валют в котором нет динамического выбора валюты, а курс валюты строго задан заранее.
По моей задумке первое сообщение просит ввести интересуемую сумму долларов США, покупаемых за рубли. Затем эта сумма должна быть помножена на переменную с заранее заданным значением (курс валюты) и показать получившееся значение.
Затем выводится новое сообщение и проводится еще одна процедура, но уже для продажи долларов за рубли. И так далее для других валют.
Как бы вы написали такое? И еще вопрос, почему оператор * не применим к типу double?
Но в итоге я принял другое решение. Я просто взял растровый фон, кек. А чтобы это не выглядело всрато при разных масштабах, маски прозрачности у меня были параметрическими (как раз и того примера). Я проверял скейл подобной констуркции, и в целом размытый градиент никак не палится — выглядит так, как будто градиент параметрический.
Да и в целом в фотошопе сделано ровно тоже самое. Причина проста — производительность. Эти градиенты очень прожорливы. Тоже самое и гарадинет Saturation и Lightness созданы при момощи трех слоев - базовый цвет + растровый градиент насыщенности + растровый градиент яркости повернутый на 90 градусов.
>>2753843 Берешь Console.ReadLine(), то что он вернет парсишь Double.Parse(), это значение умножаешь или делишь на что ты там хочешь. Не забывай, что пользовательский ввод может быть хуевым.
>>2753670 >В смысле хардкодинг? Вот то что у тебя на 2-м пикет самый натуральный хардкодинг и есть. Ты даные не только в код пихаешь, но и еще и по комментам размазал. Пиздец. Все что на пике должно где-нибудь в БД лежать, на крайний случай в конфигурации. А в самом коде тебе дожно быть до пизды какое амплуа, в каком голосе лежит. Ты с абстракцией должен работать.
>>2753964 Ты дурачок бля, я говорил что я программист? Я сказал, что я вкатун. Начал вкатываться через шарп буквально пару - тройку дней назад. Успокойся пжлст.
>>2753975 Запихнул в джейсон файл и десериализую в класс Voice. Файл копирую при сборке как внедренный ресурс в условную папку Data. Дальше юзер библиотеки сам хочет вручную созадет экземпляр Voice, хочет десериализует файл.
Как-то так. И самое главное, вопрос о выборе итемов отпал сам собой, если эти данные привязать к UI.
https://youtu.be/1hmUZx8DIWo Хачатуру платить 500р влом. Я видел в яндекс клауд SpeechKit Brand Voice возможность создавать собственные голоса, но там похоже речь идет о небольших фразах или вставках в уже готовые сегменты аудио.
>>2754241 Практика показала, что фейковые градиенты наиболее эффективны. Только контуры делают векторными, чтобы не было "мыла".
Я тебе больше скажу, что в фотошопе еще и кружочек цветопробы фейковый. Во время его перетаскивания, на самом деле он прячется и иконка курсора меняется на имитацию этого кружочка.
Добиться подобной скорости при честной отрисовке градиента не представляется возможным на впф или формсах. К примеру видеорил 1 - это как реализовано в программе Corel Draw, где честный прямоугольничек поверх градиента следует за курсором. Безусловно там стоит таймер, но чисто ради стабилизации фпс (я пошел сперва по этому пути и скажу, что без ограничения, фпс получестя нестабильным). На втором видео то, как реализовано в Photoshop - в данном случае при зажатии ЛКМ иконка курсора меняется на кружочек и никаких тормозов при перерисовке нет.
Интересно почему перерисовка курсора не заставляет перерисовываться UI-элемент целиком?
Само градиентное поле выбора тоже фейковое и состоит из послойно накладывающихся друг на дурга градиентов. Одна из причин, почему рядом всегда есть окно, отображающее истинный цвет.
>>2754242 Canvas у которого BackgroundBrush это хитрый VisualBrush, у которого внутри Rectangle с LinearGradientBrush + OpacityMask. У Canvas один чайлд - кружочек, который по MouseMove по этому канвасу двигается. Вроде нет никаких проблем с фепесами.
>>2754310 > Canvas один чайлд - кружочек, который по MouseMove по этому канвасу двигается. Вроде нет никаких проблем с фепесами. Можно наследоваться от canvas, переопределить onrender и рисовать кружочек в drawingcontext, так должно быть еще эффективнее.
Отрыл HH с вакансиями. Какое же говно, ничего нет, все хотят милд+/синиор за 150к, ИП Хуйсосян Маможонович со своими интерсными проектами в области прожарки люля. Зачем я начал вкатываться в это говно, работу никогда не найти. Надо было питон учить и на собесах двигать тазом.
>>2754310 Возможно, но ты еще не добавил кучу говна, типа окна расширенной цветопробы, и списка цветовых каналов в разных цветовых схемах RGB, HSB, HSL, HEX, обновляющихся параллельно с передвижением курсора.
Так же непонятны размеры градиентной области, где происходит перерисовка. Чем она больше, тем выше затраты.
И почему ты решил шатать OpacityMask вместо трансформаций обычного ректенгла? Выглядит так сложно, как будто это хитрый план.
Алсо, просто интересно, ты решил проблему со скругленными углами твоего градиента? Я тоже пытался так делать, но было либо сложно, либо нелогично выставить ноль\максимум в этих самых углах. Я от радиусов отказался в итоге.
>>2754426 Так учи питон в чем проблема? Перекат из языка в язык дело месяца-двух. Хоть и сложно даунгрейдиться до питона, но раз бабло нужно то в путь, а вообще за баблом иди в 1С, там его тонна и тележка.
>>2754452 в смысле проебал? если ты чисто за баблом идешь, то зачем тебе что-то кроме 1С ?
ИТ это вечное обучение и для людей которым это нравится, за исключением какой-нибудь легаси поддержки в швейцарском банке где ты еще перфокарты ворочить будешь (не шутка)
>>2754463 >если ты чисто за баблом идешь А зачем ещё нужна работа бля? Если бы я был миллиардером я бы плавал в батискафе смотреть на Титаник. >1С Я ебаль закон в рот это говно. Сейчас работаю админом, не хочу в этом копаться. >вечное обучение Невозможно бесконечно обучаться. Во-вторых, что значит обучаться? Сидеть по 10 часов в день? Я тебя умоляю никто этим не занимается, иногда пощупаешь новую приблуду, почитаешь доки мельком, если есть конкретные задачи можно почитать плотнее. Это несоизмеримо проще чем вкатываться с нуля. Кто в разработке работают, тоже самое говорят, ну пощупаешь фреймворк новый, где-то подчитаешь что-то.
>>2754461 Очередное выстраивание иллюзий по неизведанному. Ты думаешь, что отпилишь себе ногу сам, но на самом деле отпилят тебе жопу .
В средние века, когда еще не все территории были изведаны человечеством, существовала такая карта как "маппа мунди", суть которой в том, что на неизвестных территориях обязательно жило какое-то необычное существо, вроде моноподов — людей с одной ногой при рождении. Никто не знал, что там на самом деле, но разве это мешало предполагать и фантазировать? Не исключались локальные конфликты на тему "а вот у нас тут нихуя нет, а вот у моноподов есть всё!".
Только "разведка территории" поставит твои мозги на место. Изучай питон и возвращайся.
Правильно ли я понимаю, что если объект А имеет ссылку на объект Б, который имеет ссылку на "постоянный" (например это свойство главного класса) объект В, то после того, как все ссылки на А и Б будут удалены, они будут собраны ГК?
>>2754524 ну тут такое дело уже сидящие на шарпе они нашли где им его применять и денежку загребать И в общем то они не в курсе ситуации с поиском заработков.
лично я зарабатываю на шарпе, но знаю и активно использую питон также.
Во-первых у окна есть своства специально для этого WindowStyle - поперебирай опции. Без хидера это 'none'.
Если надо что-то фигурное, типа скругленных углов, то юзай еще AllowTransperency — опция убирает черный бэкграунд, делая основу окна прозрачной. Но у этого подхода есть минусы — пользователь не сможет менять размеры окна, там надо небольшой изворот делать.
Во-вторых шатай Style для определения визуального стиля UI-элемента. Если захочешь сделать свой кастомный хидер с функцией перемещения окна и т.д., то ради бога не используй таймеры и прочее говно. Используй Behaviors.
>>2754675 бестолочь, и что этот вызов должен был сказать? может ты просто дурачок (а на это вполне похоже ибо строишь из себя и считаешь что все вокруг должны быть телепатами которые разбираются в твоем безумии), что не знает как делать штатно, и поэтому делаешь через винапи
>>2754650 > Если захочешь сделать свой кастомный хидер с функцией перемещения окна и т.д., то ради бога не используй таймеры и прочее говно. Используй Behaviors. Есть же windowschrome. Можно указать любой размер хидера, он будет прозрачным и за ним можно любой контент располагать.
Раз уж тут такие переисполнение по впф челы сидят, хочу спросить.
Если ли способ способ закрыть/выгрузить/задиспозить впфшный Page. Пусть даже способ хаковый. Условие - я не владею впфшным Window, которое этот Page хостит. Ни ссылки, ни малейшего намека, где это виндоу находится нет.
>>2755258 Что-то типа FindWindow и перебрать конпки, кока не найдется крестик? Это совсем не то.
Я так-то в домене этой приложухи нахожусь. Апишки дергаю. Приложуха сама умеет решать, когда нужно выгружать мое Page, и когда просить новое, чтобы показать пользователю. Однако делает она это плохо и все идет по пизде. Все что мне нужно, выгрузить Page самостоятельно, заранее. Но вот беда на нем нет ни Dispose, ни Close, ни Unload. Нихуя.
Вот я и подумал, может есть впфшный хак, как объект Page саботировать. Там же целая история с наследованием в рамках фреймворка.
>>2755287 Есть интерфейсный метод, который возвращает FrameworkElement кажется. Во всех гайдах это либо Page, либо UserControl. Я пробовал туда Window отправить, но получаю исключение. Что-то вроде "виндоу не может находится в иерархии так низко". Ну понятно, что там свое окно, которое хостит всякие FrameworkElement'ы типа Page. Вот только к этому объекту окна, чтобы вызвать на нем Close, не подобраться методом апишки приложухи, которая использует этот впфшный механизм.
Может есть хитрый вариант что-то к чему-то привести в рамках типов впф и дернуть на этом какую-нибудь херню, чтобы все посыпалось нахуй?
>>2755309 >Я пробовал туда Window отправить, но получаю исключение. >Ну понятно, что там свое окно, которое хостит всякие FrameworkElement'ы типа Page. Естественно, Window не является UI-элементом. Кстати Page тоже своего рода исключение из поведения других контролов, это бяка характерна тем, что изолирует контент внутри себя. Нужно очень постараться, чтобы найти применение ему — например, если у тебя какой нибудь браузер. В любых других ситуациях нужно наследовать другой контрол.
>Есть интерфейсный метод, который возвращает FrameworkElement кажется. Я не совсем понимаю. Метод возвращает FrameworkElement тебе или домену? Ты можешь свой контрол сделать Disposable и при unloaded событии твой контрол задиспозится автоматом. Что происходит со предыдущим элементом если запихнуть туда новый?
>Все что мне нужно, выгрузить Page самостоятельно, заранее. Но вот беда на нем нет ни Dispose, ни Close, ни Unload. Нихуя. Во-первых, ты должен сам реализовать интерфейс IDisposble с методом Dispose, где ты выгружаешь всю потенциальную бяку, мешающую CG добить твой контрол. При событии Uloaded будет автоматически вызван Dispose (должен).
>>2755269 >При событии Uloaded будет автоматически вызван Dispose (должен). Точнее ты подписываешься на событие Page.Unloaded и оттуда вызываешь метод Dispose.
Какие элементы мешаю помереть Page? Что именно как ты пишешь >Однако делает она это плохо и все идет по пизде. ?
>>2740238 (OP) Почему локализация в WPF'е это такой пиздец? Неужели нету лучшего способа чем выносить абсолютно все строки с UI в код бихайнд и биндить их?
>>2755820 И нихуя не работает - в рантайме после запуска окна не переключишся как с обычными строками, нужно задавать культуру перед инициализацией компонентов и срать пользователю окошко о том что ему нужно перезапустить приложение.
>>2755916 активно использую винапи в WPF но когда в тред приходит чудо которое вываливает "догадайтесь че у меня" и еще ведет себя как быдло, то правильно послать его
>>2755797 Локализацию лучше вообще хранить в xml или json, а потом десериализовывать в словарь ресурсов.
>>2755820 А почему статик, а не динамик? Динамик позволяет обновлять изменения. Статик хоть и мене рексурсозатратен, но по факту экономия не такая уж и большая, а иногда ее вовсе нет. Статик юзают только в тех случаях, где не работает динамик.
>>2755922 Как в случае с темой UI, у тебя должен быть метод, который меняет словари ресурсов в приложении.
Общий порядок таков: 1. У тебя должен быть отдельный словарь базовых цветов (таких словарей может быть множество: отдельный словарь цветов для темной темы, отдельный для светлой и т.д.) 2. Отдельный словарь надписей (предпочтительнее xml или json сконвертированный в ресурс). Тут как и с первым вариантом, у тебя есть набор файликов с Ru, En и прочими локализациями. 3. Дальше идут стили для всех контролов, которые биндят эти цвета и надписи как динамический ресурс. Динамические ресурсы позволяют не мерджить напрямую файлики из пункта 1 и 2, это будет сделано в рантайме.
Всем этим управляет условный менеджер темы, который комбинирует словари ресурсов из пунктов 1, 2 и 3 на основании выбранной темы и локализации. Даже если юзер в рантайме меняет тему или язык, менеджер темы просто очищает словарь ресурсов основного приложения и добавляет новую комбинацию из пунктов 1, 2 и 3.
Посмотри курс Advanced Reusable Styles and Themes in WPF от Pluralsight.
А еще к словарю ресурсов так же можно привязать код бихайнд, чтобы можно было выполнять какую либо логику в стилях. По сути это выглядит как UserControl из .xaml части и .cs части.
Похоже, что мои ожидания по поводу помощника в студии были преувеличены.
Во-первых он не отличается стабильностью. Бывает, что показывает правильно, но второй раз просто отказывается показать тоже самое, если ты удалишь букву и снова ее вставишь.
Во-вторых поражает, что студия пишет "хуйня нейм никогда не используется" к свойству/событию, которое блять ТРЕБУЕТ ИНТЕРФЕЙС.
>Page изолирует контент внутри себя Вот оно как. Скорее всего потому разрабы приложухи, которой я пытаюсь управлять, этот механизм и выбрали. Чтобы изолироваться от пользовательского, то бишь моего кода.
>Я не совсем понимаю. Метод возвращает FrameworkElement тебе или домену? Я регистрирую свой объект, на котором реализован интерфейсный метод. Приложуха сама вызывает этот метод и получает объект Page, на котором живет контрол webview. Вот это вебвью корень всех зол. Капризная хуйня, которая не терпит одновременного существования других оболочек над хромом. Это причина по которой я ищу варианты приканчивать свой Page. Разумеется можно вызвать Dispose на webview, однако это нерабочий вариант, потому что с точки зрения приложухи Page продолжает оставаться валидным объектом, а реинициализировать вебвью на том же Page, к сожалению, невозможно. Поэтому нужно похерить не только контрол, но и хост этого контрола. Чтобы приложуха запросила у меня новый Page.
>>2756621 А что будет, если ты изменишь содержимое экземпляра Page, который ты отправил в приложуху? Будут ли фиксироваться изменения в этом приложении?
>>2756665 В этом Page кода кот наплакал. В разметке единственный контрол, webview, в гриде растянутый на все окно. В cs код правильной инициализации этого контрола. Вот и все. Я не большой знаток wpf, на мой взгляд страничка ведет себя вполне типично. Окно, которое ее хостит, себя никак не проявляет.
При некоторых внутренних сценариях приложуха убивает эту страничку и просит у меня новую. То что старая помирает, я понимаю потому что подписан на Unload, в котором диспозится webview. Однако как этот Unload вызвать самостоятельно я без понятия.
Анончик, смотри. Есть условие: надо получить информацию о количестве активных телефонных разговоров в час-минуту за сутки.
Собственно, структура того что в базе:
public class Call{ public int Phone1Id { get; set; } public int Phone2Id { get; set; } public DateTime StartedAt { get; set; } public DateTime? CompletedAt { get; set; } }
>>2756689 Если ты у себя в экземпляре Page очистишь содержимое Content, то в хосте это тоже очистится?
Page это же просто контейнер, который в идеале должен существовать на протяжении всей сессии. Я нихера не понимаю. Зачем ты шатаешь webview, если надо очищать Page, который запустит Unloaded webview?
Не понимаю что вы нашли в этом кале (C#). В PHP всё гораздо проще и удобней, сделано для людей, а не для роботов каких-то. Плюс есть конкуренция и разнообразие: лара, симф, юи и еще куча других годных.
У вас же тут ниче крутого в принципе не существует. Куча фич, но кто-то вообще их использует? Еще расскажите как вы коллекции кортежей юзаете или что-то подобное, это просто курам на смех.
У меня, в детстве, хуй пойми откуда была здоровая такая книга что-то про .NET3.5 В ней шел диск, на котором была ВижуалСтудио. Собственно. Вот представь, ты хуй лет 12, ты кодил на Паскале всякие задачки в школе. А тут тебе шарп в руки попадает. В котором и окошки делать сразу можно, а не непонятную консоль, и куча штук для работы со списками-колекциями, и, блядь, СТРОКИ удобные, а не как в ебучем Си, где ты ебись с этими строками сколько хочешь, все равно выебут тебя.
Ну так вот. Беру я, и начинаю всякую билеберду делать: решалка уравнений, чтобы просто вбить уравнение из задачника и решить, принести марьванне; и всякие игрульки текстовые(СТРОКИ НОРМАЛЬНЫЕ, БИЛЯДЬ); игрульки НА ФОРМАХ в духе мархухена или маривы; мамке бухгалтеру - программулину, чтобы заполняла как надо отчеты в экселе. А потом - иду я в вуз, а там ООП начинают объяснять, и, блядь, НА ШАРПЕ.
Собстенно. К чему я. К тому, что шарп - это первый язык, которым, блядь, УДОБНО пользоваться. Ты не ебешься с ним, а делаешь то что тебе хочется, просто, быстро, без всяких непонятных игришь с системами сборок, знаний арифметики указателей, миллионов непонятных библиотек, которые хуй пойми как подключать, окружения в десятки гигов, чтобы блядскуий хелловорлд вывести, никаких непонятных несовместимостей, когда ты копируешь код, а он, блядь, не работает, потому что хуйло решило, что теперь надо так а не так. Нет, блядь, ты просто берешь и делаешь что тебе хочется, при этом ты не ограничен был вебо-парашей, не ограничен консольками, единственное ограничение было - винда, но нахуй что-то кроме винды так-то надо?
Собственно. Вот так я и полюбил шарп. Да. Шарп это комфорт, шарп это жизнь. И даже, если сейчас, я старый хуй, который и на плюсах пару лет поработал, и в жаву наступил, и даже поддерживал код на ебучем ПХП, я все еще считаю, что шарп - это любовь, жизнь, процветание. Единственно чего бы я хотел для шарпа - это отвязку от майков, какой-нибудь Open.NET. А так - шарп - любовь. Да.
>>2756815 Всё то же что ты описал есть в PHP, кроме того что он привязан к вебу - единственный недостаток. В PHP даже ООП шире и ярче играет, чем в Шарпе или Жабе, оно тупо удобное. И объявление переменных моё любимое конечно.
Когда ты у себя в xaml пишешь что-то вроде: <Page> . . . <Grid> . . . . . . <Button/> . . . </Grid> </Page>
То по сути ты делаешь делаешь это: Grid myGrid = new(); myGrid.Children.Add(new Button())
Page myPage = new(); myPage.Content = new Grid();
Большинство контролов может хранить в себе содержимое. Свойство с содержимым именуется по разному. Если контрол способен хранить в себе только один элемент, то обычно такие свойства именуются Child или Content. К примеру: Page.Content, Button.Content. Если может хранить список, то именуется как Children. К примеру: Grid.Children, StackPanel.Children. Есть уникальные названия, например у TextBlock, у которого содержимое может быть только в формате string, поэтому оно именуется как Text.
Отсюда следует, что если мы сделаем это myPage.Content = null; то мы избавимся от myGrid и Button внутри myPage.
Еще одно замечание. Контролы не могут быть дочерними элементами сразу у двух контролов-родителей. Ты не сможешь myGrid добавить в Content еще одной Page, пока ты не извлечешь из содержимого первой Page (либо не присвоишь null). Это надо учитывать.
Вы только посмотрите на это говнище, оно просто мусорит мое окно ошибок. Что я могу поделать, если интерфейс ICommand требует реализацию CanExecuteChanged event, но мне оно не требуется?
>>2756747 >>2756928 пхп не уместно сравнивать с сисей, учишь сисю = можешь писать, что угодно с кайфом, учишь пхп = сосёшь хуй в вебе и кидаешься калом на сосаче
Есть вьюмодель, у неё есть несколько bool свойств. На вью есть несколько панелей, видимость которых должна зависеть от комбинации этих свойств. Как это сделать?
IMultiValueConverter не хотелось бы - на каждое сочетание нужен будет отдельный конвертер в другом и параметры должны идти в определенном порядке.
Я думал можно сделать что-то типа такого: <Binding Converter={BooleanToVisibilityConverter}> ____<Multibinding Converter={BooleansToBooleanAndConverter}> ________<Binding Path=Prop1/> ________<Binding Path=Prop2/> ________<Binding Path=Prop3/> ____</Multibinding> </Binding> Но так нельзя.
>>2740238 (OP) В треде есть некроёбы? У меня случилась просто неведомая ебаная хуита: Делал я когда-то один небольшой проект пару лет назад, и тут заказчик внезапно ожил и попросил допилить небольшую фичу. Открываю проект - студия говорит что 4.5 фреймворк на котором был проект уже выпилили и вот бери обновляйся. Я без задней мысли обновился на 4.8, начал пилить фичи, попутно их тестил, все было норм. Затем когда допилил, решил что стоит пройтись по всему проекту на всякий случай и тут почалось. В месте где идет обращение к XmlSerializer (System.Xml) вылетает эксепшн: Не удалось загрузить файл или сборку "Проектнейм.XmlSerializers, Version=Версияпроекта, Culture=neutral, PublicKeyToken=null" либо одну из их зависимостей. Не удается найти указанный файл. Причем в том месте я вообще никаких изменений не делал. В проекте он присутствует, вскрывал дотпиком новую и старую версию - библиотека 4.0.0.0, идентичная. Далее еще интереснее - у меня есть этот же проект, с обновленным фреймворком, но без изменений и если его запустить в дебагере - он тоже выдает эту ошибку, но если запустить просто exe в папке debug - он нормально работает. Но с измененным проектом такое не работает. И если поменять название в свойствах сборки он вообще не запускается и выдает ошибку как выше только уже не пишет какую либу он не может загрузить. И дальше начинает спамить что поток не может получить доступ к объекту другого потока пока не словит стековерфлоу. Кто-нибудь встречался с подобной хуитой? Сегодня я конечно еще попробую создать совсем новый проект и руками перетащить файлы туда, и возможно потыкать разные версии фреймворка, но я не уверен что это поможет.
Идея не использовать гвозди для размещения webview на page оказалось отличной - я сделал именно как ты написал. Благодаря этому удалось закрыть часть кейсов, когда webview нужно срочно уничтожить ради работоспособности всего домена. При этом Page может продолжать работать как ни в чем не бывало. Это то, что нужно.
Однако без подводных камней не обошлось. Обнаружилось парочка проблемных сценариев. Там происходит какая-то хуйня с переключением контекста, потоками и таким прочим.
Может так случиться, что основной поток приложухи, который является так же основным для окна, в котором живет мой Page, кладет прибор на это окно из за чего оно виснет. Эта забывчивость чинится хитрым костылем. Но причина не ясна.
И вторая проблема связана с инициализацией webview. Может так случиться, что оно не инициализируется. Есть ряд действий с приложухой, которые к этому приводят. Но это довольно искусственный сценарий. Скорее всего пользовательский, относительно меня, код делать так не будет.
Как же хорош всё-таки PHP. ООП кайфовое, без лишней хуеты как тут в сисюрпе. Разнообразие фреймворков, приятный синтаксис, много работы самой разной: от AI до клепательства сайтиков. Советую всем в треде удалиться отсюда и перейти сразу в тред по PHP.
>>2757942 да ты крут. я за десятки лет не знаю нахрена нужен Page если есть юзерконтрол
>>2758166 >Как же хорош всё-таки PHP. ООП кайфовое, ты бы попробовал протрезветь. ооп у него хорошее лол. да одних __get/__set хватает чтобы охренеть так что удаляйся ты сам и вали в тред пхп че вообще пришел лол
>>2758176 смешная попытка. тут как бы и пхпшники сидят вот я пхпшник еще со времен пхп 3 (на пхп уже СЛАВА КТУЛХУ не пишу, но приходится поддерживать проекты пхп 7) так что твои потуги для меня выглядят смешно
>>2758392 это просто контрол. самый обычный контрол, с которым просто работаешь и не мудришь костыли. навигация делается элементарно и как угодно. А вот с фрейм+пейдж какая то пляска с бубном
>>2758773 >Что я нахуй буду делать с шарпами. Игры писать? То же что и с >Verilog/VHDL >Asemmbler >C >C++ >Bash >Python как работодатель скажет, на том и будешь писать, и на шарпе и на бейсике будешь, никуда не денешься, раб_отник на раб_оте.
>>2758786 Я старый 30 летний дед скуф. Мне физически уже тяжело смотреть видео со смешной подачей. Особенно, когда нихуя не смешно. Я этого говна наелся и меня от него воротит. Это ебаный кринж.
>>2758752 Тебе прямо написано что нельзя СТРОКИ умножать на ДЕЦИМАЛ, что ты вообще ожидал от этой операции? Второй случай тоже туповат, скасти одно из чисел к типу второго операнда
>>2753850 >>2753902 >>2758790 >>2758795 >>2758802 >>2758810 Всё короче, написал. Конвертер трёх знаковых валют в консоли с курсом прямиком из 2007 года (который никто никогда не вернёт)(но я хотя бы попытался). Сам, без чей либо помощи и не списывая с других. Нужно было просто как следует разобраться в типах данных, посидеть и подумать немножко.
Пиздец вы спецы. Не смогли мне, вкатуну, объяснить как написать консольную хуйню уровня первоклашек. Чего там парсить? Чего там скашивать? Всё же просто как в аптеке. Я с вас в акуе короче, двощеры блядь. Но всё равно, спасибо.
Ребята, а правда в разрабом щас хер устроишься? Я за всю свою карьеру проблем никаких не испытывал просто и диву даюсь с того, о чем тут и в ебаном пишут. Лайвкодинги какие-то, тупые вопросы, постоянное изучение технологий…
Сижу на одном и том же ЯПе, в доку по фреймворку заглядываю максимум раз в неделю.
>>2759230 подсказать не можем (ты ж не слушаешь) можем только обосрать
1 короткие имена переменных. 2 спагетти код. ненависть к словарям? 3 а что будет если вместо числа я введу "абырвалг"? 4 а что если люблю вводить 1.2, а иногда 1,2? 5 зачем мне много знаков в результате после запятой? это ж деньги не? 6 хули не децимал
>>2759241 >1 И что с того? >2 Не понял тебя. >3 Приложение крашнется >4 Приложение крашнется. Ты кстати в обменном пункте тоже покупаешь или продаёшь не 50 баксов, а 56.8? >5 После какой запятой? >6 Не знаю. Ругается чёт и выводит ошибки.
>>2759246 1 поймешь сам когда через год посмотришь на свой код. Ну или коллеги по работе (хотя о чем это я) тебе расскажут...кулаками 2 все это словоблудие можно было оформить словарем валюта-курс и в цикле красиво пройтись 3 как и твоя зарплата 4 в обменном пункте поле мне ЗАПРЕЩАЕТ ввести не то, консоль же позволяет ввести что угодно. 5 деньги это 2 знака после запятой. дальше не очень интересно. дабл же выведет тучу знаков. хот бы округлил до 3 знаков 6 ругается на то что стринг и децимпал перемножаешь? не пробовал децимал * децимал? чет с даблами и интами тебе не мешает перемножать, а с децималами какие трусы стринги у тебя
>>2759263 Бля, пчел... Ты такой важный прям пиздец. Еще раз мой пост прочитай. >>2753843 Требовалось написать простенькую, консольную хуйнюшку. >Ну или коллеги по работе (хотя о чем это я) Ты о том, что я типа работу себе не найду. Все вы айтишники токсичные, аж пиздец. >коллеги по работе тебе расскажут...кулаками Я думаю коллеги по работе не вывезут мне что-то на кулаках объяснять. >2 Ок. >3 Оййй бляяя... сукааа рукалицо. Токсик ты ёбаный. >4 Ок. >5 Не понимаю тебя, но ок. >6 Не даёт мне среда разработки создать переменную с decimal с нужным мне значением. Подчеркивает красным. Вот видишь? Всё исправил на Децл, но всё равно ошибка, а что это за суффикс "М" я хз.
>>2759284 >написать простенькую, консольную хуйнюшку. если ты не знаешь базовых типов и зачем они нужны, то ты даже не ждун >Ты о том, что я типа работу себе не найду. Все вы айтишники токсичные, аж пиздец о том что за использование децимал любой уважающий себя джун который только полчаса назад узнал что такое си шарп просто бы офигел от твоего кода >3 а ты учись сразу быть правильным программистом. иначе че сюда пришел? >Не понимаю тебя, но ок. ну будь реалистом. пусть результат будет все таки округлен. ну хотя бы до 6 го знака для особых любителей резать коейки на части. >Не даёт мне среда разработки создать переменную с decimal ну добавь ты м. жалко что ли а так среда думает что ты децималу пытаешься присвоить дабл
>>2759277 Ну я так не умею еще. И тем не менее на выходе у меня получилось симпатичнее чем у тебя :3
>>2759288 >то ты даже не ждун Естественно я не ждун. Я ничего и не жду. Я действую, бро. >о том что за использование децимал любой уважающий себя джун который только полчаса назад узнал что такое си шарп просто бы офигел от твоего кода Блядь, так и не использовал децимал. У меня изначально дабл было. >ну будь реалистом. пусть результат будет все таки округлен. ну хотя бы до 6 го знака для особых любителей резать коейки на части. Я не знаю как округлить. Да и зачем? У меня ведь всё равно получилось так, как в настоящем конверторе. >ну добавь ты м. жалко что ли а так среда думает что ты децималу пытаешься присвоить дабл Да, добавил. Теперь нет ошибки. Спасибо.
>>2759293 >Я ничего и не жду. Я действую, бро. действовать нужно в правильно направлении. иначе зачем
>Блядь, так и не использовал децимал. У меня изначально дабл было. А ЧЕ? если речь идет про денежку (которой тебе никогда не видать) то сразу нужно децимал. в общем то он для этого и придуман >Я не знаю как округлит бедный человече забаненный в гугле. Зачем? ну давайв мгазе требуй "а где тысячные в сдаче? вы тут охуели что ли" >Да, добавил. Теперь нет ошибки. Спасибо. А неважно. камень в твой огород заготовлен (иначе бы я спал) так лови.
>>2759277 1. Сокращения. Нахуй и в пизду. Пиши полностью. 2. new() - лучше только для инициализации полей класса, в остальных случаях нихуя не очевидно что там за new 3. Копипаст, который можно было заменить goto 4. Магические числа 5. var в результатах математических операций - я бы уже позвонил хрюше и стал просить нового джуна искать 6. Копипаст 7. Парсинг зависящий от культуры, вместо того чтобы сделать универсальный парсер, который от этой самой культуры не будет зависеть 8. Листы там где лучше подошел бы словарь
Но да. Ты хотя бы стараешься и как минимум автоформатирование настроил. Это плюсик и я уже тебя не ненавижу.
>>2759303 ну есть 2 случая когда готу реально рулит (я правда их не помню, но точно они есть - один из них break N а второй не помню) так что он не совсем ебаунутый
Ну, давай, няша. Показывай как ты красиво и элегантно без goto будешь делать такое.
А теперь серьезный ответ. 1. goto - нормальная практика, если он улучшает читаемость кода. Если ты умняша, который делает методы по 10к строк, то отсутстве goto не спасет тебя, а только хуже сделает. 2. В шарпе - goto - кастрирован до такой степени, что все претензии, которые к нему возникали в свое время - просто не релевантны. 3. Если уже про более лоулевел будем говорить, ну, давай, покритикуй мне jmp и покажи как ты без него что-то в принципе полезное напишешь 4. Если так уж доебываемся до goto, то давайте как у MISRA - еще и срать на continiue, break, рекурсию, динамическое выделение памяти и т.д.. Ну, хули, тоже пиздец плохие практики же. Вдруг наш код шарповский в какой-нибудь автомобиль засунут, а там рекурсия, памяти контроллеру не хватит и все, пиздец, убили человека.
Короче. Если goto делает код лучше - использовать я разрешаю.
>>2759303 Как майков можно серьезно воспринимать после такого? Срочно отказываемся от использвования стандартной библиотеки дотнета и переписываем без goto
>>2759330 >удалить >запритить Всегда знал и говорил, что Майкрософт - оплот свободы в этом мире рабства. Лишний повод пользоваться только их продуктами, хотя оно и так очевидно, альтернативы лютое говно: винда, офис, студия, что ни возьми, одни блистательные вины от подобий которых от других только блевать тянет от убожества, хуже китайских подделок.
>>2759572 А хули не опенсорсить, если одна половина мира сотрудники микрософт, а другая его клиенты. Тупо упрощение и удешевление процесса разработки. Они где-то там внизу конкурируют между собой, непрерывно перетекая из одной группы в другую...
>да ты крут. я за десятки лет не знаю нахрена нужен Page если есть юзерконтрол Лично я столкнулся с отличиями когда пытался забиндить какой-то экземпляр к свойству собственного класса на базе Page. Чтобы я не делал, но элемент внутри тупо отсутствовал. И добродушный анон подсказал в чем особенность. Вот, передал так сказать знания по наследству.
>>2758392 >В чем профит UserControl'а по сравнению с Page? Скорее наоборот. Юзер контрол это просто минимальная(почти) основа для твоего контрола. Ничего не мешает делать свой контрол на основе Grid, к примеру.
Особенность Page в изолированности содержимого, часто это используют для безопасности в браущерах, чтобы случайно какое-то говно не пролезло наружу или внутрь.
>>2756987 > Что я могу поделать, если интерфейс ICommand требует реализацию CanExecuteChanged event, но мне оно не требуется? Использовать готовые mvvm либы, а не писать велосипеды
Такая проблема. Допустим есть два разных класса из двух разных библиотек, написанных в разное время. У них есть по интерфейсу, где есть пересекающееся по сути свойство, но по разному названное. К примеру
public interface IHuinya { . . . int HuinyaCount }
public interface IDrugayaHuinya { . . . int DrugayaHuinyaCount }
И теперь, в моем классе есть свойство, которое им необходимо public class MyClass { . . . int Count } но не может удовлетворить из-за конфликта имени, даже если я переименую в пользу одного из интерфейсов. В бейсике я мог указать явно реализацию, что-то вроде int Count : IDrugayaHuinya.DrugayaHuinyaCount, IHuinya.HuinyaCount И тогда не важно какое имя в классе. А как быть с этим в шарпе?
Ни разу не юзал прикрепляемые свойства и тут возник ступор.
Пикрил 1 - это прикрепляемое свойство, которое хочет получить объект типа ListView. Есть регистрация свойства и есть подписка на событие изменения свойства.
Пикрил 2 - я пытаюсь в экземпляре ListView привязать самого себя к данному свойству.
После того, как из пикрила 1 отрабатывает метод OnTargetChanged( . . . DependencyObject d, . . . . . . DependencyPropertyChangedEventArgs e)
по аналогии с обычным DependencyProperty, я ожидаю что в параметре d я увижу экземпляр класса, в котором находится прикрепляемое свойство, а в параметре e.NewValue - экземпляр ListView.
Но на деле я получаю ответ: * OnTargetChanged. d: ListView, NewValue: ListView
По какой-то причине DependencyObject здесь тоже ListView. В принципе причина логична, но вообще возможно ли получить экземпляр класса, в котором прикрепяемое свойство находилось изначально? Зачем я вообще при регистарции указывал другой класс?
>>2760934 > по аналогии с обычным DependencyProperty, я ожидаю что в параметре d я увижу экземпляр класса, в котором находится прикрепляемое свойство, Ну тут вопрос в том, почему ты это ожидаешь. Прикрепленное свойство, ровно как и обычное, возвращает экземпляр объекта, у которого оно было изменено. > но вообще возможно ли получить экземпляр класса, в котором прикрепяемое свойство находилось изначально? Насколько я знаю нет.
> Зачем я вообще при регистарции указывал другой класс? Чтобы среда знала, где искать геттер и сеттер.
Вы фронтенд для ASP учите? Или чисто ищете бэк вакансии? Как я заметил как минимум 50% вакансий требуют умения писать фронт. А иногда еще и Razor, лол.
>>2761428 Спору нет конеш, но даже на пхп меньше вакансий, где требуют знание frontend-технологий, а зп такая же, вакансий больше. Зачем вам здался этот шарп? Вы же в России живете, а не там. Выбирайте по делу, а не по желанию и будете с пирогом, а если нет - будете сосать бибу.
>>2761415 >Или чисто ищете бэк вакансии This. На шарпе сейчас достаточно проектов с микросервисами в которых либо вообще нет фронта, либо он таков, что проще нанять одного-двух фронтедеров которые будут его вести, вместо распыления на это дело ресурсов кучи бэкендеров.
>>2761606 Поебать + похуй, но чел потерял берега. И учитывая его пристрастия к политоте, таким шизоидам не впервой всюду лезть и ебать мозги мнением, которого не спрашивали.
>>2762349 Практика - это не портфолио. В учебных целях можешь написать, к примеру, имиджборду. Хры смотрят на то, где учился и какие у тебя хардскиллы.
>>2762355 Тогда будет ли нормальной практикой написать браузерный IRC клиент? То есть помимо всего прочего подразумевается реализация уже существующего протокола.
>>2762554 Ну таки в ансейфе можно дикую анальную эквилибристику устраивать вплоть до оптимизаций через ссе/авх/етц...
>>2762560 Видел что под линью тестили дрова для сетевухи на жабе/шарпе/расте/другом говне. Должно гуглиться репо на гитхабе. Проект был года 2 может назад
>>2762606 > в ансейфе можно дикую анальную эквилибристику устраивать вплоть до оптимизаций через ссе/авх/етц... Я как-то попробовал "просто" вставить нативный код с винапи, так понадобилась анальная эквилибристика с пробрасыванием в C++/CLI. При этом оно запускалось без возражений, но не действовало, кончилось тем, что я просто кинул в папку нормальный экзешник скомпиленный на нормальном С++. Кошмар. Динамикодрисня и нативный код это взаимоисключающие понятия. Что бы там ни кукарекали маркетолухи: "мы не хуже, слышите, не хуже!". Да, вы не хуже, потому что вы днище к которому понятие сравнения неприменимо, слишком велика пропасть разницы.
Смотрю после гречневой работы уроки C#. Мечтаю вкатиться. Нет каких-нибудь идей, как найти подработку на выходные в около айти, но чтобы капали какие-то реальные деньги, пусть хоть 20 рублей в час?
>>2762623 Как вкатиться на гречневую работу? Заебало айти. Вы то там в 9 пришли в 6 ушли и голова не о чем не болит, а мне с 8 до 8 сидеть, еще и на выходных выходить, если не успеваю.
А в чем прикол вашего "шарпа"? Тут даже множественной наследования нет как в Python. Как по мне Python лучше чем шарп во всём асболютно. И коммунити не такое токсичное и библиотек дохера различных, фреймворков куча, синтаксис кайфовый, дизайн языка божествененн.
Учуизучаю пытаюсь в "программирование" полностью самостоятельно (молодость просрал, курсами не пользуюсь), но цель не стать программистом (хотя кому я пижжу, хотелось бы, просто понимаю, что уже всё проебал), а научится делать более-менее хорошо для себя, мечтал пилить всякое ещё со школы, но как-то некогда было просрал время впустую.
Так вот совет нужен как научиться делать более-менее хорошо. Есть у меня микроидея, на которой я учусь, так сказать, но я её миллион раз начинал заново, потому что каждый раз осознаю, что получается не оче и хочется лучше, постоянно пытаюсь придумать, как исправить/переделать, чтобы было заебись (для моего плинтусного уровня, само собой). Я не стремлюсь сделать прям "идеально", а просто хорошо.
Сейчас это просто монолитное однопользовательское однопоточное приложение на ВПФ с бинарной сериализацией. Хочется как минимум перейти на ЕФ и выделить из приложения бизнес-логику/домен (если я правильно понимаю эти... пусть будут термины), в общем сделать так, как делают цивилизованные белые люди, но я хз как научиться. Может есть хороший материал на почитать? Или законченный проект, в сорсах которого можно покопаться? Я какие-то находил, но там всё куцо, ужато и вопросов возникает больше, чем ответов.
>>2762632 >Тут даже множественной наследования нет как в И нахуя оно нужно? Тут и с обычным наследованием макаки умудряются такого наговнокодить, я представляю какое говно они выдадут с множественным.
Пилю десктопную программу для просмотра картинок. Пока что решение состоит из нескольких проектов: - Проект с сущностями для базы данных - Проект для работы с локальными данным - Проект для работы с различными api - Проект с сервисами, который взаимодействует с двумя вышеназванными проектами - Проект с интерфейсами, на который ссылаются все проекты за исключением проекта с бд. - И наконец проект с гуем, который работает с сервисами из соответствующего проекта. Все правильно сделал?
>>2762780 Что жирного? Картинки можно будет просматривать не только из локальных директорий, но и со всяких бур. База данных для присваивания картинкам тегов.
Слушайте, ни у кого нет данного бага? Периодически отваливается xaml часть от код бихайнд. К примеру пикрилейтед, инициализация компонента, все переменные в xaml, к которым я обращаюсь по имени — не видны.
Лечится тем, что я захожу в файл <проджект_нейм>.csproj.user и чет там меняю, к примеру добавляя строку или пробел. Я думал это проблема бейсика, но в шарпе эта залупа тоже прослеживается. Обновление предпоследнее (если считать вышедшее 13ч назад).
>>2762892 Вот перезагрузка точно не поможет. Точнее, ошибка не будет возникать пока я не открою проблемный файл (и будет пропадать, как только его закрою). Чтобы в принципе исключить проблему, нужно чтобы студия обновила .csproj.user
>>2763016 Можно объявлять абстрактные (и виртуальные конечно тоже) статические методы в интерфейсе, которые обязан имплементить тип. Это сделано для дженерик математики, но чувствую скоро мы увидим большое разнообразие применение данной фичи. Так сказать во всех галерах мира
Почему мой говнокод так странно работает? Была идея заполнять массив в цикле foreach. Нагуглил, что для этого нужна отдельная переменная, которая используется как индекс для записи в массив. Ну да, это работает. Второй цикл показывает, что и по индексу и по перечислителю возвращается одно и тоже значение. Но почему в первом цикле, перечислитель постоянно выдает 0, хотя индекс показывает, что значение уже присвоено?
>>2764109 потому что при foreach(int elem = в elem было СКОПИРОВАНО значение ячейки из массива. И что там с массивом дальше происходит - ей до одного места, она ссылается на копию. ДАЖЕ если то будет ссылочный тип - все равно это будет КОПИЯ ссылки.
нужен ref чтобы ссылалось именно на ячейку в массиве и видело изменения.
>>2764109 >>2764226 >ДАЖЕ если то будет ссылочный тип - все равно это будет КОПИЯ ссылки. И что? Любые копии ссылок - равнозначны, ссылаются на одно и то же. У тебя так устроена файловая система на компьютере. Имена файлов это лишь ссылки, обычно ссылка одна, но ничто не мешает сделать еще, и они все будут одинаковые, везде тот же самый файл - один.
>>2764109 1) Если тебе в foreach понадобился индекс для элемента коллекции - значит код изначально неправильный, переделывай. Это не значит, что так делать совсем нельзя, но это явно не твой кейс и ты даже близко не подошел к темам где это может понадобиться. 2) Вообще использовать foreach для массивов такое себе. Используй for и не выебывайся. Да и само использование массивов - тоже не айс. Учись сразу пользоваться коллекциями. 3) Foreach не используется для изменения содержания коллекции, только для работы с конкретными элементами и изменения их. Если тебе эта фраза кажется странной, то ты еще не дорос. Возвращайся к изучению, что такое коллекции, как работает итератор и отличию reference types от value types.
>>2764276 >3) Foreach не используется для изменения содержания коллекции Используется, есть .ToList() делающий копию которую перебирает foreach, с помощью ссылок из которого манипулируешь настоящим списком.
>>2764244 >И что? Любые копии ссылок - равнозначны, ссылаются на одно и то же ссылаться они будут на одно. но сами ссылки разные. они чисто физически лежат в разных местах памяти. Один объект в куче и 1000 ссылок на него лежат в 1000 разных мест.
>У тебя так устроена файловая система на компьютере 2 ярлыка на рабочем столе ведущих на 1 файл - все равно физически 2 разных ярлыка. И если ты изменишь 1 ярлык, то второй ярлык об этом ни сном ни духом
ВСЁ ВСЕГДА копируется. Независимо от того ссылочный тип или значимый. Поэтому при передаче ссылочного типа (без ref) в метод ты не можешь перезаписать этот объект чтобы он изменился и за пределы метода. Ты всего лишь перезаписываешь ячейку памяти куда была скопирована ссылка.
Так и переменная elem хоть и знает о значении (или ссылке) что лежал в массиве, но ничего не знает про про память массива и если память массива будет изменена, то откуда ей об этом знать.
для этого есть ref locals - вот он позволяет сослаться на конкретную ячейку памяти без копирования значения этой ячейки.
>>2764276 Это я и так знаю. Я же не спрашивал почему elem=10 выдает ошибку. Вопрос больше теоретический.
>>2764226 >>2764310 А вот тут не понятно. С одной стороны, похоже это действительно так и работает. Если предварительно инициализировать массив, то Console.Write(elem) начинает выдавать именно эти значения. И что тогда получается? foreach создает копию значений всех элементов массива? Такого быть не должно. Массив же ссылочный тип. А если в нем миллион элементов, и что, в кажом foreach каждый раз будет создаваться миллион копий?
>>2764331 одна копия создаётся на каждом цикле если у тебя массив из миллиона элементов, в итоге, у тебя будет миллион копий, но в конкретный момент времени будет лишь одна, если ты её не сохранишь где-нибудь ещё конечно
>>2764341 >в итоге, у тебя будет миллион копий, но в конкретный момент времени будет лишь одна Ну то есть он типа по очереди копирует каждый элемент в одну и туже переменную? Все равно как-то не очень. Получается по памяти может расход и не большой, а по времени в целом в конце концов выходит тоже самое, что скопировать весь массив в новое место.
>>2764297 То что там ToList под капотом делает вообще поебать. По факту ты все равно получишь новую коллекцию, а старая останется неизменной. Нельзя внутри foreach делать какие-либо манипуляции с наполнением самой коллекции. С отдельными элементами на которые у тебя в коллекции ссылки можно делать что угодно, а вот заменять/удалять/добавлять сами ссылки в коллекцию - нельзя, только собирать новую.
>>2764331 >Массив же ссылочный тип какая разница если фореач на каждой итерации работает с ЭЛЕМЕНТОМ массива, а не с массивом так что если в нем миллион элементов, то да, будет миллион итераций и на каждой будет создана копия значения очередной ячейки массива.
>>2764411 >что скопировать весь массив в новое место. тебе копировать или работать с элементами? не нравится - не копируй, работай через for, плоди ref. Вот только это стоит того только если у тебя там большие структуры или очень очень горячий кусок.
Вон при каждом вызове метода, коих в коде миллионы могут быть, тебя же не смущает копирование параметров...и ты не пишешь поэтому одну гигантскую 10000строчную портянку (хотя судя по скрину пишешь )))
>>2764500 >Вон при каждом вызове метода, коих в коде миллионы могут быть, тебя же не смущает копирование параметров... джит смущается и где надо сделает портянку
>>2765138 Нет не оговорился. Span-ы это указатели на область памяти, а не на стек. И потому GC знает про span чтобы уплотнять память и не похерить их. А вот в старом дотнете они сделаны через костыли - там неполноценные span но там же некрофилы
>>2765159 Хочу рантайм который не падает от необработанного исключения в async void в пользовательском коде.
Я не понимаю, почему нет возможности через конфигурацию переопределить это поведение, без пердолинга на плюсах.
То есть async void существует, Assembly.Load() существует, Activator.CreateInstance() существует. А блядскую политику поведения при необработанном исключении, для собственного домена, переопределить нельзя. Без пердолинга на плюсах.
>>2765160 Скорее всего из за мультиплатформенной парадигмы. А может потому что домохозяйкам не положено безусловно убивать потоки, которые могут оставить после себя неосвобожденные ресурсы.
>>2765160 запретили потому что нет гарантий сохранить валидное состояние программы. Альтернатив не дали.
>>2765162 Нуууу. Я дам тебе только направление Ты знаешь про AppDomain.CurrentDomain.UnhandledExceptio, который если сработал, то "наши полномочия всё" Также TaskScheduler.UnobservedTaskException не работает потому что async void не рождает Task и в общем то негде исключение рождать.
Однако в WPF есть Dispatcher.UnhandledException и потом Application.Current.DispatcherUnhandledException и вот внезапно Dispatcher.UnhandledException поймать можно и сделать у него e.Handled=true
Как я понял, исключение для async void рождается в текущем SynchronizationContext, а значит если у тебя не WPF, то задай свой SynchronizationContext Я попробовал даже .ConfigureAwait(false); и все равно ловит
Про TaskScheduler.UnobservedTaskException также не забывай - в него прилетит если у тебя обычный забытый таск (даже внутри async void)
Еще в классе Dispatcher есть UnhandledExceptionFilter
В общем покопайся в исходниках класса Dispatcher и на тебя снизойдет просветление, что нужно брать котлин - там скриптинг искаропки
>>2765205 Нет. Я не знаю как решать твою задачу. Мне понятно только одно - в случае async void исключение будет выброшено в текущем SynchronizationContext.
Я хз как Dispatcher разбирается когда исключение является именно unhaтdled. Ну ладно у него там 1 поток в котором он работает, а тебе нужно мудрить SynchronizationContext с бэкендом на тредпуле и хз как тут быть.
Даже если ты разберешь исходник класса Dispatcher (а то и вообще весь его просто перенесешь) и поймешь че да как, то все равно легко запустить async void без контекста и все упадет.
>>2766197 да все просто напиши свой двач, свой твиттер, свой фейсбук, свой вк пересади на них весь мир и сможешь использовать их в портфолио и устроиться на на работу за 25тыс
>>2766197 С прошлого треда: 1) Электронная очередь. Учитывая все ньюансы. От выдачи номера, до распределения к кому из операторов клиент попадет на обработку, с учетом того, что задачи у посетителей могут быть разные и что у операторов тоже разная области ответственности. И все должно идти ровно и без долгих простоев. Если делать по честному от и до, то сможешь проработать дохуя ньюансов, о которых не стыдно будет рассказать. 2) Роутинг электронных сообщений. Это когда в какой-нибудь каталог на диске или сетевую шару постоянным потокам сыпятся xml-ки в охуительных объемах и их нужно оперативно оттуда разбирать, обрабатывать согласно бизнес-процессу и передавать дальше, попутно сохраняя нужную инфу в БД и выкидывая нужные ссобщения. Тут тоже дохуя приколов от многопотока, до разбора ЭС и т.д. И как бы тупо это не звучало, но это до сих пор стандарт и куча B2B взаимодействия происходит в таком виде (да-да никаких очередей вам сучечки). Поэтому нужно не просто уметь делать такие вещи, а делать их быстро и эффективно. Вплоть до того, что тебе тупо могут дать xml-ну на несколько тысяч строк и без всяких спеков и xsd схем и ты должен уметь ее разобрать и встроить это в существующий БП.
>>2766388 1. Пиздец. Кто мне тз на это всё напишет? 2. То же самое, плюс нихуя не понятно про "охуительные объёмы". Гигабайт в секунду? Тысяча xml по гигабайту каждый в секунду?
>>2766411 >1. Пиздец. Кто мне тз на это всё напишет? Вот заодно и в этом тоже и потренируешься. Если ты думаешь, что на реальной работе тебе кто-то будет составлять ТЗ описанные более подробно чем здесь >>2766388 , то ты ошибаешься. Просто зайди на почту или в любую другую контору в которой где есть очердь по талонам, посмотри как там все происходит и сделай что-либо подобное. >>2766411 >2. То же самое, плюс нихуя не понятно про "охуительные объёмы". Гигабайт в секунду? Тысяча xml по гигабайту каждый в секунду? Ну возьми для начала штук 3 миллиона в день, с пиком в тысяч 100 в час. XML достаточно килобайт по 20 там не размер важен,а содержание, плюс уметь это разбирать так, чтобы потоки друг с другом за файлы не дрались. Для примера можешь взять, ну хуй знает, ЭТРН какой-нибудь и попробовать доставать из него часть информации и формировать на их основе какие-нибудь свои данные, плюс можешь потренироваться подписывать, проверять подписи на xml-не, тоже полезный навык.
>>2766487 >так, чтобы потоки друг с другом за файлы не дрались. Алсо, еще и очереди не должны копиться. Т.к. обычно бизнес на обработку одного такого сообщения дает лимит времени. Обычно несколько минут максимум.
>>2766498 Если ты думаешь, что ситуация когда тебе дают задание написать какой-то модуль или сервис, ты начинаешь пытаться узнать у окружающих что и как работает в системе и получаешь от всех в ответ "а хуй его знает" - это что-то нереальное, то я тебя огорчу. Такое случается с завидной регулярностью.
Пацаны. Почитал про новые фичи нового шарпа. И меня чутка смущают новый синтаксис для конструкторов по умолчанию. Ну, т.е. вот та ебала из котлина, когда:
class Zalupa(ILogger logger, IServiceA serviceA){}
Почему смущает. Потому что я уже привык, что я в конструкторе делаю валидацию параметров. Как ее тута делать - хуй знает. Второе - я так и не понял - для классов это так же как у рекордов будет публичными свойствами? А если мне нах это не уперлось?
>>2768057 Похуй + похуй Ты, наверное, небольшой стаж имеешь. Спустя время, если не будешь сидеть сиднем, будет безразлично, что там и как выражается. Мне вот фшарп сейчас больше шарпа нравится. Все ругают джаву за многословность, и есть за что. Говорят, на шарпе код лаконичнее. Так вот, фп код ещё короче, чуть ли не в половину.
Единственное, что бесит – фшарп для Майкрософт язык второго эшелона, соответственно, нет горячей перезагрузки и встроенного форматирования кода в VS. Ну и ошибки компилятора порой нечитаемая залупа. А так – как глоток свежего воздуха
>>2740238 (OP) Аноны, подскажите. Учусь еще. Хочу прописать взаимодействие с .doc .docx файлами: открывать, редактировать, сохранять и т.д. Нашел несколько путей решения, например, https://www.youtube.com/watch?v=vQ7uW6g0z-U 1)Вопрос возникает такой, если добавить Microsoft Word 16.0 Object Library через ссылки->COM, то необходим ли Microsoft Office Word на том компьютере, куда уже будет перенесена готовая программа для её работы? То есть заработает ли ГОТОВАЯ программа на том компьютере, где нет Ворда? 2)Нашел еще решение: загрузить через NuGet Microsoft.Office.Interop.Word. В этом случае нужен ли ворд для работы готовой программы на компьютере где нет ворда?
>>2768437 Либа написана на netstandard2.1, а использую ее в net 7. Может это из-за того, что в первой отсутствует ебатория с вопросиками? Но я впервые вижу чтобы в EventHandler sender был nullable. Или не обращал внимания
>>2762623 >Смотрю после гречневой работы уроки C#. Мечтаю вкатиться. Нет каких-нибудь идей, как найти подработку на выходные в около айти, но чтобы капали какие-то реальные деньги, пусть хоть 20 рублей в час? Ну нет так нет >>2762624 >Как вкатиться на гречневую работу? Заебало айти. Вы то там в 9 пришли в 6 ушли и голова не о чем не болит, а мне с 8 до 8 сидеть, еще и на выходных выходить, если не успеваю. https://2ch.hk/wrk/res/2625231.html#2730098 Тут глянь
Как заставить студию копировать ресурсы только если они изменились? Вот у меня есть в ресурсах ffmpeg.exe, который весит под 150 мегабайт (а там есть еще ffplay.exe = 150Мб, ffprobe = 150Мб). Если я ставлю "всегда копировать" или "Копировать более позднюю версию", то при каждой сборке файл копируется, увеличивая время сборки.
>>2767682 Пилить в 2023 дестктопную программу для картинок вместо использования профессионального софта - быть дауном. Бывают специфичные КЕЙСЫ, когда заказчик платит и ему похуй, но даже в таком случае стоит взять опенсорс проект, который легче всего экстендится. Тратить время на это как на пет проект? Чтобы научиться круды шлёпать или орм юзать - так ты этому научишься в любом месте. Да даже если веб-приложуху делать - ты больше с технологиями познакомишься, как минимум нужна будет очередь юзеров на функционал для гостей.
Пацаны, делаю д.з., пишу самый простенький калькулятор. Никуя не работает, выдаёт ошибку "Входная строка имела неверный формат.", ссылаясь на 16 строку кода. Даже сумму 5+5 не даёт. То есть, ввожу в консоле 5, потом +, потом 5, жму Enter и вылет с ошибкой. Что не так делаю, подскажите?
>>2770938 >А я тупой сори В смысле? >надо преобразовывать в инт Почему в инт? Я же калькулятор делаю. Дробные числа ведь тоже нужны. Более того, чел в видеоуроке делал калькуль с дабл, а не с инт и у него всё работало.
>>2771810 Посмотри, что у тебя в 16 строке находится в Сonsole.ReadLine() Я уверен что там или пустой стринг или что-то, что не получается распарсить. Попробуй использовать Double.TryParse:
var successParse = double.TryParse(Console.ReadLine(), out firstValue); if (!successParse) Console.WriteLine("Input value is not a number.")
>>2771854 >Посмотри, что у тебя в 16 строке находится в Сonsole.ReadLine() Ну и что? >Я уверен что там или пустой стринг или что-то, что не получается распарсить. Не понимаю, что значит пустой стринг? Я число ввожу. >Попробуй использовать Double.TryParse Мне нужно сделать калькуль при условии использование "switch" или "if, else". Вот как этот чел делает. https://www.youtube.com/watch?v=4aL0YVKt880&list=PLQOaTSbfxUtD6kMmAYc8Fooqya3pjLs1N&index=20
TryParse я еще не проходил как полагается.
>var successParse = double.TryParse(Console.ReadLine(), out firstValue); >if (!successParse) Console.WriteLine("Input value is not a number.") Попробовал так. Теперь после ввода второго числа, консоль не вылетает, но и сумму чисел не даёт.
>>2771881 при double.TryParse и вообще парсинге дабл не забывай про разделитеь - он может быть точкой, а может запятой. (хотя чем трахаться с региональными форматами - проще все в одну форму привести)
>>2772129 которые те же в профиль. метод = функция объявленная в классе. Так что можешь называть хоть так хоть этак - всем плевать. А если кому не плевать - плюнь на него.
Аноны, подскажите по распознаванию звука на С#. Хочется прикрутить распознавания речи на русском и чтобы все это работало в офлайн режиме. Я так понял это можно реализовать только с Microsoft.Speech? Других вариантов нет? Я так понял на Microsoft.Speech надо прописывать свой словарь?
Анчоусы, это снова я. Пишу калькулятор. Нужно сделать так, что бы при выборе числа и вводе в консоль абракадабры вместо цифр программа не вылетала. Как это осуществить? Я так понимаю, что мне нужно в каждый case switch впихнуть блок try catch?
Гайз, есть ли где нормальные гайды по переносу C# приложений из Windows в Linux? Это вообще возможно сделать если приложение использует сторонние библиотеки?
>>2773989 Чувачок, это сарказм был если чо. Он даже базовых if while и прочего нормально не знает скорее всего. На данном этапе абсолютно похуй как и что он делать будет, даже если он хоть каждую строчку в try-catch обернет. Потом уже когда научится нормально и соображалка будет работать, то если не дурак то поймет как надо.
>>2774421 А с каким лицом читают книги по фреймворкам? Ладно там читать про параллелизм/архитектуру/паттерны/алгоритмы – про первичную базу. А читать про что-то вторичное – ну хз
>>2772909 На, мужик, тебе изоленту. Я в курсе, что ты этого нихуя не проходил, но это тебе пример, того что ты должен понимать и уметь делать на уровне джуна. И это тоже далеко не самый лучший код.
Кто нибудь работал с FFmpeg. Допустим мне надо конкатенировать 10 аудиофайлов в один, и чтобы между ними были пробелы. Так вот и я видел примеры на SO, что все операции для N файлов пытаются запихнуть в одну команду.
Всвязи с чем вопрос, а почему делается так? Почему не делают цикл, где отправляются простейшие команды?
>>2773149 >Метод это функция cо скрытым параметром this. >скажи это статическому МЕТОДУ. Что не так? Рефлексию видел? Единственное отличие вызова статического метода против нестатического - это передача null в качестве инстанса, то есть в случае статики this == null, всё.
>>2774679 потому что за 1 проход быстрее, чем несколько последовательных вызовов программы, которая на каждый вызов должна читать файл, декодить и начинать работу заново.
>>2774746 >вызова статического метода против нестатического ты эти вопросы адресуй анону, что стат метод функцией назвал, а класс со стат методом неймспейсом для этой функции нарек.
>>2773941 >>2773989 >>2774621 Я действительно в каждый case свитча запихнул по блоку try/catch, затем отшлифовал некоторые места и работает всё как планировалось изначально. Все четыре основные мат. операции, калькуль не крашится при вводе чего-то не того, а отбрасывает в начало, стирая результаты предыдущей операции и работает до тех пор, пока я не закрою консоль. Да, код выглядит громоздко, но работает.
>>2775293 Возможно прокси для какой-нибудь легаси-хуйни. Может в источнике под капотом там какие-нибудь разные свойства были, а по новой бизнес логике должно отдаваться одно и то же но с сохранением старого API.
>>2776735 > Почему этот язык такой приятный? Сахар. > Сложно ли будет найти РАБоту ( готов работать на галлере ) если потрачу время и силы на этот язык? Несложно.
Пацаны, нужна ваша помощь. Я никуя не понимаю. Делаю программку по этому видеоуроку https://www.youtube.com/watch?v=bJ4DtsojdrI&list=PLQOaTSbfxUtD6kMmAYc8Fooqya3pjLs1N&index=23[РАСКРЫТЬ] Нужно сделать так, чтобы после ввода чисел в консоль был совершен подсчёт чётных и нечётных чисел в заданном диапазоне чисел (например от 0 до 100), а затем найдена сумма чётных и сумма нечётных чисел в этом самом заданном диапазоне. Надеюсь объяснил понятно.
Так вот вопросы. Как происходит подсчёт суммы чётных и подсчёт суммы нечётных чисел? Чел в видео вводит в консоль цифру 5. Итог. Сумма нечётных: 9 Сумма чётных: 6 Что блядь? Откуда такие цифры?
И еще вопрос. Зачем ему нужно инкрементировать значение переменных отвечающих за чётные и нечётные числа? Он вроде объяснил, но я ничего не понял.
Шарпогоспода, вы же шарите за таски и все что с ними связано.
Собственно вопрос возник. Что будет эффективнее в плане минимизации использования ресурсов и скорости работы.
Кейс. TCP-сервер, с кастомным протоколом и какой-то логикой связанной с работой с базой. Допустим простейший кейс - TCP-сервер, у которого только один тип сообщений - зарегистрироваться на сервере, после регистрации - бродкастинг сообщений другим подключениям. АКА чатик с регистрацией.
Собственно два подхода вижу я: 1. Все на откуп планировщика. Алгоритм простой: подключились, сервер спарсил сообщение, зарегистрировал клиента, и давай рассылать всем подряд. 2. Событийная модель на базе эвентов. После подключения, в цикле проверяем, есть ли какие-то эвенты для обработки этого конкретного подключения. Используем либо тредпул, либо ручками настраиваем число тредов для обработки всего этого дела.
Собственно, я делал первым способом в свое время. И какие обосрамсы я увидел. 1. Я не могу нормально контролировать размер памяти что используется приложением, потому что надо каждому соединению выделять свой буффер, чтобы не страдать. 2. Из-за конкурентности и того что я использовал NetworkStream - надо каждому соединению синхронизировать доступ при бродкасте, это тоже боль, ну да ладно. 3. Если клиентов много (10к и более) и они разом подключаются - пиздец, сразу 100% ЦПУ задействовано, сразу резкий скачек с потреблением памяти, а потом - GC начинает ебать так, что мама не горюй. 4. Если клиентов много (10к и более) и они разом отключатся - пиздец еще больший чем при подключении. Особенно если клиенты неправильно отключались(просто отключились не послав FIN пакет и сокет закрыла ОС). Эксепшин погоняет эксепшином, их начинает GC собирать и ты сидишь, смотришь на это, попивая чай, пока блин все отключатся, чтобы можно было дальше работать.
Второй пример - я видел в коде MINA и Netty, когда изучал. Я пробовал на жаве написать c Mina. И типа работало-то оно быстрее. Но хуй знает почему - просто непомерно много жрало памяти. Я правда не уверен - это проблема жавы или подхода такого. Просто блин. Сам подход выглядит более экономным. Но 10к соединений - 10 гигов сожрали, я чет с этого опешил и решил что не надо так делать. Ну и второе повторять не хочется, потому что там уже вся эта вуду-магия с визитерами, пайплайнами и прочим, что мне не особо интересно.
>>2777234 >1 Второй способ удобнее когда тебе нужно в строку вставить несколько копий одного и того же параметра, например string.Format("число: {0} и еще раз {0} ну и еще раз {0}", number) >2 Отличие в том, что во втором случае компилятор за тебя сам потом отэскейпит последовательности.
>>2777755 >1 в боксинге отличие. 1. Тащемта боксинга можно избежать просто передавая параметры через .ToString(), например: string.Format("число: {0}", number.ToString()) 2. Сам парсинг в String.Format сожрет намного больше времени чем боксинг, так что не особо стоит заморочек.
У меня есть класс, который перед использованием нужно инициализировать. Так вот, какое исключение кидать, если пользователь попытается вызвать метод до инициализации?
В большинстве случаев я пытаюсь этого избегать, ибо придется в каждом методе проверять инициализацию. Если посмотришь в классы, где есть инициализация (типа контролы всякие), то там есть флаг IsInitialized.
И это надо в каждом методе if(!IsInitialized) throw new Exception("ClassName is not initialized"); Но это же сумасшествие.
>>2778328 Как по мне, если твой класс спроектирован так, что он требует перед началом его использования вызов метода инициализации, то он спроектирован хуево и дурно пахнет. Либо полностью инициализируешь его как положено в конструкторе, либо, если по каким-то причинам это сделать не выходит (самый банальный пример - операция инициализации должна выполняться асинхронно), то запрещаешь пользователю дергать конструктор (internal можешь его сделать) и пишешь фабрику для объекта данного класса, инициализируешь объект как положено внутри методов фабрики и отдаешь пользователю в уже готовом к использованию виде. А на счёт исключения. Как по мне, для такой ситуации вполне подойдёт InvalidOperationException.
>>2778671 Инжектишь экземпляр фабрики вместо экземпляра целевого класса. Потом, в том месте где необходимо, с помощью фабрики создаёшь нужный тебе объект. С DI тут вообще проблем нет. Единственное, если твой объект через параметры конструктора из DI зависимости получает, то переносишь их в параметры конструктора фабрики, а потом прокидываешь в конструктор объекта при его создании.
Пацаны. Планирую вкатиться джуном. Решил вот так сказать закрепить свои знания о том что изучил за последний год. В качестве пет-проекта типа тамагочи решил сделать.
>>2778328 Не делай классы, которые надо инициализировать перед применением. Это максимально пидорское проектирование и ебал я в сраку таких вот составителей апи.
Вся инициализация целевого класса должна происходить в конструкторе. Если это публичное апи. В своем - че хочешь делай и че хочешь кидай. Но наружу такое просачиваться не должно, если ты не пидорас конечно.
>>2778756 >Оцените код В нынешних реалиях на джуна - нет. На стажера может быть (только за стажировку платить будешь ты) >дайте советов мудрых! Сорян, но там такие базовые ошибки, что даже объяснять лень.
Ого, а думал, что в обобщениях вообще любая мат логика не работает, а тут, оказывается, можно написать обобщенный метод, который вычислит какое значение больше
Шарпачи, прошу помощи, тут нашел удобную программу сортировалку картинок, но решил дописать немного функционал под себя, не могу выставить для одного объекта значение.
>>2758756 Синтаксически лаконичнее (по крайней мере был), есть сборщик мусора - не надо следить за памятью, ябучие хэдеры не нужны, всякие полезные структуры данных из коробки
В шарпе есть default properties? Поисковик выводит только default value property, а метаните ничего не упоминается.
Короче суть такова. В бейсике есть свойства по умолчанию, которые автоматически вызываются при обращении к экземпляру. К примеру в классе List дефолтным свойством является Item, поэтому я могу выполнить подобную конструкцию myList(0) = 999 что эквивалентно myList.Item(0) = 999 в шарпе почему-то это делается расширением myList.ElementAt(0) = 999; И что сломало мой мозг в шарпе, так это вот это myList[0] = 999; Почему скобки квадратные?
>>2780440 Да есть такое, как-то по-китайски написано, много и ненужно. Но что ж поделать, проект уже готовый. Рефакторить не хочется, этого и на работе хватает.
Так просто пару фиксов добавить для удобства надо, может даже пул реквест на них запилю, лол.
>>2780751 >Это у вас они почему то круглые. Потому свойства в бейсике это по сути метод, а метод может иметь кучу параметров. Грубо говоря я могу и вот такое провернуть myCustomList("itemName", isChecked:=true) Тут прослеживается логика, а ты мне про "так заведено" — очень странно.
>>2781048 Забавно, что при отсутствии схожего функционала я в ответ получил только высокомерные оскорбления. Вообще со свойствами в шарпе полная задница. B cамое глупое в этйо ситуации то, что я не могу передать свойство в качестве параметра потому что свойство это метод, но при этом метод не поддерживает множество параметров. Зато обезьяньи квадратные скобочки — ага. Каргокульт бессмысленный и беспощадный, и высокомерие.
>>2781379 >>2781379 >Зато обезьяньи квадратные скобочки — Ты, блять, не поверишь, но 'квадратные скобочки' - это по сути тоже метод. Гугли, что такое индексатор в шарпе. И таких индексаторов к своему классу ты можешь прикрутить сколько угодно, с любым функционалом.
шарпаны, есть запечатанный класс с пачкой проперти, хочу прицепить к ним INPC. сам класс нельзя изменять (он из стороннего длл). планирую врезаться в сеттеры рефлексией, подводные камни?
>>2782848 Делай декоратор и не выебывайся. С рефлексией ты на пустом месте теряешь от 10 до 100 раз в производительности. Дополнительно - рефлексия это как ЭссКуЭль: пока пишьеш - просто понятно, когда через два дня посмотришь на это - будешь думать, что за долбоеб писал и что оно вообще делает. Ну и для твоей задачи - вообще хуй пойми зачем это.
>>2778756 Что бросается в глаза: - Вместо абстрактного класса с одним абстрактным методом в шарпах используют интерфейсы. - goto в бизнес логике использовать грешно, переписывай без него.
>>2782999 А. Чеж сразу не сказал. Ну, тогда да. Тебе только рефлексией и извращаться. Ну, еще ансейфа навалить придется и немного с илом поиграться. Правда я не уверен все еще что стоит оно того и ты знаешь что делаешь.
>>2782896 >Дополнительно - рефлексия это как ЭссКуЭль: пока пишьеш - просто понятно, когда через два дня посмотришь на это - будешь думать, что за долбоеб писал и что оно вообще делает. Этот шарит. И за sql и за рефлексию.
>>2783034 Чел. Я не знаю ты пытаешься рофлить или нет, но первые 3 года я работал администратором СУБД, лол. Писал хранимки, писал хуйню для SSRS, делал дохуя изъебистые выборки, оптимизировал то что работало медленно и прочей чепухой занимался. И вот знаешь. Мое мнение - именно такое. Скуль - охуенно пока ты в контексте. Написать и забыть - охуенно. А вот если у тебя через месяц попросят модифицировать то что ты там написал - тебе проще нахуй выбросить все и написать с нуля, чем пытаться вспомнить. Блин. Да простейший пример- найти все дырки в таблице(т.е. есть в таблице последовательность значений, допустим целые числа от 0 до максимального в таблице, надо среди нее - все пропущенные значения выбрать). Делается в 4 строчки. Но сейчас я даже не вспомню как оно делается-то и уверен что даже те кто каждый день пишут SQL-запросы ручками - с ходу не напишут такой запрос без гугления.
>>2783067 Никаких рофлов. Полностью с тобой согласен. Еще в эту же копилку - регулярки. Их обычно уже через неделю бессмысленно разбирать и проще сразу в конструкторе собирать.
Платиновый неофитовый вопрос на счет зависимостей: Есть главный проект (1), LoggerService библиотека (2), Contract библиотека (3). Между ними зависимости 1->2->3. Вопрос, должен ли я видеть в первом проекте референсы третьего проекта? Пример, во втором проекте используется либа NLog, но в первый проект его не видит. В туториалах пишут пикрил, хотя я по прежнему ничего не вижу даже после этих действий. И еще пример, в третьем проекте у меня есть интерфейс который используется во втором. В первом проекте у меня используется класс со второго проекта в котором есть поле типа интерфейса с третьего проекта, но если я хочу его использовать в первом проекте - он не находит тип интерфейса. Пока что я тупо в зависимостях на указывал ссылки на все дллки всех проектов, это норма?
Почему верхний класс выдаёт ошибку? Скопировал код из книги и решил так сказать переписать в развёрнутый конструктор. В итоге нихуя не работает. Сама ошибка: ОшибкаCS8862Конструктор, объявленный в записи со списком параметров, должен иметь инициализатор конструктора "this".
>>2783633 Потому что ты объявил так называемый primary constructor вот этой строкой: record Point(), () <-- primary constructor Если он объявлен, в любых других конструкторах ты обязан его вызвать с помощью : this()
Если нужно проверить конкретный неймспейс, то тебе придется пройтись по всем сборкам, из-за того что неймспейс можно писать где-угодно. В любом случае это несколько строчек рефлексии с линкю
к слову, если я правильно помню, IRequestHandler<> не регается в di, медиатр создаёт инстанс через активатор, так что если речь только про иньекцию, то проблемы нет но может я неправильно помню
Пацаны, тут как-то упоминали не городить велосипеды с ICommand и, мол, есть готовые решения.
Что меня смущает в командах? Во-первых передача данных команде очень неудобна и порой невозможна. Нельзя биндить данные к параметру Execute, который сам по себе неудобен тем, что он object.
Часто команду сложно сделать универсальной и проще переписать под нужную вьюмодель. Но тут вероятно моя беда. Все свелось к тому, что я в команду добавил INPC и добавляю множество параметров через биндинг свойств.
Но все же хотелось бы посмотреть другие реализации для общего ознакомления.
>>2783551 Короче я разобрался, я дебил - подключал сбилдженные дллки к мейн проекту, а надо было добавить проект к решению и затем добавить к мейн проекту ссылку на общий проект, тогда подтягиваются референсы с дочернего проекта.
Кстати вопрос, что сейчас вместо Microsoft.AspNetCore.Mvc? Он помечен как deprecated, но я чето пока не могу найти замены.
>>2785928 ну у них на сайте сказано что их купил датадог, так что в будущем будет 22студия >решарпер вообще тут никаким боком. даже рядом не валялся я кажется где-то видел, что брейнсы тоже собираются сделать такое
https://pastebin.com/rP9amwHE есть ли способ в подобном случае избавиться от RTTI? проще всего же сделать свич xx is yy, но это кмк уродство и быстро засрется когда классов-настроек станет больше. на словаре типов тоже делать не хочется. ломаю над этим голову уже который день и не понимаю что с этим делать. assembly1 хранит только настройки и в идеале не должна знать о том что с ними делать будут в assembly2.
Пацаны. Помогите. В общем. Работаю на кафедре. Веду лабы. Раньше было на си. В этом году - сказали что си не модно и надо первокуров сразу с шарпа учить. Собственно. Пример одной из лаб которые я даю. Думаю понятно, дан заголовочный файл, и main.c надо написать реализовать что там объявлено в заголовочном файле, чтобы в результате - вывелось правильное значение.
И чет я не совсем представляю как такое на шарп-то перенести, чтобы первокурсникам было понятно и чтобы типа ощутили как программы, и при этом не городить миллион абстракций. На си-то это делается банальным свич-кейсом однми и немного с указателями поиграться.
>>2786119 Берешь объект. Предаешь ему другой объект. Вызываешь на последнем методы, которые возвращают значения, которые как-то там высчитываются. Какой метод вызвать выбирай свичкейсом. Вуаля.
Можешь еще один из объектов в отдельную сборку вынести и подключить эту сборку к проекту, где мейн твой. Будет у тебя юзинг красивенький сверху. Сразу +10 очков к ощущению программы...
>>2786120 я к сожалению не гофер >>2786231 заранее какой конкретный тип будет передан не знаю, поэтому подаю абстрактный, возможно на интерфейс заменю, но суть в том что мне хотелось бы чтобы к конкретному типу настроек создавался конкретный класс их использующий. буду 100% потом добавлять новые конкретные типы. видимо все-таки придется словарь делать
>>2786314 Суть лабы - показать как процессор последовательно выполняет команды из потока байт. В том числе, что функция - это тоже просто кусок памяти, куда "перепрыгнет" процессор. Это одна из первых лаб. Дальше по программе - добавляются регистры, стек, метки, ветвление, циклы и прочее и типа к концу семестра - получаем "эмулятор" выдуманного процессора с выдуманным набором команд такой-то и интерпритатор к нему который уже из текстового файла получает набор команд и выполняет их.
Но в шарпе, как я понимаю, просто так передать указатель на ту же функцию - не так просто. Изначально надо вводить абстракции, А это для первокуров - будет сложно. Видимо надо дропать вот такие лабы и как деды - давать студентоте писать хуйню про "напишите программу, которая решит вот это уравнение".
>>2786362 Чел, я с продуктами твоего обучения каждый день на работе сталкиваюсь. Нихуя они не будут знать ни про процессор, ни про регистры ни про стек с кучей. Пожалей жеребят. Учи прикладному чему-то, а не низкоуровневой хуйне, которая без пару лет практики на реальной работе все равно не усвоится.
>>2786382 >>2786393 Это же лаба для первого курса. Учить прикладным вещам, без базовых - странно. Вы же не учились рассчитывать ежемесячный платеж по кредиту - не освоив как складывать числа? Прикладные вещи - со второго курса начинаются.
А я просто хочу чтобы интересно ребятне было. В прошлом и позапрошлом году вот так давал - и большинству понравилось. Сам помню как горел с лаб в духе: напишите программу, которая проверяет "пароль", напишите программу которая вычислит: "f(x) = sin(x)+tg(x) + 3.14 / 2", напишите программу которая вычислит число фибоначи для 10, напишите программу, которая найдет все простые числа. Ужас. Как вспомню первый курс свой. А это - как по мне - весело и интересно. Плюс типа к концу семестра типа почти законченный маленький проектик, а не laba_1, laba_2. Хотя хз. Вы тут чет накинулись. Даже неуютненько стало.
>>2786408 Ну, лично я, как минимум - изучаю принцип работы. Для новых и совсем непонятных мне штук - еще ищу от более шаристых объяснения, как оно там работает. А как иначе-то? Мне как-то не хочется оказаться в сводках новостей из-за того что я неправильно пользовался микроволновкой и у меня квартира сгорела или еще что-то страшное произошло.
>>2786407 Братан, базовые знания в программировании в 21 веке это не то, как работает процессор. Это очень далеко от вещей, которыми занимаются большинство кодеров. Об этом позаботились бородатые дядьки еще десятки лет тому назад.
>>2786407 Хоть убей не понимаю, чем >напишите программу которая вычислит: "f(x) = sin(x)+tg(x) + 3.14 / 2 скучнее чем то что ты там выложил изначально. Если накинуть какие-нибудь фракталы или там дифурчики и визуализацию, то вообще ништяк. Как раз на шарпах окошки с графикой приятно писать.
>>2786418 Как будешь поступать с закрытыми системами коих вокруг нас огромное количество?
А некоторые знания тебе вообще никак не помогут. Все тут сидящие думаю постоянно оплачивают картами покупки но помогут ли им знания о протоколах бесконтактной оплаты и внутреннем процессинге банков?
Как реализовать обработку данных из очереди в другом потоке? Если просто запустить цикл while(true), то одно ядро будет постоянно загружено на полную. Если добавить Thread.Sleep(1), то обработка будет происходить не сразу, после добавления элемента в очередь.
>>2786740 Прокинь AutoResetEvent в бесконечный цикл и в метод, где у тебя push происходит. Пусть луп поток ждет сигнала в waitOne(). Когда кто-то добавит элемент в очередь он вызовет .set(). Луп поток разблокируется и выполнит TryPop. Затем опять вернется на исходную, ожидая вызова .set().
Но лучше просто тред слип юзай и проверяй очередь 10 раз в секунду или типа того. Человеческому глазу эта задержка не заметна.
>>2786820 Чел хочет чтобы задача сразу после попадания в очередь начинала выполняться. Соответственно, ему вот эти вот переключения шедулера, чтобы пройтись по задачам и найти ту что выполняется - критические. Скорее всего он пишет свою RTOS на шарпе. Или под микроконтроллеры что-то программирует(соответственно все эти getNext - очень долго будут выполняться, да и растущий тредпул - тоже не круто) Собственно, потому - все эти вот решения с очередями, каналами с эвейтами и прочее - не подходят. Надо делать либо свою систему прерываний, либо брать ReadWriteLock/ResetEvent, ну или если хочется сэмулировать async-await - можно взять TaskCancellationSource
А эти вот Channel - там задержка такая, что под микроконтроллеры брать ни в коем случае нельзя.
>>2786847 >Скорее всего он пишет свою RTOS на шарпе. Или под микроконтроллеры что-то программирует Из его поста это никак не вытекает. Больше похоже, что он пытается в велосипед, когда уже есть датафлоу или те же каналы.
Объясните к чему именно идет биндинг. Допустим у меня есть свойство типа FileInfo. Само свойство вызывает событие INotifyProprtyChanged, но привязаться мне надо к FileInfo.Name, в котором вряд ли реализован INotifyProprtyChanged.
Не будет ли утечек памяти, если я привяжусь к FileInfo.Name? Или надо пилить ValueConverter?
Как ведет себя привязка? Она биндится к FileInfo, а затем ищет внутри свойство Name, или же биндится напрямую к Name?
>>2786637 ужас BlockingCollection для этого и придуманы для async Channel Для любителей пониже уровнем могут лепить свое с AutoResetEvent и другими примитивами синхронизации.
>>2787255 Я работал. Что значит рисовать вне UI потока? Ты понимаешь, что такое UI-поток? Рисовать вне его - невозможно, если ты хочешь увидеть результат своего рисования. Возможно, если ты с результатом делаешь что-то еще, типа сохраняешь в битмапу - в таком случае просто создаешь канвас и рисуешь лол.
Если ты имеешь ввиду есть ли для SkiaSharp контролы под UI либы - есть, под все шарповые вроде.
>>2787456 Он про то что искусственное ограничение на работу с юи в один поток лишь от отсутствия блокировок и синхронизаций и что в либах где они заимплеменчены можно не заморачиваться
>>2787456 > Я работал. Что значит рисовать вне UI потока? То и значит, берешь и рисуешь в любом потоке, как я уже писал CanvasSwapChainPanel позволяет это. К тому же в Uwp помимо ui потока есть еще и поток Composition, так что никаких проблем с отображением результата нет.
>>2787588 Вот собственно документация > Using theCreateCoreIndependentInputSourcemethod, apps can process input and render to a SwapChainPanel entirely on one or more background threads. This enables high performance input and rendering independent of the XAML UI thread
Аноны, как в впa ошибки отлавливать Я пока решил не использовать MVVM, потому что в моем интерфейсе литералли 2 кнопки и мне нужен текст элемент, чтобы ошибки показывать. В инфраструктуре есть класс GoogleLensUploader, который имеет метод UploadImade принимающий byte[] и вызывает несколько других методов, которые отсылают запросы и возвращают string. Также в инфраструктуре я разместил кастомный json converter и враппер, который принимает этот конвертер и возвращает мож модель TextRow из домена. Вся эта хуйня через dependency injection используется а application слое, который уже и используется в моем mainwindow. Так вот, как в таком проекте ошибки отлавливать и рендерить из на текстовом элементе юзеру?
>>2787641 > впа впф* Ну и да, в интерфейсе буквально 2 кнопки, само mainwindow принимает ClipboardMonitor и подписывает метод на его эвент, который говорит, обновился ли буфер обмена и есть ли в нем картинка. А 2 кнопка отписывает от ивента.
>>2787588 Синхронизация все ещё есть, просто на уровне DXGI и DirectX.
Со скиа так не канает, вроде потому что angle на котором скиа работает, не реализует эту фичу, Майкрософт пыталась сделать это в форке, но я хз попало ли это в апстрим Гугла.
В итоге сейчас да, в xaml контролы нужно рисовать по макету.
>>2787641 >Аноны, как в впa ошибки отлавливать Если тебе нужно отлавливать ошибки конкретно WPF части, типа биндингов всяких, которые логгер не подхватывает по дефолту, то ты можешь создать собственный регистратор ошибок, а уже в нем логгировать как тебе угодно. Гугли TraceListener.
Ну во всем остальном логгирование ничем не отличается — берешь Serilog или NLog библиотеку и логгируешь себе. Я юзал Serilog, у него есть различные модули: срать в консоль, в окно интерпретации, в текстовый файл, либо в RichTextBox (что тебе подойдет, вероятно). Все эти модули хранятся в нюгете отдельно, посмотри туторы.
Добавляешь логгер в качестве сервиса, вводишь различные настройки, билдишь его, и дальше либо твои сервисы запрашивают экземпляр логгера у хоста, либо ты обращаешься к статическому классу логгера из любой точки приложения (что будет удобнее).
Дальше в конструкторе своего класса GoogleLensUploader пишешь что-то вроде var logger = Log.Logger.ForContext<GoogleLensUploader>; где Log - статический класс, а Logger это экземпляр сервиса. ForContext - это запрос у сервиса логгирования экземпляра логгера в контексте твоего класса Указание типа класса позволит логгеру при каждой записи автоматически подставлять путь этому классу, чтобы читая лог понимать, откуда источник логгирования.
Далее в методе UploadImade ты на свое усмотрение используешь на выбор методы: logger.Verbose("Очень подробная информация") logger.Debug("Подробная информация") logger.Information("Просто информация") logger.Warning("Очень важная информация") logger.Error(ex, "Охуеть как важная информация") logger.Fatal(ex, "Все, пиздец. Приехали.")
Это запись в лог на разных уровнях. Использовать можешь что угодно не сдерживая себя, потому что можно установить ограничение уровня на этапе построения сервиса, например для того, чтобы в релизной сборке логгировались только Warning, Error и Fatal, а в режиме отладки еще и Verbose и Debug.
А результате в лог будет записано что-то вроде этого [VRB 13:25:00:179 MyApp.MyNamespace.GoogleLensUploader] Очень подробная информация [DBG 13:25:00:180 MyApp.MyNamespace.GoogleLensUploader] Подробная информация [INF 13:25:00:181 MyApp.MyNamespace.GoogleLensUploader] Просто информация и так далее ... Сам формат вывода информации: уровень, время, путь к классу — все это настраивается и ты можешь что-то убрать, или же добавить. Так же ты можешь писать логи параллельно в текстовый файл и в окно юзера — тоже на разных уровнях. Вариаций масса.
>>2787751 Из литературы по сути ток документации по графическим апи и может быть статьи по типу "как устроен vulkan". Я когда вкатывался, у меня долгое время было плато непонимания чо происходят нахуй, но потом втянулся. Рекомендую не начинать с opengl, хотя в инторнетах пишут обратное.
В современных апи типа вулкана с интероперабельностью все намного лучше чем в том же opengl. Например я совсем недавно решал задачу рендера на вулкане как раз в WinUI3 шную SwapChainPanel. То есть дружил вулкан и директ. Сделал на гитхабе репу - может какому анону поможет.
Если есть какие-то конкретные вопросы, можешь задавать, постараюсь развернуто ответить.
>>2788220 >Если не секрет, отчего такой выбор? Вроде как самый сырой и медленный XAML фреймворк.
Не соглашусь. Сыроват? Да сыроват. Но количество мощных контролов и консистентная тема под современную винду решают. Композинг удобный, сам xaml опять же сильно прокаченнее WPFного. Ну все это у него от UWP, но так как UWP официально фсе - то получается современный фреймворк под шинду это винурина3, ничего не поделать.
Если есть требования или перспектива кросс платформы, то лучше Avalonia выбрать, они как раз недавно жирный апдейт выкатили. Мы просто когда стартовали новый проект на работке - из требований заказчиков (аэропорты в основном) была только шинда, они все на ней сидят и сидеть будут.
Я просто создал пустой проект Xamarin.Forms и попытался запустить его, ничего в нём не меняя. В чём проблема? В уебных роликах и статьях всё нормально. Использую VS 2022 Enterprise.
>>2788284 Нужно попердолиться, почистить проект, иногда вручную поудаляв build, obj, поискать версию maui на предмет таких issues на гитхабе. Там анон говорит, что котлин выучил – я могу его понять. Хотел поиграться, но такие косяки отталкивают. Да и сам фреймворк какая-то срань – в 2023 году столько бойлерплейта, XAML с его допотопным синтаксисом. После этого реакт и css ощущаются как космолёт. Но это веб
Блин, шаблоны прикольные штуки, но как-то их непривычно юзать. Собственно вопрос: вы часто юзаете такой синтаксис? Или лучше как обычно писать свич и возвращать из метода через return
>>2789095 Свич использую в основном для enum, а там все просто: Я использую сниппет свича, который автоматом расставляет кейсы, дальше я его заполняю и студия предлагает превратить в шаблон.
По сути я ничего не делаю для этого. В чем дилемма? Выглядит компактнее, а большего и не надо.
Мне дали тестовое задание сделать калькулятор webapi с эндпоинтами для всех операций и одним эндпоинтом для того, чтобы вычислить сложное выражение. Они же хотят, чтобы я сделал модели для этих операций, присобачил к ним валидацию и потом их реюзнул в последнем эндпоинте, да?
>>2789705 Непонятно, как будет выглядеть этот калькулятор. Может быть, там надо распарсить строку? Тогда зачем вебапи, неужели просто один аргумент принять?
>>2789742 Ну тип стучишься на эндпоинт /calc/pow даешь ему 2 числа и он тебе высылает ответ, либо говорит, что ты мудак. Все тоже самое с другими простыми операциями, но последняя типа должна их всех объединять, насколько я понимаю. Вот ток я думаю, че они именно хотят, чтобы я им показал.
>>2789747 > объединять Как? Передавать название операции отдельно? > я думаю Зачем думать над мутным условием, если можно и нужно спросить, что они имеют ввиду?
>>2789705 >вычислить сложное выражение. >Они же хотят, Ты уже обосрался с тестовым. Никогда не угадывай того, что хочет заказчик. Если есть непонятка - значит нужно уточнить. Очень часто в тестовых делают такие мутные места, чтобы посмотреть как поведет себя кандидат. Поэтому сначала прорабатываешь, придумываешь два...три возможных варианта (чтобы их предложить, а не тупо спрашивать "я ни понил") и задаешь вопрос тому кто выдал тестовое.
Выскакивает ошибка при поиске на кнтрл+т: "Функция "Перейти к" сейчас недоступна из-за внутренней ошибки." Трассировка стека: https://pastebin.com/UyPHCjQ4
Сам поиск при этом работает отлично, но меня очень выбешивает этот постоянный алерт.
Если не знаете как исправить ошибку, может подскажите как ее спрятать?
>>2789095 Использую, где это удобнее. Всякие бизнес-руллы, где правила в духе: Если последний раз был больше недели назад, но меньше чем 3 недели и при этом является привилегированным пользователем, со знаком зодиака рак - то это, если ... Ну ты понял. Вот в таких случаях - все эти охуенные правила удонбо запихнуть в tuple и достать нужный обработчик, чтобы дергнуть. Еще, если просто у нас в зависимости от типа объекта - надо куда-то передать, то диспечер такой хуйней удобно мутить.
Где это скорее вызывает неудобства - не использую.
Сам синтаксис - как по мне неудачный. Лучше бы отдельное слово намутили типа match, убрали бы эту стрелку ненужную и было бы типа:
var x = some match { > 0 and < 10 : "Ok", default : "Ne Ok" }
Можно в студии как-то пометить папку в обозревателе решений, чтобы она не участвовала в автоматическом создании неймспейса?
Просто в самом обозревателе разные типы не подсвечиваются, как например в InelliSence, и отличить класс от enum невозможно. Хочу для енумсов выделить отельную подпапку — чисто для чистоты иерархии обозревателя.
Пытался перед именем поставить какой нибудь префикс, типа '#Enums', и в принципе студия болше не предлагала переназначить неймспейс при дропе туда файла, но она упорно создает неймспейс, если я создаю в этой папке новый файл — при этом она символ '#' заменяет на '_'.
Так вот, есть ли какой-то волшебный префикс, который говорит студии don't do that.
шарпаны, что сейчас можно использовать самое легковесное если я хочу к консольной программке прикрутить гуй? без завитушек, просто окошки, не кросс платформа. WPF?
>>2792070 Авалонию надо долго сидеть и изучать, она для реально большого и сложного проекта, далеко выходящего за "прикрутить гуй к консольной программке".
Всем привет. Скажите, пожалуйста, почему этот код не вывод в браузер текст? У чела, который показывает как сделать сервак с нуля данный код вывод текст на страницу. Может разница в версиях .net? Сам чел https://www.youtube.com/watch?v=Al2mZg_-XQk
>>2792847 Мне лень открывать говорящие головы но с уверенностью могу сказать что на скрине лажа. Браузеру нужно хттп а не хелло в ответ. Если ты приконектишься на порт условным телннтом или нц то он выведет
>>2792852 Эт я уже вычитал на StackOverflow. Прикол в том, что у него всё работает, а у меня нет. Думаю на той версии, которая у него можно было. А на .NET 7 уже нельзя. Хотя странно, вряд ли за такой короткий промежуток времени могли что-то сильно поменять
>>2792934 ВОТ УВИДИТЕ! Я СДЕЛАЮ СВОЙ ТЦП ФРЕЙМВОРК ДЛЯ СЕРВЕРА, КОТОРЫЙ БУДЕТ УДОБНЫЙ КАК МИНИМУМ ДЛЯ МЕНЯ! Знал бы только как удобно роутить сообщения без всяких извращенств(рефлексия ацтой!). Типа вариант Route<Context,MessageType> - не нравится, делать извращения про Route("{protocol}/{messageType}") - тоже не хотю. Пока что делаю как в первом варианте. Еще хотелось бы несколько протоколов на одном "сервере" обрабатывать, но тута проблема в том, что тогда надо хранить буффер при парсинге, а это лишняя память для вот такого редкого случая. И еще не хочется выносить на уровень событий отправку сообщений. Но без этого - какая-то хуйня выходит(приходится семафорчиком ограничивать отправку) если у нас многопоток и вся хуйня.
>>2792940 >рефлексия ацтой! только для тех кто не умеет ее готовить.
есть хендлеры которые нужно как то роутить. Собственно хендлеры в классах. Если у нас заранее известен набор роутов, то можно хоть интерфейсами, которые классы хендлеры должны реализовать и зарегать себя как обработчики
Иначе же нуно как то указывать что куда мапится. и тут понятно 2 варианта - 1 многочисленные Add(....route info..., handler) в одном месте 2 аттрибуты конечно. Ну и 3 это когда класс хендлер делает пункт 1, но в себе для своих хендлеров.
кто любит декларативщину выбирает аттрибуты. А далее все сделает рефлексия разобрав все это дело и нагенерив в рантайме caller-ы для хендлеров
но даже в варианте 1 рефлексии не избежать если хочется делать биндинг на параметры
Ацтой, потому что выглядит рефлексия вот так как на прикриплейде. И вот я сам писал это полгода назад и не сразу вспомнил как оно работает.
Ну и про сложность. Не сложно. Просто у меня после какого-то времени - возникла мысль, что это становится похоже на магию и правильнее обязать того кто пользуется - реализовывать интерфейс IDispatcher<TContext,TMessage> и заставлять свой диспечер сообщений к серверу цеплять, а там человек как ему удобно так и задиспечеризирует сообщение.
>>2793467 Скорее вопрос в том, какой заголовок отвечает за тот текст, который я хочу отправить. Типо в какой заголовок этот текст засунуть, чтобы потом вытащить на страницу в браузере
В конце 2022 я ушёл от стека CRM Creatio от Террасофт (бэк на дотнете, фронт на JS). Так как прекращал отношения с российской фирмой, так как накапливались сложности с переводами деняк за рубеж (это был мой второй проект из двух параллельных).
Но релокационные аутстафф-галлеры платят мало, Грузия страна дорогая. Я нашёл бывшую российскую компанию, которая успешно продвигает Creatio в Азии и Центральной Америке. У меня отличный опыт и портфолио, так что поставил ценник в пять тысяч чистыми. Это реально решит сейчас все мои проблемы и позволит копить на Европу (ещё осенью квартиру в ДС продам и, при хорошем раскладе, за всякими минусами ипотеки/риэлтора выведу в Грузию тысяч 130).
Тема крутая, финтех и доллары, но как при этом развиваться? На проектах Creatio я даже нормальных юнит-тестов не встречал, не говоря уже про работу с мультипоточностью и всякие фишки поздних версий .Net. И фронт там сейчас неакутальный, ExtJs, а я хочу погрузиться в божественный Ангуляр.
>>2793857 В Восточной Европе больше половины вакансий на .Net это .Net Core + Angular (в разных вариациях, но суть та же). 5к чистыми, ты тут не получишь, но если ты весь из себя синьор-помидор, то может и 6 вытянешь, в среднем около 4. Хочешь больше? Ищи клиента в штатах/Канаде. Собственно я так и сделал, клиент в Канаде за 6 и местный за почасовую ставку, обычно 2-3,5к/месяц. Развиваться норм, если писать на коре, то всё хорошо поддерживается. Если команда норм, то проект будет сиять от новых технологий и 90% покрытия тестами.
На днях у нас в компании решили пересадить всех разрабов на линукс. Сказали что те кто будет работать под виндой и жаловаться на баги вследствие перехода на линукс будут получать пизды. Какие подводные, там же разницы нет где собирать проект? Asp dot net + Blazor
>>2794516 Накатываешь на студию/vscode/райдер нужные плагины. Разрабатываешь на винде, собираешь на винде, деплоишь по SSH на линукс, запускаешь там, цепляешьшся к работающему билду, дебажишь из под винды и в хуй не дуешь.
>>2794677 Не знаю как у него, но сейчас в компаниях, которые имеют дело с гос сектором или разрабатывают для компаний которые работают с гос сектором - опять пошла пьянка, что сертификация винды - усе, пересаживайтесь на какую-нибудь астру или пиздуйте. >>2794516 Ну, прям критично - ничего. Особенно если райдер есть. Но блядь. Насколько же студия - удобнее.
В ру сегменте есть шарп сообщество на ютубе (возможно единственное, слушаю их за новости), так те упоролись и начали пилить видосы по расту, ну собственно восхищаться им (за деньги или сами "осознались", непонятно).
Так вот, они запили видос с лайв-кодингом или местным литкодом (точно не помню). И все это происходит с периодическим "методом тыка". И так забавно смотреть, как, вероятно, серьезные разработчики, тыкаются в синтаксис аля школота и при этом восхищаются этим продуктом.
Как это работает? Чем больше тебя язык ущемляет, загоняет в рамки и заставляет себя чувствовать не комфортно, тем сильнее ты его любишь и считаешь его правильным?
>>2794772 Эту кучку пидорасов нужно выгнать нахуй с канала посвященному дотнету. Пусть валят на свои каналы по расту, раз не хотят пилить конент по дотнету.
>>2794772 > Как это работает? Чем больше тебя язык ущемляет, загоняет в рамки и заставляет себя чувствовать не комфортно, тем сильнее ты его любишь и считаешь его правильным? Та не. Просто раст типа на хайпе. Хотя сам раст - то еще говно ебаное. Вот срсли. Хуй пойми нахуй он нужен. Те области где он типа нужен - на си нормально живут и будут жить дальше без раста.
Вот F# - тема. Как мне грустно, что сколько не пытался в прод запихнуть - никто не хочет. Приходится грустно в стол дома на нем чет делать. А ведь блин. Ну охуенный же язык. И .net никуда не девается. Но нет. F# не будем юзать, хоть ты тресни, и никакие аргументы не работают.
Почему я не могу вызвать событие "PropertyChanged" в ObservableCollection?
Сначала студия ругалась, на это public event PropertyChangedEventHandler PropertyChanged; якобы такое событие уже есть. Но я не могу его вызвать, символ молнии события помечен "звездочкой". Что это?
>>2795071 Чо ты пытаешься сделать лол. Как уже написали, событие может вызвать только его владелец, то есть даже наследник класса не сможет инвокнуть ивент родителя. Потому что - как ты себе это представляешь? Объекты поднимают ивенты согласно внутренней логике когда меняется какой их стейт - тебя нельзя вмешиваться в этот процесс, в этом смысл ивента и в целом паттерна наблюдатель.
>>2795582 Это очень кривая хуйня, никогда так не делай или будешь избит коллегами. Но даже так это все ещё два разных события, просто в откройте ты руками через add и remove подписываешься ещё и на базовый ивент.
Для того чтобы у наследника была возможность поднять ивент - просто оберни вызов в метод.
>>2795671 >Это очень кривая хуйня что удивляет почему так почему при вызове виртуального метода ищется оверрайд метод и он вызывается А вот события сделали через жопу. Зачем вообще слово виртуал если оно таковым не является
>>2795706 речь вообще не про минимал апи соурс генератор должен на что-то опираться для генерации вызовов хедлеров контроллеров и генерации биндеров для них.
самое банальное - навесить аттрибут (собственно они и есть) подход "ты поищи по исходникам вызовы Add нужной сигнатуры у нужных типов и на основе их генерь" даже не знаю возможен ли, но точно нерентабелен.
>>2795710 это все равно упирается в "найди все вызовы MapX в коде, где бы они не были"
А вообще я не делаю особой разницы между рефлексией в рантайме и тем же самым при написании соурс генератора. Разница то просто в виде рантайма - сама софтина работает или билдер. Все равно пиши код вида "найди мне вот это с этими типами/аттрибутами и сгенерь для него код/il"
>>2795715 >Разница то просто в виде рантайма - сама софтина работает или билдер Билд происходит один раз. Разница в производительности и конкретно сколько времени занимает старт. Для веба, который сейчас повсеместно в контейнерах на каких-нибудь подах с хуй да нихуя cpu, это особенно важно. Сюда ещё идёт размер сборки, с рефлексией тримить очень сложно и опасно.
>>2795719 >Билд происходит один раз. как и генерация этого же самого в рантайме. и по сравнению с тем сколько времени жрет EF на свой запуск это ничтожно. Как тот же DI - где его соурсгенераторная версия? че майки ее не делают?
трим понятно, но это ж асп.нет. кто его триммит то.
>>2795722 >и по сравнению с тем сколько времени жрет EF на свой запуск это ничтожно. С пробуждением, для ef'а тоже пилят компайлед моделс. >как и генерация этого же самого в рантайме. Вот это всё накапливается и получается что время до обработки первого запроса в минутах исчисляется, это пиздец. Горизонтальное масштабирование хорошо работает только когда воркеры быстро стартуют
>>2795736 >С пробуждением, для ef'а тоже пилят компайлед моделс. я его не использую. я как увидел время запуска так охренел. оно неприлично огромное. Может для асп.нетов это и допустимо (какая разница сколько оно стартует) - для других проектов нет.
>время до обработки первого запроса в минутах исчисляется, это пиздец и 99.99% этих минут составляет EF )))
>>2795496 >Потому что - как ты себе это представляешь? В бейсике такой проблемы нет. Как я себе это представляю? В наследнике появляются новые свойства. Как они будут уведомлять о своем изменении? Как? Делать перегрузку эвента? Затенять? Переопределять?
я НЕ представляю как может быть иначе. У меня рили горит сука нахуй. Мне нельзя вмешиваться в этот процесс, охуеть. Может и свойства заблокировать? Это же СОБЫТИЕ, оно имеет уведомительный характер. Я глубоко непонятно за каким хером ObservableCollection содержит protected событие PropertyChanged, которым сама не пользуется и другим не дает.
Я уже молчу про то, что компилятор благодаря "прекрасному" синтаксису шарпа не понимает, что происходит вызов события и раздает неуместные советы. Клянусь, вот эти вот "+-" ":" самое гнусное изобретение майкрософт.
Шарписты, я стараюсь написать строчку, которая извлечёт один из элементов массива с конца Console.WriteLine (myArray[^2]); Так вот. На вот это ^2, вижуал студио ругается и говорит, что такая шляпа прокатит только в C# 8. Я так понимаю, что C# 8 не доступен в бесплатной версии с сайта майков, так?
>>2796559 Всё доступно. У тебя в csproj выставляется версия как рантайма так и языка (можно использовать старый рантайм но включить фичи языка которые при компиляции только используются). Смотри что там и меняй. Актуалочка сейчас это net6.0 и net7.0
Лямбды это просто такой сокрашенный синтаксис или у них есть какое-то особое предназначение, которое без лямбд больше нельзя никак реализовать и для которого эти лямбды и придумали?
>>2797355 ну попробуй без них - на каждый чих заводи именованный метод, который нужно где то разместить. Или в классе разместить или прямо тут в методе (шарп это позволяет) - все равно это будет "где то там".
>>2797425 если тебе так сложно. то считай ее сахаром. ничем она от обычного метода не отличается - ведь компилятор услужливо за тебя при компиляции даст ей имя и впишет в класс.
>>2797437 Лол. Я точно также могу тебе расписать чем i += 10 отличается от i = i + 10 а) не нужно второй раз писать i б) знак + находится рядом со знаком = и его не нужно искать где-то в другом месте после имени переменной
И чо, давай тогда += называть какой-нибудь сигмой.
>>2797470 спросили я ответил если чел САМ НЕ ВИДИТ отличий от обычной функции и не может понять зачем в язык ввели лямбды (даже в богомерзкую жаву), и начинает искать скрытый смысл, то я ему и указываю на суть.
каждая фича сахар или нет имеет смысл зачем ее вводили и свое название.
>i += 10 отличается от i = i + 10 >а) не нужно второй раз писать i и да. именно этим оно и отличается. и это его суть. и именно для этого оно и было введено
>давай тогда += называть какой-нибудь сигмой а почему нет. оно также имеет собственное название - addition assignment
Поясните за такой момент. Студия помогает мне инициализировать свойство в конструкторе, при этом свойство это расширенное (допустим string MyProperty), которое задает\берет значение из приватного поля string myProperty.
При этом возникает предупреждение, что поле string myProperty не допускает значение NULL. Для этого я должен сделать вот так
public MyClass(string myProperty) { . . . this.myProperty= myProperty; }
Почему студия упорно предлагает назначить значение публичному свойству, а не приватному полю и кто из нас прав? Если виноват я, то как поступить лучше?
Допустим в свойстве есть какая нидудь логика, и нужно инициализировать значение именно через него, но как сделать по красоте, чтобы студия не ругалась? Без подавления предупреждений.
>>2797498 Вот пикрил. Самое интересное, что если имена не совпадают, то предлагает на выбор назначить полю или свойству.
>>2797515 >private string myProperty = string.Empty; Но это же лишнее действие.
>Или если оно может быть null: Не может т.к. в конструкторе запрашивается. По идее назначив non nullable стринг свойству, поле в принципе никак не может быть null, но студия просто тупорылая как утюг.
>>2797524 ну так ты сеттер сделал. сеттер на то и сеттер что сеттит. Это правильное предложение - щас сеттер пустой, потом нет, а значит разумнее делать через сеттер в общем случае. Ну а если разраб такой "мне виднее" - ну пусть сам и делает
с другой стороны, решарпер предложит инит приватного.
Надеюсь тут есть те, кто недавно смог вкатиться в джуны на аспах. Умоляю, поделитесь историей успеха. Как оформляли резюме и часто ли приходили приглашения?
В своём резюме вкратце описал основные инструменты в виде наброса ключевых слов, с которыми приходилось работать (аспы, мвс и рестапи, постгрес, немного тайпскрипт и ангулар), чутка описал чё вообще хочу (а-ля "интересна сфера бэкенд-разработки, хочу развиваться как специалист эмням пук"), ну и ссылка на гит с парой своих серверных проектов. Сам живу в дс2 и тотально охуеваю с того, что в таком крупном городе вакансий нихуя нет. Вбрасывают штуки две-три за неделю без указания требований к опыту в описании, откликаешься на них, и получаешь тотальный игнор. Уж лучше бы отказали бля, потому что так угнетает жить без каких-либо ответов. Откликаться на то, где прямо в описании пишут требования к опыту, тоже результатов не приносит — сразу же отказывают (ну хоть не игнорят).
Один раз таки дали тестовое и по его результатам пригласили на собес. Спрашивали довольно дефолтную хуйню по типу "принципы ооп", "ссылочные и значимые типы", "как реализовать проверку правильной расстановки скобок", "как работает словарь" и тд. Имхо отвечал довольно норм, хоть и местами с затупами, что даже пригласили на второй этап, где... ебали голову на тему "почему ты поступил на программиста". Ответ что "просто потому что на интерес решил попрогать, зашло смотреть на то, как код, с которым долго ебался, наконец работает как надо, ну и всё заверьте..." их не устроил и позже мне прислали отказ.
Полагаю, проблема в целом в моём резюме, раз за пару месяцев мне ответили с приглашением только одна компания. Так что подскажите, анончики-джуны, как вы сваяли своё резюме так, что оно привлекло хоть какое-то внимание, и какими пет-проектами щеголяли?
>>2796559 1. Проверяешь какие SDK у тебя есть(первый скрин). 8 шарп появился в 3 вроде(уже не помню) 2. Открываешь файл проекта (ConsoleApp.csproj) любым текстовым редактором или студией. 3. Смотришь что в TargetFramework и LangVersion. Если фреймворк - 3 и выше - у тебя все должно работать. 4. Если нет - идешь в гугл и ищешь "DOTNET SDK DOWNLOAD FREE WITHOUT REGISTRATION AND SMS NO VIRUS FOR DEVELOPERS" 5. Переходишь по первым ссылкам, если видишь что-то похожее на третий прикриплейд и скачиваешь 6. Идешь в настройки проекта и устанавливаешь версию фреймворка 6 или 7 в зависимости от той что скачал и версию языка - latest 7. Пользуешься ренджами
>>2798814 Я просто практикуюсь. А то немного надоело что отдел сопровождения ругается, что недостаточно подробно инструкции по развертыванию и эксплуатации пишу
>>2797355 Это не то чтобы синтаксический сахар. Потому что если так рассуждать - все конструкции любого языка - синтаксический сахар. Тебе никто не мешает без циклов, вызовов и прочего писать на голом ассемблере. Просто последовательно:
А все эти циклы и прочее - сахар получается. Все в принципе можно вот так написать.
Ну а конкретно про лямбды. Без них - ты бы писал кучу однотипного кода на каждый чих. В джава, допустим - довольно долго так вот и приходилось жить. Можно ли так жить? Можно. Хорошо ли тратить свое рабочее время на написание однотипного кода, который можно написать лямбдой - я хз.
>>2798851 Блин. Да. Нафиг я выдумал бизнес-задачу, и при этом не реализовал ее решение. Пока вспоминал как там в ассемблере условные джампы делаются - забыл про то что надо день рождения учесть. Лалка просто.
>>2798860 Я знаю((( Но блин. Вот конкретно инструкции и документация. Ну блин. Аааааа. Все ж и так понятно. Положил docker-compose, docker-compose up -d, все. Дальше - методом тыка - разбирайся с программулиной. Преврати это в игру! Не. Не хотим. Хотим чтобы была инструкция че и как сделать, где скачать, какие галки поставить. Ууууу. Уууу!
>>2798871 Так в сопровождении - просто надо уже готовые образы развернуть из своего реестра. А я постарался, что конечные образы 75-80 метров, так что прям страшно быть не должно.
>>2798890 Как минимум - под виндой нужон докер при разработке. Ставить сбоку виртуалку - такое себе. А за дуалбут на рабочем ПК тебе ИБ вломит. Ну и к моему удивлению - куча клиентов имеют WinServer и не хотят с него слазить. А без докера - разворачивать 100500 сервисов та еще боль и для сопровождения и для разраба когда его привлекают, и потом для клиента.
>>2798914 я клиент. у меня винда. я попросил инструкцию по развертыванию софта. А мне "вот тебе докер образ", который непонятно как ставить на винду (давно докер под винду появился а????), да еще этот образ содержит в себе еще одну винду.
>>2799071 ага. это тот который использует hyper-v, включение которого ломает виртуалбокс. уносите.
А размер виндовых имаджей я как то видел. И охренел. Может чего изменилось ведь докерхаб услужливо не показывает размеры, но чет сомневаюсь я. Это ж винда. Она даже тини весит епрст.
>>2740238 (OP) Шарпаны, подскажите можно ли в xUnit сообразить такой тест, который будет проверять используется ли в сборке какой-либо метод или свойство определенного класса? Например я хочу, чтобы в сервисе нигде не использовалось свойство DateTime.Now. И хочу чтобы тест это проверял. Это реально?
Скомпилил я ваш шарп "в один бинарник", мало того что все равно в один бинарь не собрался (там еще какие-то dll рядом положил), так еще моя утилитка весит больше 150мб. Такое себе для каждой утилитки. Это, конечно, звездец рантаймище, нахер оно вообще надо все, когда есть современные кросс-компилируемые языки как го, а теперь уже и раст с нормальным дизайном синтаксиса и еще без ГЦ и рантайма вообще?
>>2799881 ну так пиши на го, какие проблемы ) если у тебя клиентура из тех "низашонипоставимрайнтайм, жаву можна, питон можна, а шарп нееееетьььььь" то можно тебя только пожалеть
можно было бы посоветовать еще триммить, но лучше пожалеть.
>>2799881 Шарп вообще никогда не был предназнчен для написания "утилиток". Сборка в один бинарник нужна исключительно для облегчения развёртывания бэкенда.
>>2799887 ну это не совсем так. те же дотнет-тулз просто тут начинается смешное (особенно от жавистов) - "ой ой нужно еще рантайм ставить", как будто лол рантайм жавы не нужно ставить.
>>2800089 Конкретно это - да, ничего особого не делает. На работе - у меня выводок примерно из 50 микросервисов. Самый дутый(сервис авторизации, с кучей интеграция, OAuth и прочими входами ключем с флешки) - ~28МБ и в нем примено 90к строr кода. Я не понимаю, что там за утилитка такая, что 150МБ тянет за собой. >>2800099 >>2800099 Публиковал этим dotnet publish -c Release -a x86 --os win --self-contained
Просто я чет сначала начал CSV использовать. Пока было мало сущностей связных таблиц - было норм. Но потом - всякие связи там. Для сложных сущностей - надо в нескольких CSV связать. И все такое. Решил XML. Но с XML - чет многовато дублирующего кода будто выходит. А просто сериализовать то что в XML к тому что в БД - тоже не удобно, потому что тогда надо все ID и все это проставить, а хотелось бы чтобы XML руками мог правиться по необходимости.
В общем. Как нормальные люди засеивают базу, когда 50+ таблиц и есть штук 5 таблиц с довольно сложными сущностями?
>>2800234 Так объясни какая твоя цель. Что такое matches? List<string>? Что ты с ними хочешь сделать? Чтобы все были null? То, что ты написал изначально: var elems = items.Select(m => (string)null).ToArray() и есть решение, оно не будет null, это всегда будет string[], потому что: ToArray() - An array that contains the elements from the input sequence.
>>2798496 Что-то тебя даже тут заигнорили. Знакомый вкатился недавно. Откликался долго, вкатился на, кажется, 65к. Он уже думал опыт накрутить, но не пришлось Парень действительно толковый. Он заграницей, откликался на удаленные вакансии в России.
>>2800206 Хз, мне кажется, проще прямо в миграции захардкодить сущности, которые ты хочешь посеять Но я особо этим не занимался, у меня простые случаи. Зато не надо лезть в файлики, смотреть, что же там такое.
>>2799933 Лол, наркомания, а письмо билу не надо еще написать, раз такие портянки приходиться писать? В общем, опять мягкие обвели меня вокруг пальца, как дешевку. Пускай свое интерпретируемое чудо сами жрут.
>>2800206 >есть штук 5 таблиц с довольно сложными сущностями? Сидируй прямо из excel-я. Сделай xlsx файлик (или еще какой открытого формата), распиши там все данные в связанных таблицах и дергай данные при сборке контекста прямо оттуда.
>>2800328 >Хз, мне кажется, проще прямо в миграции захардкодить сущности, которые ты хочешь посеять Хуевая придумка. Гораздо проще в табличке вроде csv посмотреть, чем лопатить кучу миграции где все будет выглядеть как жопа.
>>2798496 >В своём резюме вкратце описал основные инструменты в виде наброса ключевых слов, с которыми приходилось работать (аспы, мвс и рестапи, постгрес, немного тайпскрипт и ангулар), Ко всему этому нужно описание опыта работы. Где работал или в каких проектах участвовал, какой срок, в какой роли, какие задачи выполнял, какие технологии/инструменты использовал. И так для каждого проекта/места работы. >>2798496 >чутка описал чё вообще хочу (а-ля "интересна сфера бэкенд-разработки, хочу развиваться как специалист эмням пук"), Всем похуй чего ты хочешь. >>2798496 >ну и ссылка на гит с парой своих серверных проектов. Чтобы кто-то заглянул в твой гитхаб, резюме должно сначала пройти первичный фильтр в виде HR. А потом еще заинтересовать того кто будет проводить собес, тогда он может быть и заглянет туда. Это если он твое резюме не перед самым собесом получит и вообще успеет его хотя бы просто проглядеть.
>>2800358 >а в расте почему портянки? чем меньше в языке сахара, гибкости и "сделаю за тебя", а также готовых либотек удобных, тем больше все ручками. Тот же код из питона при переносе на шарп будет более громоздкий.
>>2800544 а я и говорю - разрабы студии РУКОЖОПЫ. как и разрабы шарпа.
>>2800575 Сахар нужен, чтобы скрыть бойлерплейт. Бойлерплейт в расте скрывается через код ген макросов. Скажем одной строчкой можно превратить, скажем main в асинхронную main (и все это компильтайм), в других языках приходится городить новый синтаксис.
Сахар это сложность, вот добавили тебе первичный конструктор, но чтобы эта шляпа работала, тонну ограничений внесли. Так что нашел чем гордиться.
>>2800575 студия тут не причём так показываются ссылочные типы-не дженерики ты можешь написать string? str = ""; и тебе точно так же подсветит что он nullable, хотя очевидно что в данный момент нет, но этой переменной ты потом можешь присвоить null, а к string без ! уже нет
>>2800747 > конкретному соединению/пользователю Никак. Я для этого оч оч сложный код писал, который внутри себя распределял коннекты и строил сложые дикшинари
>>2800609 понял. студия считает любую переменную нуллабле ведь туда можно присвоить нулл А val в шарпе нет
Привык я, что в котлине сразу все нормально сделали и var/val и нулабилити (в том числе lateinit - где он там в шарпе? чем закончилось? просто ! ну ну)
>>2800741 Если тебя не смущает, что аналоги формсов потяжее в плане производительности, то всегда есть смысл использовать что то другое вместо формсов, если твое приложение не пара кнопок.
Впрочем даже если так то зачем вообще помнить формсы
>>2800949 ну это если писать говнокод. я когда на формсах писал, то использовал и их убогие биндинг и MVP юзал щас там еще какие то биндинги аля MVVM подвезли, но это уже пусть любители простоты разбираются. А мне и в WPF хорошо.
Сам подход "что-то случилось и я бегаю кодирую что обновлять в контролах" (говнокод или даже MVP в формсах) проигрывает подходу "есть стейт. за стейтом следят кому нужно и обновляются" (MVVM, MVI)
А уже вытягивание из контрола "мне нужно значение вон того элемента" или "обновить вооон тот элемент в дереве/списке" привьет любовь к биндингам быстро.
но вообще мне больше всего нравится подход jetpack compose/swift combine/flutter. Еще наверное maui че то там обещал, но результатов не знаю. свифт, дарт, шарп БЕДНЫ на выразительные средства и потому любой контрол суть класса. а вот котлин - чистая выразительная мощь и потому там все есть функция.
По возможностям "хочу сделать так" WPF не слабее. Но сильно сильно портяночнее и "собери проект, чтобы увидеть дизайнер" (задрало)
И если хочется раздробить большое описание, то не нужно делать кучу файлов с разметкой как в том же WPF, где ты просто вынужден делать либо "одна большая портянка" либо "куча файлов на которую ты эту портянку раздробил"
>>2800741 С нуля - WPF сложнее. Про сторонние решения - пиздеж. Куча штук есть которые ТОЛЬКО для форм. А ВПФ - по остаточному принципу. У ВПФ проблемы со шрифтами. Из плюсов ВПФ - он заставляет тебя не говнокодить. Но не говнокодить - ты можешь и на формах. Тот же MVVM вполне себе можно с формами юзать при желании, никто не запрещает.
С формами как раз минус в том, что он слишком много позволяет тебе. В результате многие разрабы - решают там срезать угол, тут срезать, получают какаху, и ругают формы.
Но. Я не то чтобы ругаю ВПФ. ВПФ, особенно если в команде больше 1 человека - позволяет упростить жизнь, т.к. уже сказал - он заставляет более-менее разделять ответственность, в результате - один чел может заниматься чисто ДИЗАЙНОМ, второй логикой и всем этим вот.
>>2800747 Каждому соединению создаешь группу и вещаешь в эту группу. Это наиболее простое решение и именно так майки сами в своих примерах по работе с SignalR показывают что надо делать.
>>2801174 Перекатывался из плюсов. Заняло буквально 2 вечера чтобы разобраться с дотнетом, 2 собеса чтобы получить первый оффер. ЗП на старте - просела на 40% примерно. Но через полгода - уже нагнал.
>>2801356 >Ну и не заниматься ручным рисованием А если очень надо, то можно? Давненько было, но помню сходу у меня не вышло порисовать и я доделал лабу на формах
>>2801548 Выглядит что чел в попытках потешить чсв просто всё заруинил а теперь пытается судорожно всех убедить что итс прэнк бро, сорсес ис эвэйлабл он гитхубе энд айм схаре онли хэш оф юр емейле
>>2801623 А ему и так пизда. Большинство и так уже спрыгнуло с его библиотеки. Если кто-то и донатил, то теперь точно не будет. Ну и жирная метка "но хаир" в резюме. "Вы автор библиотеки moq? А так это вы тот мудак из-за которого мы потратили миллионы баксов из-за того, что пришлось по быстрому выпиливать ваше говно из наших проектов""
С методом Task<Data> ReadData(CancellationToken ct);
Тот кто его имплементировал - сделал все синхронно.
В результате - из-за ошибки имплементации - иногда "зависает" выполнение метода ReadData, если просто устройство в процессе чтения - отключить.
Собственно. Проблема в том, что я не могу таким макаром отменить чтение получается. Там даже без зависаний - CancellationToken никак не обрабатывается.
Раньше бы я просто чтение выполнял в отдельных потоках и в такой вот ситуации сделал Thread.Abort()
А как делать теперь? Я не понимаю. Просто висит зависший кусок кода. Висит пока не рестартанешь приложение. Попытки обернуть синхронную задачу в асинхронную и уже ее отменить - ни к чему не приводят. Попытки извращаться с Task.WhenAny(reader.ReadData, Task.Delay(timout)) - тоже нихуя не делают пока не завершится чтение.
Я в тупике. А разраб который имплементировал это все дело - в упор не хочет нормально сделать, придумывая миллион хуйни и отшучиваясь, а уже месяц сделать не может, ну а забрать и сделать нормально - мне не разрешают, говорят что его задача - пусть он и делает, а у тебя есть свои.
>>2801704 >Я в тупике. А разраб который имплементировал это все дело - в упор не хочет нормально сделать, придумывая миллион хуйни и отшучиваясь, а уже месяц сделать не может, ну а забрать и сделать нормально - мне не разрешают, говорят что его задача - пусть он и делает, а у тебя есть свои. Значит проблема не техническая, а организационная. Создаешь подзадачу на этого чела по исправлению косяка, помечаешь её как блокер своей и занимаешься чем-нибудь другим.
>>2801704 ничего ты не сделаешь. Если ты не можешь по таймауту закрыть сокет или что то такое, что сразу прекратит работу этого зависшего кода и выдаст исключение, то труба.
>>2740238 (OP) Кто-нибуть юзает шифрование данных в бд в своем проекте? Сейчас использую шифрование на уровне приложения, то есть любая операция с данными с базы/в базу у меня идет encrypt/decrypt. Вопрос можно ли это сделать как-то нативно на уровне самого mssql и настроить ef? Какие подводные? Сейчас читаю про TDE, но до ef'а еще не дошел.
>>2801807 Можно, но не нужно. Если тебе понадобится потом БД сменить (а MSSQL тебе точно придется сменить) или поменять метод шифрования, то ты огребешь охуенных проблем и сам себя проклянешь.
Я перефразирую вопрос: Что по вашему лучше использовать: шифрование на уровне базы или приложения? На уровне приложения как по мне более универсальный способ, т.к. можно без задней мысли подменять разные субд. И еще - какой вариант лучше по производительности или особой разницы нету?
>>2801856 >Хорошо, спасибо, я в принципе так и подумал, буду просто хуярить на уровне маппера. >А почему мне нужно будет сменить mssql? Примерно по той же причине по которой все когда-то спрыгнули с Oracle, ну и плюс современные обстоятельства.
>>2801853 >Что по вашему лучше использовать: шифрование на уровне базы или приложения? На уровне приложения, т.к. во первых шифрование - это по сути перемалывание чисел и не является нормальной задачей для БД. Во вторых тогда между приложением и БД данные у тебя будут ходить в открытом виде. И какой тогда толк от твоего шифрования.
>>2801704 Какой ответ ты ждёшь с максимально абстрактным IДывайсРыдэр.ВычитатьХуету? У тебя должен быть ивент на отключение девайса, в нём ты можешь закенселить токен, например.
Task<Data> ReadData(CancellationToken cancellationToken) { var cts = CancellationTokenSource.CreateLinkedTokenSource(cancellationToken);
дальше в методе используешь cts.Token, если всё синхронное, то придется проверять IsCancellationRequested или на каждый пук вызывать cts.Token.ThrowIfCancellationRequested
>>2802314 нормальный у него вопрос. А вот твой ответ капитанский - юзай cancellationToken, люк
В этом то и проблема что код не юзает никакой из паттернов отмены и не отваливается по таймауту. И ранее такое можно было хотя бы прибить через Abort, а теперь ничего - плоди процессы.
>>2802444 Вот и я о том же. Пол дня на работе спрашивал у всех коллег, мож я тупой и чет пропустил и есть какой-то механизм отмены. Все чешут репу и про токены говорят, так блядь, чел игрорит их, че эти токены дадут-то? А чел тот - в очередной раз - гнет лыбу, что сейчас-то он сделает нормально. Месяц уже гнет. Все считай встало, потому что ЗАВИСАЕТ. А вопросы - ко мне, типа ты же его обращаешься к его коду - отмени))). Офигеть. Думаю положу выполнение вот этих вот задач в отдельное приложение и из основного - буду убивать процессы если "зависло". Другого пути лично я не вижу сейчас(((
>>2802496 > есть какой-то механизм отмены Есть какой-то другой механизм отмены.
Вообще. Я не понимаю, как в 2023 году - сеньер может просто забивать на таски и асинхронщину. Вот что сложного-то?
Еще конечно решение - не давать ему самому создавать сокеты, а поменять нафиг апи, чтобы я сверху мог ебнуть сокет по таймауту. Просто в остальных случаях люди нормально сделали, а тут подключился СЕНЬЕР и просто лыбу гнет, и не делает(((
>>2802499 Всё бывает. Вызов com, нативных либ написанные без знания о всяких ваших там токенов. Может зависнуть или работать когда уже не нужно. Серьезная проблема и решение костыли если возможны.
>>2801130 Не путай WPF и Авалонию. Это у авлонии проблемы сол шрифтами, у майкросфтовского ВПФ все норм и есть вагон и тележка решений (причем я считаю это уступками для идиотов).
>>2803474 каких идиотов. что для тебя есть идиотизм
вот у меня монитор. фулхд+ и берем аппаратное ускорение и виндовое сглаживание. впф - мыло (лечится), гугл хром - мыло (на фф все норм), студия норм. электроны приложения - мыло, авалония - мыло (лечится только если принять их гигантские шрифты), skia - мыло (в общем то на нем и есть авалония, так что это ее косяк)
в впф лечится. и в электроне лечится - просто всем похер.
>>2803339 >У НАС МОДНЯВАЯ АСИНХРОНЩИНА НО УБЛЮДОК ИГНОРИТ ТОКЕН >ну ок вернись с небес на землю запусти его каловый метод в отдельном треде и абортни его >ты че переходи на датнет 5 вот к чему ты это высрал? у нас в тиме уже семёрка и будет восьмой сразу по релизу, какое отношение это имеет к обсуждаемому сабжу и тому как иметь дело с многопотоком - я хуй знает, но тебе должно быть стыдно за свой уровень "компетентности"
>>2804365 >вот к чему ты это высрал? у нас в тиме уже семёрка и будет восьмой сразу по релизу >свой уровень "компетентности" О, мистер компетентный сеньер О, великий гуру многопоточного программирования Научите меня, неуча, как абортировать треды в дотнет 5+ И я посыплю голову пеплом и буду молиться на величайшего из величайших.
>>2803790 >что для тебя есть идиотизм Шрифт имеет свою сетку, которая при несовпадении с сеткой пикселей дисплея неизбежно ведет к говну. И чем мельче кегль, тем больше сложностей. Поэтому существуют специалисты-шрифтовики, которые этим занимаются и чуть ли не создают шрифт конкретно под задачу, чтобы добиться наилучших результатов при определенном кегле, несмотря на тот факт, что шрифт зачастую векторный и способен в масштабирование.
Это вообще касается любой векторной фигуры, которая имеет свои полюсы только при достаточной плотности пикселей, иначе проще работать с растром. Чудес не бывает.
Все методы от майкрософт в WPF это по сути костыли, которые позволяют васянам натянуть сову на глобус. Там так искажается шрифт, что одни (хром) возвращаются к мылу, другие (фф) соглашаются на покосоебленные детали.
Но есть вот прям конченые имбецилы, которые считают, что дав 5% к высоте шрифта, умещающегося в 10 пикселей, смогут каким-то там ВОЛШЕБСТВОМ добиться красивого результата. Стоит ли имаджинировать их ебала?
Так что есть три выхода у честных ребят: взять стильный модный молодежный монитор с большей плотностью пикселей и не видеть мыла, либо не мельчить со шрифтами, либо рисовать свой собственный шрифт под конкретный кегль.
Все остальное, типа привязок к пикселям — подспорье и небольшой тюнинг. Я когда рисовал мелкие векторные иконки, то все равно ориентировался на конкретный размер иконки и рисовал по сетке — только тогда получился чистенький и красивый результат. Всякие привязки делали круглые формы яйцеобразными, либо неоднородными по четкости.
А можно как-то вытащить файл из нюгет-пакета? Я вывел тему приложения со всеми стилями в отдельный проект, хочу его сделать универсальным, как библиотека. Но есть словарь ресурсов xaml, в котором определены базовые цвета с ключами (по типу пикрил).
Идея состоит в том, чтобы копировать это xaml документ и править цвета под конкретное приложение. А как это делать с нюгетами? Может есть возможность прикреплять сопутствующий файл?
>>2804661 Отпиздил бы тебя за такой нейминг. > А как это делать с нюгетами? Может есть возможность прикреплять сопутствующий файл? Просто переопределяешь ключи, они будут скрывать ключи из нюгет пакета.
>>2804638 > взять стильный модный молодежный монитор с большей плотностью пикселей и не видеть мыла, либо не мельчить со шрифтами, либо рисовать свой собственный шрифт под конкретный кегль. вот только заставить мир покупать мониторы невозможно и глупо. не мельчить - ну разве что в метроподобных и всякое материалдизайно приложениях такое можно. вот в GDI получается мельчить и все норм. свой шрифт вообще не нужен если не лепим всякие аляповатые красивости (нам ехать, а не шашечки)
в итоге "кривое" сглаживание суть наименьшее зло, ведь позволяет сделать шрифты приближенные к GDI, и только особо придирчивые знатоки узреют проблему. А таких 3.5 человека на галактику. А вот мыло видно даже домохозяйка, которая и слово шрифт то не знает.
И еще можно использовать 4й хак - в зависимости от DPI выбирать рендер шрифтов тем самым сидя на 2х стульях (без пик и других торчащих предметов)
>>2804663 >Отпиздил бы тебя за такой нейминг. Или ты про .Border6 ... 8 и т.д.?
Я еще не определился как лучше. Суть в том, что создается очень большой список из брашей, чуть ли не около сотни, но у всех них есть пересекающиеся цвета. Вот я хочу собрать все в одну кучу, так называемых базовых цветов. К примеру Button.Border и TextBox.Border ссылаются на один базовый цвет Border. Но что-то может иметь небольшой оттенок, поэтому базовых цветов Border может быть несколько.
Как это адекватно назвать — хз. Никаких правил или договренностей на этот счет я не нашел. Называть по оттенкам Border.Dark Border.Medium Border.Light вроде как логичнее, но в зависимости от темы, Dark может стать Light и наоборот. А еще нужно, чтобы очередность именования подразумевала вставку новых оттенков.
Пока что у меня так: .Border2 .Border4 .Border6 с резервом под оттенки. Не знаю пока как лучше поступить.
>>2804786 Называть нужно так, чтобы было понятно, где и для чего используется тот или иной ресурс, например - EditPageMagicButtonTooltipHeaderTextBlockSolidColorBrush Либо чтобы сделать названия короче можно разделить словари ресурсов по страницам.
>>2804790 >Называть нужно так, чтобы было понятно, где и для чего используется тот или иной ресурс Так он получается динамическим по своему предназначению, но статическим по ключу.
>Либо чтобы сделать названия короче можно разделить словари ресурсов по страницам. Это так и сделано. У меня отдельный словарь потом все это смешивает.
>>2804664 >только особо придирчивые знатоки узреют проблему. А таких 3.5 человека на галактику Это как аудиофилы, которым нужны провода из волос девственницы, чтобы убирать косяки звука, которые 98% населения никогда не услышит.
>>2805352 В итоге у него просто исчерпается пул или будет миллион спящих потоков и приложение начнет просто тормозить
Хотя даже до этого не дойдет - ведь если девайс завис, то нужно обращаться к нему снова. Начнешь новый сеанс - бац, старый ожил и спамит своими данными в девайс. И как с этим жить?.
>>2806336 а почему IReadOnlyList появились когда появились, и как костыль? А почему фрозен коллекции только сейчас? А почему нуллабилити появился когда появился и снова как костыль? А почему FolderSelect диалог появился в WPF только вот щас (и то не знаю что в итоге), когда WPF уже мертвым нарекли сами мс? А почему годами висит предложение "ну сделайте вы возможность задать ConfigureAwait(false) на уровне сборки"?
>>2806383 он имеет весь контракт IReadOnlyList , а не реализует он просто потому что про эту очевидную деталь вспомнили не на этапе проектирования языка, а аж потом и не стали ломать бинарную совместимость и получилась хрень.
Стоит ли идти тим лидом (за хорошие деньги)? Не потеряю ли я хард скиллы, если буду работать тим лидом на проекте, в основе которого легаси (фронт ну точно легаси)?
>>2806930 Сходи, потусуйся пол года и если что уйди в другое место или прямо в это же на другую должность. Лично я ебал в рот управлять людьми. Как бы грустно не звучало но я хороший исполнитель и паршивый руководитель
Вот я часто слышу, что наследование - бяка. Но допустим. У меня есть класс: СерверУстройств, СерверПользователей. Все отличие в них - это парсер которым парсятся байтики и эндпоинты к которым надо отправить сообщение. Так почему мне бы не сделать БазированныйСервер. Который будет в себе содержать всю логику которая общая. И при этом, вместо того чтобы возиться с женериками и конфигурированием DI - не описать в СервереУстройств и СервереПользователей - специфичные парсеры и эндпоинты. Что будет в этом плохого?
>>2807588 Почему бы не сделать композицию из функций, где отличаться будет только функция парсера?
Мне не нравится наследование, потому что есть любители накрутить иерархию, а потом ебись, прыгая из одного файла в другой. Хочешь потом поменять что-то, начинается ебка с наследниками. Но конкретно твой пример чем-то напоминает класс контроллера из аспнет, и, возможно, будет работать
DI – удобная штука. Можно сделать экстеншены и конфигурировать будет удобно
Server<TContext, TParser, TMessage, TDispatcher> where TParser<TContext, TMessage>, IParser<TContext, TMessage> where TDispatcher<TContext, TMessage>, IParser<TContext, TMessage>
А я этого не хочу.
Дополнительно - я не хочу чтобы мне приходилось каждый раз в случае если я что-то там добавляю - бегать и регистрировать в отдельный файл все эти зависимости.
>>2807612 >DI – удобная штука. Можно сделать экстеншены и конфигурировать будет удобно Удобная. Но в ряде случаев - не нужная.
>>2807909 тогда тебе правильно подсказали - vim с райдер или студией ты будешь регулярно "да епрст че оно все красное, че оно не билдится, что за msbuild ошибка которая ни на что не влияет но постоянно висит в уведомлениях студии, да блин че ты на точках останова виснешь и появляется мессаджбок что оно что то там резолвит. чего оно тормозит то так. чего оно не обновляется без впн, что за оом при билде у меня 100500 памяти, а оно ж вроде 64битное стало и даже если оом почему его нет при повторном билде, почему дебаг такой ущербный (ну да в вим полная жопа с ним, но то ж вим, а это студия - как бы главная IDE), что за тупой навигатор по коду в 23 году блин и т.д."
с vim у тебя будет "да блин как неудобно", но тут же "так это vim, а чего я ждал" и сразу спокойствие от осознания. Со студиями же жопа будет гореть ибо такого осознания не будет. Нет оправдания ущербности студиям и райдерам.
Залез в теорию по шарпу и увидел создания стека таким образом Stack randomnumber... , это че серьезно так на шарпе создается стек и другие базы?
Я просто анон, который вкатылся в плюсы и мучаюсь от этого, ибо документация для iq 300, нужно следить за памятью, а иначе идешь нахуй, да да знаю что можно создать стек на плюсах также но с помощью stl.
Пиздец, если это правда и так вы пишите стек и другие, то я в ахуе нужно было на шарп вкатываться, а не в эту ебанную головоломку
>>2808263 Вроде как обфусцирована, из того что я вижу через dotPeek, в классе Licence у ребят куча полей просто не отображается (типа названия) нет. Вот я и хочу понять каким образом там можно эту блядскую проверку на лицензию убрать, потому что в стоке она при работе с файлом накладывает туда вотермарку блэд
>>2808793 Потому что уже 500+ постов как тред в бамплимите, умник. А у меня нет картинки с аниметянками, чтобы перекатить уехал в отпуск с новтбуком, на ноутбуке только браузер, докер и студия есть. Ну а без аниметянок я перекатывать не хочу.
>>2808614 Ну у меня вопросов пока не возникало. Что писать? От шарпа я не ушел.
Вот давича решил воспользоваться сервисами яндекс клауда, а точнее сервисами машинного обучения: переводом, озвучкой (gpt-чат пока только для избранных) — хотел сделать себе аналог переводчика видево яндекс браузера, но для своих, локальных видео.
Какая же эта залупа дорогая получилась, пиздец просто. Если взять условный видеокурс на ~ миллион символов, то его перевод и переозвучка обойдется в 1500 рублей. За такие деньги можно и от человеческих переводчиков получить человеческую озвучку на сервисах по переводу уроков. При этом яндекс браузер переводит контент килотоннами бесплатно.
В общем, эксперимент не удался. Правда я тупо отправлял джейсон-реквесты, а там есть еще технология gRPC, которую мой моск не осилил, а там стоимость рассчитывается для gRPC и Rest по разному.
>>2809363 выглядит как просто надстройка над платным сервисом. С чего ей быть рентабельной.
>>2808614 ну так это не SO. Спрашивать тут нечего. Отчеты разве что писать ну вот я вчера взял linq2db, а там запросы такого вида db.Product.Set(p => p.Discontinued, true).Update(); А у меня только строки вида "Discontinued" и как вызвать Set? И чтобы быстрее банального Delegate.Invoke Пришлось расчехлять дикий уровень рефлексии (Set - экстеншен метод с кучей дженерик перегрузок) и юзать Expression-кодоген.
Ну я сделал в итоге. Вот я молодец. Только кому оно надо?!!
Как добавить логгирование в библиотеку? Пока думаю над созданием статического класса, у него будет интернал метод для вызова события, и собственно событие, на которое при желании сможет подписаться потребитель либы. Какие подводные?
>>2740238 (OP) Хотелось бы узнать есть какие то сервисы по проверке чистоты/читабельности того говнокода что ты написал ? Сам только пытаюсь учить шарпы
public int Width { get => width; set => width = value; } public int Height { get => height; set => height = value; } public int RacketXPosition { get => racketXPosition; set => racketXPosition = value; } public Board Board { get => board; set => board = value; } public Racket Player { get => player; set => player = value; } public BotRacket CPU1 { get => CPU; set => CPU = value; } public Ball Ball { get => ball; set => ball = value; } public Score Score { get => score; set => score = value; } public ConsoleKeyInfo KeyInfo { get => keyInfo; set => keyInfo = value; } public ConsoleKey ConsoleKey { get => consoleKey; set => consoleKey = value; }
public Pong()//конструктор по умолчанию { Width = 70;//x (дефолт:70) Height = 25;//y (дефолт:25) RacketXPosition = 4;//(дефолт:4) Board = new Board(Height, Width); Ball = new Ball(Width, Height); Score = new Score(); }
public void Input() //управление равекткой с клавиатуры { if (Console.KeyAvailable) { KeyInfo = Console.ReadKey(true); ConsoleKey = KeyInfo.Key; } switch (ConsoleKey) { case ConsoleKey.W: Player.Up(); break;
case ConsoleKey.UpArrow: Player.Up(); break;
case ConsoleKey.S: Player.Down(); break;
case ConsoleKey.DownArrow: Player.Down(); break;
} ConsoleKey = ConsoleKey.Spacebar;//на случай если кому то хочется статичную ракетку по умолчанию }
public void Setup()//задание начальных параметров для игры { Player = new Racket(RacketXPosition, Height);//дефолт (x=4) //CPU= new BotRacket(width - racketXPosition, height);//дефолт (x=Width - 4) CPU1 = new BotRacket(Width - RacketXPosition, Height);//дефолт (x=Width - 4) KeyInfo = new ConsoleKeyInfo(); ConsoleKey = new ConsoleKey();
Console.Clear();
Board.Write(); Player.Write(); CPU1.Write(); Ball = new Ball(); Ball.Write(); Score.PrintScore();
}
public void Run()//процесс игры { while (true) { Setup(); while (Ball.X >= RacketXPosition && Ball.X <= Width - RacketXPosition)///3 и 67 нраницы(стоит создать поля под них???) { Input(); Ball.Move(Player, CPU1); CPU1.BotMove(Ball); Thread.Sleep(50); } if (Ball.X < RacketXPosition) Score.player2++; if (Ball.X > Width - RacketXPosition) Score.player1++; } } }
public class Score { public int player1 { get; set; }// счёт для каждого игрока public int player2 { get; set; } public Score() { player1 = 0; player2 = 0; } public void PrintScore()//вывод счёта { Console.SetCursorPosition(0, 26); Console.WriteLine("first player : second player"); Console.WriteLine(player1 + " : " + player2); } }
public class Ball { public int X { get; set; }//координаты мяча public int Y { get; set; } public int xAngle { get; set; }//смещение в каждой из плоскостей за один кадр public int yAngle { get; set; } public Ball() { Random rnd = new Random(); X += rnd.Next(30, 40); Y += rnd.Next(9, 16); xAngle = 1; yAngle = 1; } public Ball(int w, int h) { Random rnd = new Random(); X += rnd.Next(w / 2 - 5, w / 2 + 5); Y += rnd.Next(h / 2 - 3, h / 2 - +3); xAngle = 1; yAngle = 1; }
public void Write() { Console.SetCursorPosition(X, Y); Console.ForegroundColor = ConsoleColor.DarkYellow; Console.Write(""); } public void Move(Racket r1, Racket r2)//логика раброты мяча тут { Console.SetCursorPosition(X, Y); Console.Write("\0");//стираем предыдущую позицию
X += xAngle; Y += yAngle;//перемещаем мяч
if (Y < 2 || Y > 22)//проверка на удар об горизонтальную стену { yAngle = -1;//меняем направление мяча }
if (X < 3 || X > 67)//проверка на удар об вертикальную стену { xAngle = -1;//меняем направление мяча } //проверка на удар по ракетке if (((X == 4) && ((Y >= (r1.Y - (r1.HalfRacket))) && (Y <= (r1.Y + (r1.HalfRacket))))) || ((X == 66) && ((Y >= (r2.Y - (r2.HalfRacket))) && (Y <= (r2.Y + (r2.HalfRacket)))))) { if (Y == r1.Y || Y == r2.Y) { xAngle = -2; } else { xAngle = -1; yAngle = -1; } } Write();//отрисовываем мяч по новым координатам } }
public class Racket { public int X { get; set; }//координаты ракетки public int Y { get; set; } public int racketHeight { get; set; }//высота всей ракетки
public int HalfRacket { get; set; }//высота половины ракетки
public Racket() { X = 66; Y = 12; racketHeight = 25 / 4; HalfRacket = racketHeight / 2; }
public Racket(int x, int Height) { X = x; Y = Height / 2; racketHeight = Height / 4; HalfRacket = racketHeight / 2; }
public void Write() //отрисовка ракетки { for (int i = Y - (HalfRacket); i < Y + (HalfRacket); i++) { Console.SetCursorPosition(X, i); Console.ForegroundColor = ConsoleColor.DarkGreen; Console.Write("|"); } }
public void Up()//ракетка перемещается вверх { if (Y - 1 - HalfRacket > 0) { Console.SetCursorPosition(X, Y - 1 + HalfRacket); Console.Write("\0");//стираем предыдущую позицию Y--; Write();//отрисовываем текующую } }
public void Down()//ракетка перемещается вниз { if (Y + 1 + HalfRacket < racketHeight * 4 + 1) { Console.SetCursorPosition(X, Y - HalfRacket); Console.Write("\0");//стираем предыдущую позицию Y++; Write(); } } }
public class BotRacket : Racket//ракетка управляемая компьютером { public BotRacket() { X = 66; Y = 12 / 2; racketHeight = 12 / 4; HalfRacket = racketHeight / 2; } public BotRacket(int x, int Height) { X = x; Y = Height / 2; racketHeight = Height / 4; HalfRacket = racketHeight / 2;
} public void BotMove(Ball ball)//логика работы бота { if (ball.X > 35) { if (ball.Y > Y) { Down(); } if (ball.Y < Y) { Up(); } } } }
public class Board { public int width { set; get; } public int height { set; get; }
public Board() { width = 70;//x=70 height = 25;//y=25 } public Board(int h, int w) { height = h; width = w; } public void Write() { { //отрисовка границ поля в 2 цикла for (int x = 0; x < width; x++) { Console.SetCursorPosition(x, 0); Console.BackgroundColor = ConsoleColor.Red; Console.Write("+"); Console.SetCursorPosition(x, height - 1); Console.BackgroundColor = ConsoleColor.Blue; Console.Write("/"); }
for (int y = 0; y < height; y++) { Console.SetCursorPosition(0, y); Console.BackgroundColor = ConsoleColor.Red; Console.Write("+"); Console.SetCursorPosition(width - 1, y); Console.BackgroundColor = ConsoleColor.Blue; Console.Write("/"); }
Ваш код в целом хорошо структурирован, но есть несколько областей, где можно сделать улучшения:
1. Сокращение дублирования кода: - Методы `Up()` и `Down()` в классе `Racket` дублируются. Можно создать один общий метод с параметром направления. - Код для отслеживания коллизий мяча с ракеткой в методе `Move()` класса `Ball` также дублируется. Можно оптимизировать его.
2. Использование констант: - Желательно избегать "магических чисел". Это числа, которые присутствуют в вашем коде, но их значение и назначение не очевидны. Вместо этого создавайте именованные константы, чтобы улучшить читаемость кода.
3. Параметры по умолчанию: - Вместо создания нескольких конструкторов с различными параметрами, вы можете использовать параметры по умолчанию.
4. Работа с свойствами: - В C# свойства обычно используются для доступа к данным и их установки. Если вы предоставляете публичные свойства для каждого члена данных, это делает ваш код менее инкапсулированным. Некоторые из этих свойств, вероятно, могут быть скрытыми или защищёнными.
5. Оптимизация работы с консолью: - Постоянное переключение курсора и использование `Console.Write` может снизить производительность. Для оптимизации вы можете создать двумерный массив символов для представления игровой доски и обновлять его содержимое вместо прямой записи в консоль.
6. Рефакторинг классов: - Ваша структура классов немного запутанная. Класс `Pong` делает слишком много разных вещей: отслеживает состояние игры, обрабатывает ввод, управляет отображением и так далее. Рассмотрите возможность разделения этих функций на разные классы или методы.
7. Безопасность потоков: - Вы используете `Thread.Sleep` для управления скоростью игры. Это работает, но есть более современные и гибкие подходы для управления частотой кадров, такие как использование таймеров.
8. Комментарии: - Хороший код должен быть самодокументируемым. Вместо комментирования каждой строки или метода, дайте переменным и методам понятные имена. Комментируйте только те части кода, которые могут вызвать затруднения при понимании.
9. Инициализация переменных: - Инициализируйте переменные там, где это возможно. Например, вместо того чтобы инициализировать `xAngle` и `yAngle` в конструкторе класса `Ball`, можно сделать это при их объявлении.
10. Определение направления движения мяча: - Вместо использования отдельных переменных `xAngle` и `yAngle` рассмотрите создание перечисления или класса `Direction`, который определит направление движения мяча.
В целом, ваш код хорошо организован и легко читаем. Однако рефакторинг в соответствии с вышеуказанными рекомендациями поможет сделать его еще лучше.
>>2812467 > В целом, ваш код хорошо организован и легко читаем. Однако рефакторинг в соответствии с вышеуказанными рекомендациями поможет сделать его еще лучше. @ > Ты написал говно но мне не разрешают открыто хуесосить юзеров. Так что внемли тому что выше и не позорься в следующий раз