Это копия, сохраненная 7 сентября 2023 года.
Скачать тред: только с превью, с превью и прикрепленными файлами.
Второй вариант может долго скачиваться. Файлы будут только в живых или недавно утонувших тредах. Подробнее
Если вам полезен архив М.Двача, пожертвуйте на оплату сервера.
1. Ресурсы:
— https://dotnet.microsoft.com/learn
— https://ru.stackoverflow.com/a/416585/422180
— https://metanit.com
— https://professorweb.ru
2. С# для веб
— https://docs.microsoft.com/ru-ru/aspnet/core
3. C# для десктопа
— https://docs.microsoft.com/ru-ru/dotnet/desktop
4. С# для мобильной разработки
— https://docs.microsoft.com/ru-ru/dotnet/maui
5. С# для создания нейросетей
— https://docs.microsoft.com/ru-ru/dotnet/machine-learning/
6. С# для игр
— https://ru.stackoverflow.com/a/609901/422180
7. Годные ютуб-каналы
— https://www.youtube.com/c/CODEBLOG
— https://www.youtube.com/c/AndreyShyrokoriadov
— https://www.youtube.com/c/DevJungles
— https://www.youtube.com/user/Shmachilin
Шапка: https://pastebin.com/HT7Hi6FD
Прошлый тред: >>2697488 (OP)
Перекатывают после 500 поста, лентяй.
Ананасы, обращаем внимание на новые возможности лучшего в мире и всеобъемлющего языка программирования:
С# для создания нейросетей
— https://docs.microsoft.com/ru-ru/dotnet/machine-learning/
Добавлю в пастбин как буду дома. Еще сделаю анимешку в ОП-пост, а то перекатывальщик лодырь не находит красивые пикчи в шапку
Если бы его не было ты сейчас орал "разбить бы ебало тому кто меняет внутренее апи либы потому что я его юзаю"
Та ты гонишь.
Вот с другой стороны - разбить бы ебало пидору, который:
1. Сделал возможность наследования по умолчанию. Приходится как дебил постоянно sealed добавлять
2. Сделал enum таким кастрированным. Вот срсл, сравнить с С++ или жавой.
3. Нахуевертил вот этой хуйни с интерфейсами, которая сейчас. Это реально пиздец.
4. Нахуевертил эксепшинов там где они нахуй не нужны. Вот серьезно, какого хуя-то отключение сокета на другой стороне - должно кидать исключение-то? Ошибка со статусом - нормально было бы. Нет, блядь, лови в ебало эксепшн(Охуенно-то как если у тебя какой-то парк устройств, свет вырубился - твое приложение - на 5 минут - ушло в себя обрабатывать все это добро)
5. Перекатывает после 500 поста
Чего у тебя жопа сгорела? Всё по правилам перекатов.
Дебил, модификаторов наоборот не хватает нихуя. Где модификатор доступности только внутри неймспейса?
>Но он же сертифицированный работник майкрософт!
Если эти умельцы создали медиаплеер, у которого субтитры чисто белые, без контрастного фона или обводки, то хули ты от них хочешь?
Как будто у них есть специальный отдел по самым уебанским решениям на свете.
В MS работают самые большие говнокодеры на свете. Это уже 20 лет ни для кого не секрет.
Может после оптимизона значение захешируется и второго приведения не будет. Надо ассемблер посмотреть.
Это IR. А надо ассемблер.
У джитера свои оптимизации. Ассемблер в релизе смотри.
Там return виднеется. Значит метод не однострочный, значит написать так ничто не мешало:
>var rk = resourceKey.ToSting();
>return dictionary.Contains(rk) ? dictionary[rk] : null;
И сахарок и оптимизон присутствуют.
>Сейчас по моему кроме автофака и майковского уже ничего не осталось актуального. И фич второго хватает в 95% случаев.
"фича" майков только одна - когда они влепили его в асп.нет то использовать там "свой любимый" стало неудобно.
А так DI от майков - просто базовый. Ни тебе декораторов, ни условных иньекций, ни вмешаться в процесс конструирования графа. Простая автофабрика со скоупами.
>>740797
>Сделал enum таким кастрированным
при этом он хоть и является этаким особым наследником int/byte но работает медленнее
>Нахуевертил эксепшинов там где они нахуй не нужны.
увы но должен быть один подход - либо коды ошибок либо ексепшены. либо это 2 параллельных апи, а кому оно надо
Есть код, начинается стандартно:
using System;
using System.Runtime.InteropServices;
Вопрос: разве "using System" не включает в себя "System.Runtime.InteropServices"? Это же подраздел System? Что я не понимаю?
Нет не подраздел. Это имя неймспейса. То что оно похоже на иерархию - просто соглашение
Вот есть у тебя папка "Картинки", в ней лежат пикчи и вложенные папки "Аниме" и "Хуйцы". Когда ты открываешь папку с картинками в проводнике Windows, ты же не видишь в ней пикчи с аниме и хуйцами? Надо отдельно открывать вложенные папки. С неймспейсами почти тот же принцип, разве что иерархия неймспейсов не обязательно соответствует физическому расположению каталогов с исходниками.
Да, реально. Но учитывай, что на старте зарплата будет в лучшем случае 60К рублей и на собесе придется выложиться как на мидла минимум.
Ну, во первых win2d это библиотека для uwp, а во вторых она работает напрямую с directx, минуя фреймворк, за счет чего достигается крайне высокая скорость работы с графикой.
Для чего-то конкретного или просто рисовалка?
Только растр, насколько я знаю.
Школошарп по школотестам.
Если поверхностно судить, то судя по всему Skiasharp это чет универсальное, а win2d майкрософтовское.
Очевидно что за универсальность придется платить функционалом или производительностью.
win2d все так же поддерживается и есть для NET.6
Тут вопрос в том, каковы планы анона, и если за пределы шиндоваса не выходят, то я бы выбрал двухмерный вин против школошарпа.
Но опять же, тут нужно навернуть оба говна, чтобы понять в чем нюансы. По себе знаю, что хватает отсутствия одной детали, чтобы перечеркнуть все плюсы.
Хотя нет, есть и вектор.
Вообще, проблема win2d в том, что документации почти нет. Есть доки на гитхабе https://microsoft.github.io/Win2D/WinUI2/html/Introduction.htm и собственно все, в инете инфы по либе кот наплакал. SkiaSharp же обзавелся большим сообществом и на любой вопрос можно найти ответ.
1) Не "съедать" скобку если такая уже стоит справа от курсора.
2) При создание типа переменной не выполнять автоподстановку по нажатию на пробел (ппц гении).
Чел, все эти проблемы вылезают в 10% случаев. Второе вообще возникает при хреновом именовании собственных объектов.
В попытке борьбы с этими 10%, ты рискуешь обрести гемор с противоположными 90%.
Стандартные средства WPF. Конкретно с производительностью проблем не испытал (мб потому что веткор), но вот взаимодействие, типа редактора узлов кривой, выбор объектов, трансформации геометрии, чтение SVG — пришлось самому делать.
Но я щас посмотрел на доки, и даже с виду какая-то залупа. Все эти свойства и методы есть в стандартном Media, кроме читальщика svg или RgbToHue (мне пришлось самому писать конвертеры в различные цветовые схемы, HSV, HSL и CMYK).
В целом раздел эффектов понравился.
Господи, какие же вы бесполезные.
WPF медленнее в плане рисования. Приходится кидать винформхост и рисовать уже на нем - сильно производительнее.
Ну смотря какие у тебя цели.
Насколько я знаю, в винфомрсах тупо красятся пиксели. В WPF у тебя каждый штрих или кривая — это отдельный объект (причем со структурой из сегментов, патчей и фигур с поддержкой булевых операций). Мне нужно было второе, чтобы я мог кривую переместить, повернуть, отмасштабировать, перекрасить.
Зато впф определенно сосет в ричтекстбоксах. Настолько сосет, что сделать какой нибудь редактор кода с подсветкой синтаксиса официально невозможно.
>это отдельный объект
именно. и когда их очень много, то все очень не очень.
>редактор кода с подсветкой синтаксиса официально невозможно.
да. AvalonEdit тому пример
>и когда их очень много, то все очень не очень.
Ну дык все графические редакторы вещь тяжелая. Я знаком с векторными редакторами и структура объекта в WPF была очевидной и неизбежной. И в Corel Draw и в Illustrator устроено абсолютно так же.
Возможно для растра этого не нужно, хотя в фотошопе вроде тоже появились всякие blending options, смарт объекты и динамические градиенты, которые подразумевают хранение не только координат штриха, но и что-то еще.
Пфф, так в ней ничего по сути и нет. Опять же это растровый редактор, там своя атмосфера.
В векторе такой подход неприемлем, да и WPF все таки ориентируется на вектор. И если мы возьмем Gimp, то там ровно тоже самое, что и в WPF.
I use WinForms btw
Сделать соответствие координат холста на который рисуешь, с координатами текстуры из которой рисуешь.
>при рисовании текстура не накладывалась сама на себя множество раз, превращаясь в сплошную линию?
Не понял о чем речь. Как у тебя реализована кисть? Если это грубо говоря точки вдоль контура с неким шагом и с неким размытием, то решается это все собственно
1. шагом,
2. текстурой. Она не всегда однотонная именно для этих целей. Если мы говрим об условном шуме, то там есть темные и светыле пятна, при наложении друг на друга никогда не дадут однородынй цвет.
3. радиальным размытием кисти
4. режимом наложения (add, multiply, difference, color burn и т.д.)
https://ru.wikipedia.org/wiki/Методы_наложения_(компьютерная_графика)
Ну а в более сложных подходах (как это было в зибраше) у текстуры есть еще карта высот и на это реагирует свет, создавая ту самую естественную текстуру + учет вектора кривой, чтобы расположить текстуру вдоль собсно кривой.
Вроде на презентации win2d я видел, что можно из коробки рендерить карут высот и выставлять источник света
Но ты заебешь одну эту технологию пилить, если по уму. Я год потратил на своё.
Но всё равно на техническом собеседовании лажаю и упускаю какие-то вроде бы очевидные нюансы теории. Как это фиксить?
>Как это фиксить?
Не читать метанит, который предназначен для совсем маслят?
Вот даже в твоем вопросе нарушение логики. Если что-то спросили и ты не знаешь — выучи это и будешь знать.
Не понял тебя
>>742680
> Не понял о чем речь. Как у тебя реализована кисть? Если это грубо говоря точки вдоль контура с неким шагом и с неким размытием, то решается это все собственно
Есть точки, есть кисть пик например, сейчас у меня для каждой вычисленной точки использую алгоритм Wu отрисовывается данная текстура, с центром в этой самой точке.
> шагом,
Если увеличить шаг, то линия не будет одной толщины, и в целом не будет плавного рисования, когда штрих следует за курсором. И это в любом случае будет выглядеть не очень, так как наложение так и так будет происходить.
> текстурой. Она не всегда однотонная именно для этих целей. Если мы говрим об условном шуме, то там есть темные и светыле пятна, при наложении друг на друга никогда не дадут однородынй цвет.
Опять же все зависит от частоты.
> радиальным размытием кисти
Как это поможет?
> 4. режимом наложения (add, multiply, difference, color burn и т.д.)
Думал об этом, но в данном случае пространство между брызгами прозрачное как и остальной холст, поэтому хз что здесь можно наложить
Чел ... ты видел как устроены кисти в фотошопах, зибрашах?
Если ты подобную монохромную текстуру загрузишь в фотошоп, то будет ровно тоже самое, поэтому шум кисти всегда имеет оттенки, либо не имеет, если зудожник использует кисть для маски.
Сейчас, у тебя текстура не предназначена для твоих целей. Формально, у тебя не текстура, а альфа. Посмотри пикрил текстуоы карандаша, там тон неоднородный — есть светлые и темные участки, которые при наложении не сольются (само собой и альфаканал там должен присутствовать).
Художники обмазаны килотоннами альфа-кистей под разный пук, с разным контрастом, текстурой и масштабом детелей. В Substance Painter к примеру все эти кисти настраиваются процедурно: масштаб "капель", контраст и вообще куча шумов намешано.
> радиальным размытием кисти
> Как это поможет?
Это не твоя забота тащем-та, художник занет зачем. Если вкратце, то блюр может помочь избавиться от "швов" накладывающихся друг на друга паттернов.
> шагом,
> Если увеличить шаг, то линия не будет одной толщины,
Епта, посмотри на настройки кисти в фотошопе и других редакторах. Конечно может и иногда художники это юзают для рисования например швов ниток. Суть в том, что это параметр обязан быть.
Еще раз, ты должен ХУЙдожнику дать набор параметров, а он сам подберет нужную альфу, нужный размер кисти, нужный нажим, нужный блюр, режим Lazy Mouse (это когда кисть реагирует на движения юзера с задержкой — позволяет рисовать плавные изгибы).
Настоятельно рекомендую изучить как все устроено в других приложениях и не городить велосипед. Я тоже сидел и анализировал что и как в разных приложениях устроено. Кажыдй делал так, как считал нужынм.
К примеру в Corel Draw колоприкер реализован через таймер, от чего колорпикер безбожно тормозит в попытках перерисовать контрол с градиентом. В фотошопе колорпикер хитро подменяется на иконку курсора, что позволило повысить избавиться от фризов.
Тут нужна наблюдательность. Установить все программы и смотреть что и как кто сделал.
Как-как?
Выделил бы сущность:
BlendMode
У нее бы был метод
void Apply(DrawEvent e, Canvas c);
DrawEvent - содержит сплайн по которому шло рисование, кисть, размер точек в частях сплайна
Ну, далее, в этом Apply бы и происходила логика с наложением в зависимости от метода наложения. Где-то бы происходило умножение, где-то бы вычитание, где-то бы если уже прошлись по этим координатам - нихуя не делаем.
Как-то так.
Ну а в твоем случае, чтобы просто было - просто накладываем текстуру на весь холст, далее - вычитаем все что не по сплайну прошло.Т.е чирканули - накладываешь текстуру на холст, потом - вычитаешь из того что наложилось сплайн, потом инвертируешь наложение. Тогда текстурка будет равномерно и не перекрывать сама себя.
HUETA
Нужно по-человечески делать текстуру кисти. Ты как это собрался поддерживать? А как же библиотеки кистей? Несовместимы? Идут в жопу?
Берм квадратную альфу кисти, и дальше распределеяем копии по сплайну с неким шагом, учитывая перпендикулярный вектор относительно сплайна.
А пытаться тайлить холст — это провальная идея. Она даже выглядеть будет супер пососно.
> Берм квадратную альфу кисти, и дальше распределеяем копии по сплайну с неким шагом, учитывая перпендикулярный вектор относительно сплайна.
И получаем в местах поворота сплайна наложение текстур при повороте, от которого хотел избавиться чел что спрашивал.
> А пытаться тайлить холст — это провальная идея. Она даже выглядеть будет супер пососно.
Ну, тут зависит. Вполне нормально может выглядеть, если текстура норм. Другое дело, что сильно компуктерно.
А нормальное решение - я предложил изначально постом выше. Выделить блендмод и там порешивать, как че накладывать. Кисть при этом - это отдельная сущность которая несет информацию только о форме, силе нажатия тексткрек, степени размытия краев, наклоне и т.д.
>от которого хотел избавиться чел что спрашивал.
Так надо советы давать не губительные, с этим челвоеки давно уже разобрались. Все гарфические редакторы работают по моему принципу. Все. А с талингом нужно делать бесшовную текстуру, нужно учитывать разрешение экрана, нужна своя библиотека текстур, которая не будет подходить к дурим редакторам.
>Вполне нормально может выглядеть
Я те отвечаю, что будет выглядеть как говно, ибо отсутствует вариативность шума. Как хужожник художнику отвечаю, что юзер при работе постоянно меняет радиус кисти,чтобы создать ту саму вариативность шума.
Если так нужен подобный эффект, то художник сам возьмет текстуру и маской ее обтравит.
>И получаем в местах поворота сплайна наложение текстур при повороте, от которого хотел избавиться чел что спрашивал.
Иногда не стоит идти на поводу претензий. Возможно причина проблемы в другом - в самой текстуре.
Объясню как он работает. Он затеняет метод\свойство базового класса, но не переопределяет как overrides. Метод в базовом классе по прежнему существует, но не виден при обращении к наследнику.
Обычно такой подход используют для ситуаций, когда элемент базового класса не помечен как overridable (или virtual). Тогда его затеняют, а теле метода обращаются к базовому классу.
Public Shadows Sub Add(item as T)
. . . MyBase.Add(item) //аналог base.Add(item)
End Sub
Как такое сделать в шарпе? Я наследую список, и мне нужно переопределить метод Add.
Если тебе надо что-то перекрыть от базового класса - есть new.
Более правильно будет - сделать класс, который не наследуется. Т.е.:
class MyList<T> : IList<T>{
private List<T> _list;
// реализация интерфейсов как тебе надо.
}
Да, спасибо.
>Более правильно будет - сделать класс, который не наследуется
Да мне там надо всего пара методов поправить, чтобы он добавлял в итем себя в качестве родителя.
Я бы кстати эту фичу отключил бы, если бы знал как. Лично для меня - она чаще мешает. Я привык как раньше - хуячишь, потом мышечной памятью выбираешь че там intellisense предложит выбирать. А теперь так делаешь - и в результате у тебя не то что надо, приходится назад исправлять. Бесит.
Студя конечно, но для бейсика таких штук нет - там только базовое автодополнение.
Ну да, бейсик же мёртв.
Да ну.
Мне например нравится, что когда инжектишь сервисы, она тебе сразу и ридонли поле полностью прописывает и параметр конструктора и сразу связывает их, причем с именами по кодстайлу. Удобна.
бля пикчи забыл
Хуй знает, никогда не работал с database first.
Но чисто по логике и исходя из сообщения об ошибке, оно похоже ругается из-за того что свойство в БД не nullable и он не сможет его отрезолвить при обратной записи в БД.
Сделай столбец в БД nullable или задай ему дефолтное значение.
Если минимальная база по программированию имеется, то советую свой проект пилить, не важно на сколько это будет хуево и убого. На этом будешь учиться. Постоянный гуглежь и вопросы к gpt чату в помощь. Параллельно можешь читать что-то самое примитивное, для совсем вкатунов по твоему направлению. Вроде были раньше советы по книгам в шапке, но проебались. Загугли книжки сам. Бери самую простую и популярную.
Когда мало-мальски прошаришься во внутренние кухне направления и фреймворка. Ищи форумы, обсуждачи, группки и тд где такие же как ты сидят, только поопытнее. Сиди там ридонли, ну или базарь, как хочешь. И становись челом который про разработку реальных игра что-то знает. Про первый совет не забывай - постоянно что-то пиши, заимствуй любой код, который делает что-то прикольное, изучай его в отладке чтобы понять как он работает и тд.
Чтобы не забить на все это дело, нужна нихуевая мотивация время свое просирать непонятно на что. Так что если осилишь базу своего направления, то ищи челов, которым нужен прогер-разраб любой хуевости для своего гавно-инди. Примыкай к таким и развивайтесь вместе. Ничего из этого не выйдет скорее всего, но ты получишь опыт и знания.
Если базы нет, то сперва придется вкатиться в программирование. Не важно на каком языке. Иди учи язык, тот же шарп, по видосам с ютуба. Когда сможешь сам осилить самую простейшую консольную хуйню из задачников, то смотри первый совет.
internal class MyClass
{
. . public DateTime MyTime { get; set; }
. . public MyClass(string data)
. . {
. . . . bool isSuccess = ParseTimeData(data, out MyTime);
. . }
}
Делаешь собственный проект и по ходу понимаешь где соснул. Я свой уже четвертый раз переделываю (за полтора года), узнавая что-то новое. Иначе никак.
Я тут недавно от одного чела узнал базу, с которой я внезапно согласен — проект должен быть объемным и долгосрочным. На микрописюльках просто нет шансов узнать что-то новое.
Единственный минус такого подхода — твоя собственная сила воли. Я как любитель игр жанра выживач, обожаю аутировать и в целом не против длинных марафонов да потом еще все переделать заново.
Но как?
Ты врун. Свойство по сути является мотодом, поэтому не работает в качестве передачи переменной. Алсо в бейсике работает, но компилятор достаточно умен, чтобы потом оптимизировать и подставить временную переменную.
>Алсо в бейсике работает, но компилятор достаточно умен, чтобы потом оптимизировать и подставить временную переменную.
И нахуй ломает всю инкапсуляцию.
Я хочу сделать в жанре survival horror в духе ps1-ps2 игр(RE, Тихие Холмы). Голливудский сюжет уже запилил в своей голове.
Я так-то заходил на геймдемовские гейские ру форумы . Но чет разочаровался в таможних аутистах делающие говно игры на унити. У челов реально нет фантазии. Какое-то однотипное и скучное говно а не игры. Слишком дохуя НПС пытающиеся пилить игрули своей мечты. Ну справедливости ради походу не каждому дано быть псевдотворцом Кадзимой.
Не ломает, просто захотелось спиздануть хуйню с умным видом и заодно выебнуться на бейсик.
>нет фантазии. Какое-то однотипное и скучное говно а не игры
какая фантазия может быть. ты их жизнь видел? они ЖИЗНЬ пилят. Вот из свежего - "симулятор жизни в хрущевке". А ты со своими фантазиями в жизнь лезешь. Ничего не понимаешь
>какая фантазия может быть. ты их жизнь видел?
Так лол, а сильно ли отличается жизнь желтолицых?) Почему они могут высерать хотя бы поверхностного говно, берущее атмосферой и визуалом, а наши Васьки нет?)
По сути, большая часть того, о чем он пишет, есть на msdn в более актуальной форме или даже на тех же метанитах.
Я понимаю, читать какую-то не привязанную к технологиям классику вроде "Грокаем алгоритмы". С другой стороны, хочется рассказывать теорию как сеньор-помидор, а не отталкиваться от практики.
Я хуй знает как челы вообще не читают.
Стоит. Интересны не какие-то книги на обобщенные темы (это с легкостью заменят туторы на ютубе и msdn), а когда обсасывают конкретную тему.
Я полгода ругался на WPF, словари ресурсов, на все это убожество (как я считал), выстраивал безумные теории, изобретал квадратные колеса, по сути ухудшая себе положение нарушением соглашений, да и аноны ИТТ в основном заднеприводные и про фронтенд не особо знакомы. А в книгах есть такие нюансы, которые строят объемную картину по конкретной тематике.
Не скажу, что я знаю всё, но в 10 раз больше, чем описано в мдсн, метанитах и туторах на ютубе.
Намеренная политика, когда эффективно пользуется системой только её разработчик и приближенный, а остальные барахтаются в говне не понимая что делают, это дает конкурентное преимущество майкрософт. Эту обфускацию довели до того, что теперь без нейросети не поймешь даже с какой стороны подходить. Но и нейросети манипулируемы, их можно заставить выдавать неактуальные данные, а настоящие придерживать для себя.
А где им еще быть. Оно там и должно.
перегрузки это не фича ооп, это диспетчеризация методов.
А сокрытие это уже инкапсуляция - один из китов ооп. Структуры же - хитрожопые подобия классов со своими премудростями
>Стоит. Интересны не какие-то книги на обобщенные темы (это с легкостью заменят туторы на ютубе и msdn), а когда обсасывают конкретную тему.
>
Что посоветуешь?
смотря что ты подразумеваешь под перегрузкой методов
Ты бы с этим вопросом к создателю ресурса и обратился. Метанит - это не какой-то академический справочник сделанный по всем канонам, а просто ресурс одного чувака, который начал когда-то для себя систематизировать материалы и не смог остановиться.
Тащемто, метанит очень хуёвый источник информации. Утверждаю, как прошедший через эти говна.
А какой не хуевый? Хотя бы на уровне джуна.
&&
Если использовать в режиме "Бля, как же эта хуйня называется/кодится. Вот бля, забыл" По быстрому посмотреть и вспомнить. Вобщем как сборник заметок, которые пролистать проще, чем в МСДН ковыряться.
Там большинство уже устарело и для начинающих будет просто вредно.
Есть приложение, которое разворачиваю в Докере, сначала всё ок. Но если подождать какое-то рандомное время и попробовать отправить запрос, то в ответ будет нихуя. Само приложение при этом точно работает, один фоновый сервис в лог пишет в нём. Если перезагрузить контейнер, то всё снова будет ок, но заёбывает. Гуглил проблему, нашёл что-то типа такого: https://github.com/dotnet/aspnetcore/issues/45215, но у меня дотнет 6. Единственное: у меня нет launchsettings.json в проекте, конвертил его из консольного в WebApi и как-то забил на это, вроде и так работает
Не знаю. То, что тебе лично нужно. У меня были проблемы с WPF, а еще анон мне тут посоветовал книжку про Dependency Injection.
Пипец. 23-й год на дворе, а мне еще на SO и другие погромисты втирают что-то про "да не парься, компилятор оптимизирует лучше тебя".
Что мешает компилятору самому принять решение в столь очевидной ситуации? У меня что, где-то на середине процесса из воздуха появится параметр в методе? Даже если я его переопределю, то у меня должна быть та же сигнатура.
Нахуй и в пизду. Не доверяю я этому вашим оптимизациям. Они странные. С одной стороны "не парься" а с другой залупа, вроде "нельзя передать метод в out" или "помечай метод ридонли".
Не стоит вкатываться в сишарп. На сишарп мало откликов. Около 50. На джаву по 200-300. Если вкатишься, что не успеешь на поезд, а ведь скоро пиздец с вакансиями докатится до твоей страны.
Песню про поезд и пиздец с вакансиями я ещё в 2016 слышал. Теперь вот прям точно ВСЁ? Следующего ещё большего ВСЁ не ждать? Прям точно-точно?
ну сегодня ты не сделал readonly и "пусть компилятор выведет" - завтра ты метод изменил и не учел его ридонлитость, и компилятор вывел что "он не ридонли" - только теперь ты об этом не знаешь. Так что помимо опитимизаций все эти гарантии еще проверяются - readonly, scoped кое как защищают тебя от некоторой стрельбы по ногам по причине "я ж не слон все помнить"
в шарпе еще и val не хватает к var. Но это ж шарп - тут много чего сделали через жопу.
Взять хотя бы тут не раз упоминаемые делегаты и LINQ, когда передавая ламбду все хорошо, но стоит передать Method Group, так сразу "радость" GC
У меня было что в линухе висит слушаемый порт, процесс вроде тоже жив, а байты будто в трубу улетают. Решилось заменой дедика то есть в моём случае была проблема с осью/железом
> завтра ты метод изменил
Во-первых, это не так-то просто сделать, т.к. вероятно этот метод уже используют. Поэтому изменение сигнатуры вызовет ошибку.
В-вторых, учитывая глобальные изменения по решению первого пункта, это будут осознанные изменения, и совершенно очевидно что с этого момента метод и не должен быть ридонли.
Хорошо. Допустим, что я добавил optional параметр, и объекты вызывающие этот метод условно говоря ничего не заметят, и компилятор не выдаст никаких ошибок. Но какой для меня имеет смысл факт того, является ли метод ридонли или нет? Оптимизация? Ну и какая там потеря производительности? Байтоебство на пустом месте (чем рекомендуют не заниматься успешные шарп-господа).
Вообще забавно как шарп пытается усидеть на двух стульях "серьезности языка" и "юзер френдли сахарка".
Структуры существуют для оптимизации. Если ты вместо класса выбираешь структуру, то значит тебе важно байтоебство (иначе о чем мы сейчас говорим)
Далее этот кейворд нужен если у тебя мутабельная структура (и если она такая значит тебе так надо) . А мутабельная структура обладает таким свойством что попав в ридонли семантику компилятор не будет делать обширные изыскания (что ненадежно), а просто влепит защитную копию
И получишь ты оверхед на ровном месте
Начал читать "C# Для чайников", но столкнулся с тем, что около половины не понимаю/понимаю плохо, но да похуй, не в этом суть.
Вопрос вот в чем, шарпы используются в вебе, играх и приложениях. Душа у меня к вебу вообще не лежит, ближе к играм или приложениям(желательно играм), насколько сложно найти работу и сколько примерно займет изучение БАЗЫ для среднестатистического вкатуна?
>C#, пока дается относительно легко
>но столкнулся с тем, что около половины не понимаю/понимаю плохо
Ты противоречия в своих словах не видишь?
>сколько примерно займет изучение БАЗЫ для среднестатистического вкатуна
От полугода. С учетом вышеозвученного я бы сказал год-два.
А на поиск
>насколько сложно найти работу
Еще полгода-год приплюсуй к сроку освоения. Хотя может банально повезти ну или ты согласишься работать совсем за еду (но и на такие места тоже очереди бывают)
>Ты противоречия в своих словах не видишь?
да увидел, не дописал малек.
с той же базой огэ/егэ все понятно, проблемы скорее с чем-то сложнее школьного курса типа ООП, функций(в питоне они как-то легче давались)
>или ты согласишься работать совсем за еду
если будет возможность не ездить куда-то то вполне готов и так работать, стаж лишним не будет, чтобы потом устроиться на место получше
На джаве порой такой легаси кал из солянки разных либ, что даже если будут платить в два раза больше, ты убежишь.
Я серьезно, повезет даже если на какой-то древний спринг попадешь.
>проблемы скорее с чем-то сложнее школьного курса типа ООП, функций(в питоне они как-то легче давались)
Ну так это база и есть, а то что знаешь ты, так - букварик.
>если будет возможность не ездить куда-то то вполне готов
Залететь на первую работу сразу на удаленку, шаеес где-то 1 к 20. Даже за еду.
В безопасном зашифрованном хранилище кредов.
Глянул вакансии там написано алгоритмическая подготовка и структуры данных, не все же учить, это довольно обширная тема, что чаще всего используется в разработке из этих тем?
Сортировка, поиск, списки, множества, хеш-таблицы, деревья. Ну и надо понимать алгоритмическую сложность.
Спасибо.
Понял, тогда постараюсь с этим буквариком дотянуть до ооп.
"За еду" в понятии наносеков это сколько? Я типа не привередливый особо тыщ 20-40 вполне хватит на первое время.
>Сортировка, поиск, списки, множества, хеш-таблицы, деревья.
Разве это не реализовано в библиотеках, а за попытки костылять вручную не выгоняют с работы ссаными тряпками?
Толсто.
А фриланс, как я понимаю на любом яп это веб в основном?
>Разве это не реализовано в библиотеках
В библиотеках даны обобщенные решения, которые для некоторых частных случаев могут уступать в эффективности в разы.
Есть но я не помню точные названия. Так и загугли их там два точно есть
Перехватить чтобы обработать нельзя. Можно узнать про их существование за мгновение перед тем как твоя приложуха упадет.
https://learn.microsoft.com/ru-ru/dotnet/api/system.appdomain.firstchanceexception
https://learn.microsoft.com/ru-ru/dotnet/api/system.appdomain.unhandledexception
Получается что-то вроде этого:
>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 в безопасном шарпе уготован особый котел.
Получается что-то вроде этого:
>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 в безопасном шарпе уготован особый котел.
> https://learn.microsoft.com/ru-ru/dotnet/api/system.appdomain.unhandledexception
Вот это не перехватывает
> https://learn.microsoft.com/ru-ru/dotnet/api/system.appdomain.firstchanceexception
А это перехватывает вообще все, в том числе ошибки в стандартных либах. Всего за минуту после запуска приходит пара сотен исключений и понять, какое из них привело к крашу невозможно.
Кек, прикольно. Запомню, как минимум можно будет на собесе мозг оппоненту вынести.
Все он перехватывает. Совсем недавно с асинк войдами в пользовательском коде ебался.
Завтра еще раз проверю.
Печаль. Видимо все таки придется мигрировать на uwp
Сссссука как же заебал этот internal. Что за ублюдок рпидумл ставить его автмотом для библиотеки классов? Разве это не подразумевает, что я 999999% случаев буду использовать снаружи проекта?
Нет.
Не подразумевает
чтобы ты имел больше обработчиков которые не срабатывают )
>существование async void в безопасном шарпе уготован особый котел
критикуешь предлагай замену
Но как так? Ведь его выпустили в 2007, когда железо было на несколько порядков слабее. И учитывая его популярность работал он нормально. А тут 2023 на дворе, мощные процессоры, мощные видеокарты, а он лагает как сука, не может простейшую анимацию с translate x плавно вывести, каждую секунду какие-то подергивания.
Ах, я даже пытался делать анимацию через собственный контрол, вызывая метод onrender с помощью таймера 60 раз в секунду и рисуя картинку в нем. Но даже так меня ждали все те же микролаги.
Пикрил 1 - информация о запросе в документации. Ссылка: https://cloud.yandex.ru/docs/resource-manager/api-ref/Folder/delete
Пикрил 2 - это то, что у меня работает без query parameters
Пикрил 3 - это то, как я попытался впихнуть параметр запроса "deleteAfter".
Ок, спасибо. Ща посмотрю.
Возникла острая необходимость генерировать типы в рантайме.
Загуглил, базово сделал.
Теперь - возникла необходимость генерировать у этих типов женерик методы.
Гуглил-гуглил, не нашел как делать, чтобы оно интерфейсу удовлетворяло.
Собственно, в чем проблема то.
Есть интерфейс, есть класс, который ему удовлетворяет, но не имплементирует.
Шарп в утиную типизацию - не может из коробки.
dynamic использовать - не хочется.
Делал велосипед.
Споткнулся о женерики.
Кто шарит, поясните, как сделать?
Ну, вот говорю же.
Есть класс в сборке, которая из DLL подгружается.
Я не хочу все эти вот GetMethod("Zalupa") и прочее делать.
О dll я знаю только место где она лежит, при этом загружать ее в проект и связывать - не хочу, суть как раз в том, чтобы можно было добавлять новые ДЛЛ и динамически подгружать из них нужные штуки.
В сборке так же - нету какого-то общего интерфейса. Ну, вот так вот, в этом тоже задумка.
Теперь. Чего хочу. Хочу чтобы можно было:
var zalupaType = externalAssembly.GetType("ZalupaType");
object instance = Activator.CreateInstance(zalupaType);
IZalupa zalupa = Utils.ToProxy(instance, typeof(IZalupa)) as IZalupa;
Это я сделал.
Но ВНЕЗАПНО, я обнаружил, что в шарпе есть женерики. И интерфейсы могут объявлять женериковые методы. А как мне женерики делать со всей это илогенерацией - я не знаю(((
Что удивительно ибо если погуглить то пишут что именно им и ловить нужно
Но да, не ловит
Но вообще правильно что не ловит
А ловит только system.appdomain.unhandledexception
Если используешь подход fire and forget то обязан думать про "а если ошибка то что". И если не подумал то fail fast правильнее чем непонятно что
А потом ты еще не просто с дженерик типами, а с коллекциями дженериков столкнешся. Похэвишь фан, как говорится.
А чем оно будет принципиально отличаться?
У меня есть интерфейсы:
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'ом еще сделать можно, чтобы оно работать нормально стало.
А чем оно будет принципиально отличаться?
У меня есть интерфейсы:
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'ом еще сделать можно, чтобы оно работать нормально стало.
В этом эвенте можно захендлить исключения с неразвернутых тасок, в момент когда уборщик мусора их диспозит.
Асинк войдовые исключения ничем не хендляться.
Может кто-то их хендлит за тебя? Потому в unhandledexception'е они и не высплывают.
Интересно. Алсо прихуел с неявного создания объектов в шарпе. Мне кажется это уже перебор.
Тебе один из методов расширения объект вернул. Об этом явно его сигнатура говорит. Неявное это когда у тебя что-то боксится и ты про это не узнаешь, если ил не посмотришь.
Какой он объект вернул? ни var, ни new ... не сообщают об этом.
Кроме того, в документации буквально написано impicitly create (пикрил).
Обычно при создании экземпляра явно указывают либо слева либо справа тип объекта. А то что ты пишешь — это уже моча уровня джава скрипта (наведи мышкой на перменную и прочитай тип), даже в бейсике такое зашквар.
Тьфу ...
Обычный сахарок. Не нравится вар попроси студию указать тип вместо вара. Это делается в два нажатия.
Чел. Когда ты используешь методы класса, ты так же кричишь про неявное?
Ну а хули, где там явно сказано, что за len будет?
>Чел. Когда ты используешь методы класса, ты так же кричишь про неявное?
Естественно!
var имеет смысл только в одном случае — когда тебе приходится дважды писать тип класса при создании экземпляра. Поэтому ты либо пишешь var слева и тип класса справа, либо тип класса слева и просто new справа.
Какие же говноеды ИТТ, пиздец просто.
>>748535
>Обычный сахарок. Не нравится вар
Я-то поставлю, а вот другие — нет. Официально приравниваю сишарп к уровню джва скрипта (там тоже хош явно инициализируешь, хош неявно. Хош ставишь ; а хош не ставишь. Хош объявляешь переменную, хош не объявляешь).
Ну на первой пикче стринг визуально очевиден, на примере выше Url неочевиден (если ты не держишь в голове существование расширения). Для возврата длины предпочтительно указывать тип (особенно если учесть, что int и var имеют одинаковое количество символов). А вот на второй пикче я бы даже настоятельно рекомендовал, ибо слишком длинная простыня с НЕОЖИДАННЫМ финалом.
На его скриншоте только сетапящие методы вызываются. Там еще не может быть результата. Это очевидно любому кто хоть раз с флюент шаблоном дело имел.
> var имеет смысл только в одном случае — когда тебе приходится дважды писать тип класса при создании экземпляра
Да. Мне так хочется писать:
AbstractFactoryProvider<ServerBase<DefaultTcpListner, DefaultTracer, DefaultDebuger, MySecretProtocolContextFactory,MySecretProtocolMapper,MyApplicationHandler, MyMessageDispatcher, DefaultConnectionManager>> factory = GetDefauiltServerFactoryProvider<ServerBase<DefaultTcpListner, DefaultTracer, DefaultDebuger, MySecretProtocolContextFactory,MySecretProtocolMapper,MyApplicationHandler, MyMessageDispatcher, DefaultConnectionManager>>();
А то без этого - я же не пойму, что там блядь такое же было. Этот же код не я писал. А кто-то другой.
>>748544
var - работает явно: что справа - то будет слева. Ты в любом случае же чтобы этот метод расширения использовать - добавил юзинг необходимый, значит знал что делал.
У меня вот на работе есть код:
public static UdpClient CreateUdpClient(this string host)
Ничего, ни у кого на ревью не возникало вопросов, что да после :
"proto://host:123".CreateUdpClient()
произойдет.
>>748551
Финал - ожидаем.
Явно указывать тип - следует только в случае, если он отличается от того что возвращает правая часть. Т.е. если бы мне надо было ICollection<IEnumerable<string>> - да, в остальных случаях - это просто мусор визуальный.
>"proto://host:123".CreateUdpClient()
Что здесь не так? Тут все очевидно.
>Ничего, ни у кого на ревью не возникало вопросов
А какие могут быть вопросы к расширению для стринга, блеаять? Вот если бы CreateUdpClient() мог бы возвратить один из 100500 вариаций ZalupaClient, а код выглядел бы так
var client = "proto://host:123".CreateUdpClient();
То тебе бы обязательно перезвонили.
>А то без этого - я же не пойму, что там блядь такое же было.
Да это какое-то петросянство, которое не удобоваримо по своей структуре. Тут уже вопрос в другом.
>добавил юзинг необходимый, значит знал что делал.
Я-то может и знал, а другие вряд ли.
>CreateUdpClient() мог бы возвратить один из 100500 вариаций ZalupaClient
И тут ты такой рассказываешь нам, каким же образом, в шарпе, один и тот же метод может возвращать разные типы.
Метод визуально не сообщает какой тип он возвращает, либо вовсе возвращает object
> Но твое решение максимум неоптимизированное.
В чем неоптимизированность?
> Хуйню какую-то городишь, но ничем не могу помочь — не понимаю в чем проблема. У меня картинки нормально скроллятся.
Пиздишь же. Размести картинку, добавь translate x анимацию и наслаждайся микро лагами.
public IEnumerable<IMyInterface> Foo(IEnumerable<MyEntity> i) =>
from it in i
select ...
Собственно вот и проблема. Я хочу чтобы то что выбралось селектом - удовлетворяло интерфейсу. Заводить отдельный класс/рекорд имплементирующий инерфейс - не хочу.
Я видимо криво выразился. В IEnumerable<MyEntity> - нет объектов, которые бы имплементировали интерфейс.
Но я хочу передать то что из линку получилось дальше, при этом не создавая под это дело класс/рекорд.
Cast - кинет исключение. А надо чтобы анонимному типу - навесился интерфейс.
Из коробки никак (есть парочка тухлых обсуждений фичи добавления имплементации интерфейсов анонимными классами).
Можно через левые либы.
Что сказать то хотел, анон? Как мне это все поможет нарисовать градиент как на пике?
Я по нему начал, сделал перерыв на С, хочу вернуться - а его нет.
Последняя версия плохая, предыдущие пойдет.
>Сука, имаджинируйте моё ебало, когда я узнал, что в wpf невозможно (вообще никак) сделать пикрил.
Можно, плохо исследовал тему.
В впф есть кривые безье (Windows.Media?), дуги вот это все со свойствами, которые на 90% описывают свойства кривой в векторном редакторе типа CorelDraw, Illustrator.
И по-моему там есть даже сектор — типа дуга от круга, где начало и конец определяются углом. Выставляешь нужную толщину контура. Далее тебе надо выставить Ens Cap и Start Cap на Round — чтобы получить те самые закругления на концах. Тени делаются при помощи эффектов (тоже из коробки), они динамические.
Все что тебе остается, это конвертировать процентаж в углы.
>>751106
Анон прав. Это графические элементы Windows.Media.
А Path вообще уберштука.
>>751114
Какой градиент? Я его не вижу. Вижу только тень. Но если тебе нужно как пикрил >>751407 (говеный если что), то есть для этого радиальный градиент и его можно заюзать как опасити маску.
Проще показать проблему. Вот смотрите пикрил, есть таблица — это список голосов говорилки яндекса.
Каждый заголовок столбца — отдельное свойство моего класса. Посмотрите на столбец "Амплуа", это манера речи и у каждого голоса их может быть несколько. К примеру у голоса "jane" их три.
Так вот, как сделать так, чтобы когда я обращался к свойству Amplua, мне IntelliSence выдавал подсказку с доступными вариантами по аналогии с enum? Я же не могу под каждый голос пилить отдельный enum? А просто массив неинформативен и потребует дополнительных действий, чтобы понять, что в нем находится и сколько. Dynamic срабатывает только во время выполнения — тоже не подходит. Tuple не подходит т.к. количество элементов у каждого экземпляра разное.
> И по-моему там есть даже сектор — типа дуга от круга, где начало и конец определяются углом. Выставляешь нужную толщину контура. Далее тебе надо выставить Ens Cap и Start Cap на Round — чтобы получить те самые закругления на концах. Тени делаются при помощи эффектов (тоже из коробки), они динамические.
Я все это знаю, и дугу нарисовать могу без проблем. А вот раскрасить ее нужным градиентом нельзя, увы.
> Какой градиент? Я его не вижу.
Ты слепой? У дуги начальный цвет фиолетовый, а конечный синий.
> для этого радиальный градиент
Это совсем другое. Вот 2 пика, на первом радиальный, на втором нужный мне градиент из skia sharp circular
>Ты слепой? У дуги начальный цвет фиолетовый, а конечный синий.
И? В чем проблема? На самом деле я юзал что-то вроде вроде цветового мэша (не помню точно как называется), но колорпикер выполнет полностью стандартными средствами
>Так вот, как сделать так, чтобы когда я обращался к свойству Amplua, мне IntelliSence выдавал подсказку с доступными вариантами по аналогии с enum?
Такие вещи не хардкодят.
Ты там собираешься отдельную ветку кода для каждой локали городить что-ли? Это хуевый подход.
В смысле хардкодинг? Если взять выше прикрепленную таблицу за основу, то у меня есть набор пикрилейтед №1. Основной класс Voice, он представляет строку в таблице, и есть энумы типа пола, амплуа. Единственное нет кода языка — у яндекса он пишется через дефис, а это гемор через конвертеры, чтобы сериализовать в json. Хочу чтобы я пришел через миллион лет и не сидел перебирал возможные варианты и гуглил доки.
Все это собирается в статический класс, в котором есть словарь голосов типа Voice, плюс каждый голос выведен в свойство, которое берет параметр из словаря.
А как еще? Всё в стрингах держать?
Пока что свою проблему решил через xml документацию к каждому голосу (пикрил 2), чтобы примерно представлять что где лежит, но решение так себе.
Ты уж постарайся вспомнить, потому что мне реально интересно, как получить такой эффект на чистом впф
да нагугли ты что то готовое
типа этого https://github.com/PixiEditor/ColorPicker
и посмотри код
Стараюсь написать консольное приложение - простенький конвертер валют в котором нет динамического выбора валюты, а курс валюты строго задан заранее.
По моей задумке первое сообщение просит ввести интересуемую сумму долларов США, покупаемых за рубли. Затем эта сумма должна быть помножена на переменную с заранее заданным значением (курс валюты) и показать получившееся значение.
Затем выводится новое сообщение и проводится еще одна процедура, но уже для продажи долларов за рубли. И так далее для других валют.
Как бы вы написали такое?
И еще вопрос, почему оператор * не применим к типу double?
Вспомнил анон.
Короче, тот вариант был сделан на основе вот этого
https://stackoverflow.com/questions/4839666/creating-gradient-brush-along-a-circular-path
Это ссылка на проект, где я немного подправил градиент
https://ru.files.fm/u/jnsdqpawa
Но в итоге я принял другое решение. Я просто взял растровый фон, кек. А чтобы это не выглядело всрато при разных масштабах, маски прозрачности у меня были параметрическими (как раз и того примера). Я проверял скейл подобной констуркции, и в целом размытый градиент никак не палится — выглядит так, как будто градиент параметрический.
Да и в целом в фотошопе сделано ровно тоже самое. Причина проста — производительность. Эти градиенты очень прожорливы. Тоже самое и гарадинет Saturation и Lightness созданы при момощи трех слоев - базовый цвет + растровый градиент насыщенности + растровый градиент яркости повернутый на 90 градусов.
Берешь Console.ReadLine(), то что он вернет парсишь Double.Parse(), это значение умножаешь или делишь на что ты там хочешь. Не забывай, что пользовательский ввод может быть хуевым.
тогда хреновый с него программист
ибо ПРОГРАММИСТ должен знать о проблеме float/double, а не вакуумносферический финансист.
>В смысле хардкодинг?
Вот то что у тебя на 2-м пикет самый натуральный хардкодинг и есть. Ты даные не только в код пихаешь, но и еще и по комментам размазал. Пиздец.
Все что на пике должно где-нибудь в БД лежать, на крайний случай в конфигурации. А в самом коде тебе дожно быть до пизды какое амплуа, в каком голосе лежит. Ты с абстракцией должен работать.
Да, логично. Спасибо.
А в каких случаях употреблять enum? Где грань между харкодингом и перечислением констант?
И второй вопрос: как за собой тащить конфигурации, если делаешь библиотеку? Добавлять файлы в ресурсы — глупость и своего рода тот же хардкодинг.
Ты дурачок бля, я говорил что я программист? Я сказал, что я вкатун. Начал вкатываться через шарп буквально пару - тройку дней назад. Успокойся пжлст.
Запихнул в джейсон файл и десериализую в класс Voice.
Файл копирую при сборке как внедренный ресурс в условную папку Data. Дальше юзер библиотеки сам хочет вручную созадет экземпляр Voice, хочет десериализует файл.
Как-то так. И самое главное, вопрос о выборе итемов отпал сам собой, если эти данные привязать к UI.
https://youtu.be/1hmUZx8DIWo
Хачатуру платить 500р влом. Я видел в яндекс клауд SpeechKit Brand Voice возможность создавать собственные голоса, но там похоже речь идет о небольших фразах или вставках в уже готовые сегменты аудио.
>Хачатуру платить 500р влом.
В итоге там будет "установите мою программу" без cmd, смс и регистрации.
Я как раз знаю, как это делают обычно - по твоей ссылке просто готовая картинка используется, потому и спрашиваю.
so-vits-svc
>>754241
Практика показала, что фейковые градиенты наиболее эффективны. Только контуры делают векторными, чтобы не было "мыла".
Я тебе больше скажу, что в фотошопе еще и кружочек цветопробы фейковый. Во время его перетаскивания, на самом деле он прячется и иконка курсора меняется на имитацию этого кружочка.
Добиться подобной скорости при честной отрисовке градиента не представляется возможным на впф или формсах. К примеру видеорил 1 - это как реализовано в программе Corel Draw, где честный прямоугольничек поверх градиента следует за курсором. Безусловно там стоит таймер, но чисто ради стабилизации фпс (я пошел сперва по этому пути и скажу, что без ограничения, фпс получестя нестабильным). На втором видео то, как реализовано в Photoshop - в данном случае при зажатии ЛКМ иконка курсора меняется на кружочек и никаких тормозов при перерисовке нет.
Интересно почему перерисовка курсора не заставляет перерисовываться UI-элемент целиком?
Само градиентное поле выбора тоже фейковое и состоит из послойно накладывающихся друг на дурга градиентов. Одна из причин, почему рядом всегда есть окно, отображающее истинный цвет.
254x316, 0:04
Canvas у которого BackgroundBrush это хитрый VisualBrush, у которого внутри Rectangle с LinearGradientBrush + OpacityMask. У Canvas один чайлд - кружочек, который по MouseMove по этому канвасу двигается. Вроде нет никаких проблем с фепесами.
В плане брашей, впф просто маппит функции Direct2D. Так что все вопросы к разрабам DirectX тоже майкам.
> Canvas один чайлд - кружочек, который по MouseMove по этому канвасу двигается. Вроде нет никаких проблем с фепесами.
Можно наследоваться от canvas, переопределить onrender и рисовать кружочек в drawingcontext, так должно быть еще эффективнее.
Возможно, но ты еще не добавил кучу говна, типа окна расширенной цветопробы, и списка цветовых каналов в разных цветовых схемах RGB, HSB, HSL, HEX, обновляющихся параллельно с передвижением курсора.
Так же непонятны размеры градиентной области, где происходит перерисовка. Чем она больше, тем выше затраты.
И почему ты решил шатать OpacityMask вместо трансформаций обычного ректенгла? Выглядит так сложно, как будто это хитрый план.
Алсо, просто интересно, ты решил проблему со скругленными углами твоего градиента? Я тоже пытался так делать, но было либо сложно, либо нелогично выставить ноль\максимум в этих самых углах. Я от радиусов отказался в итоге.
Что мешает выучить и его? На самом деле питон лезет из всех щелей, тоже подумываю к нему приобщиться.
Так учи питон в чем проблема?
Перекат из языка в язык дело месяца-двух.
Хоть и сложно даунгрейдиться до питона, но раз бабло нужно то в путь, а вообще за баблом иди в 1С, там его тонна и тележка.
Некоторые питонисты наоборот изучают шарп. Стремление к неизведанному и выстраивание иллюзий — это нормально.
В пизду, пойду на сво, посижу по максимуму на 2 сотыги, потом отпилю себе ногу и буду сычевать на пособиях. Не хочу я больше вкатываться.
в смысле проебал?
если ты чисто за баблом идешь, то зачем тебе что-то кроме 1С ?
ИТ это вечное обучение и для людей которым это нравится, за исключением какой-нибудь легаси поддержки в швейцарском банке где ты еще перфокарты ворочить будешь (не шутка)
>если ты чисто за баблом идешь
А зачем ещё нужна работа бля? Если бы я был миллиардером я бы плавал в батискафе смотреть на Титаник.
>1С
Я ебаль закон в рот это говно. Сейчас работаю админом, не хочу в этом копаться.
>вечное обучение
Невозможно бесконечно обучаться. Во-вторых, что значит обучаться? Сидеть по 10 часов в день? Я тебя умоляю никто этим не занимается, иногда пощупаешь новую приблуду, почитаешь доки мельком, если есть конкретные задачи можно почитать плотнее. Это несоизмеримо проще чем вкатываться с нуля. Кто в разработке работают, тоже самое говорят, ну пощупаешь фреймворк новый, где-то подчитаешь что-то.
Очередное выстраивание иллюзий по неизведанному. Ты думаешь, что отпилишь себе ногу сам, но на самом деле отпилят тебе жопу .
В средние века, когда еще не все территории были изведаны человечеством, существовала такая карта как "маппа мунди", суть которой в том, что на неизвестных территориях обязательно жило какое-то необычное существо, вроде моноподов — людей с одной ногой при рождении. Никто не знал, что там на самом деле, но разве это мешало предполагать и фантазировать? Не исключались локальные конфликты на тему "а вот у нас тут нихуя нет, а вот у моноподов есть всё!".
Только "разведка территории" поставит твои мозги на место. Изучай питон и возвращайся.
ну тут такое дело
уже сидящие на шарпе они нашли где им его применять и денежку загребать
И в общем то они не в курсе ситуации с поиском заработков.
лично я зарабатываю на шарпе, но знаю и активно использую питон также.
дык простой скрой
а начинать нужно про что вообще речь
ибо убрал аттрибуты окна в впф просто выставить одно свойство.
WPF? Неправильно делаешь.
Во-первых у окна есть своства специально для этого
WindowStyle - поперебирай опции. Без хидера это 'none'.
Если надо что-то фигурное, типа скругленных углов, то юзай еще AllowTransperency — опция убирает черный бэкграунд, делая основу окна прозрачной. Но у этого подхода есть минусы — пользователь не сможет менять размеры окна, там надо небольшой изворот делать.
Во-вторых шатай Style для определения визуального стиля UI-элемента.
Если захочешь сделать свой кастомный хидер с функцией перемещения окна и т.д., то ради бога не используй таймеры и прочее говно. Используй Behaviors.
бестолочь, и что этот вызов должен был сказать?
может ты просто дурачок (а на это вполне похоже ибо строишь из себя и считаешь что все вокруг должны быть телепатами которые разбираются в твоем безумии), что не знает как делать штатно, и поэтому делаешь через винапи
> Если захочешь сделать свой кастомный хидер с функцией перемещения окна и т.д., то ради бога не используй таймеры и прочее говно. Используй Behaviors.
Есть же windowschrome. Можно указать любой размер хидера, он будет прозрачным и за ним можно любой контент располагать.
Если ли способ способ закрыть/выгрузить/задиспозить впфшный Page. Пусть даже способ хаковый. Условие - я не владею впфшным Window, которое этот Page хостит. Ни ссылки, ни малейшего намека, где это виндоу находится нет.
Что-то типа FindWindow и перебрать конпки, кока не найдется крестик? Это совсем не то.
Я так-то в домене этой приложухи нахожусь. Апишки дергаю. Приложуха сама умеет решать, когда нужно выгружать мое Page, и когда просить новое, чтобы показать пользователю. Однако делает она это плохо и все идет по пизде. Все что мне нужно, выгрузить Page самостоятельно, заранее. Но вот беда на нем нет ни Dispose, ни Close, ни Unload. Нихуя.
Вот я и подумал, может есть впфшный хак, как объект Page саботировать. Там же целая история с наследованием в рамках фреймворка.
Есть интерфейсный метод, который возвращает FrameworkElement кажется. Во всех гайдах это либо Page, либо UserControl. Я пробовал туда Window отправить, но получаю исключение. Что-то вроде "виндоу не может находится в иерархии так низко". Ну понятно, что там свое окно, которое хостит всякие FrameworkElement'ы типа Page. Вот только к этому объекту окна, чтобы вызвать на нем Close, не подобраться методом апишки приложухи, которая использует этот впфшный механизм.
Может есть хитрый вариант что-то к чему-то привести в рамках типов впф и дернуть на этом какую-нибудь херню, чтобы все посыпалось нахуй?
Я его использовал для возможности изменения размеров в режиме WindowStyle=none. Не знал про хидер.
>Я пробовал туда Window отправить, но получаю исключение.
>Ну понятно, что там свое окно, которое хостит всякие FrameworkElement'ы типа Page.
Естественно, Window не является UI-элементом.
Кстати Page тоже своего рода исключение из поведения других контролов, это бяка характерна тем, что изолирует контент внутри себя. Нужно очень постараться, чтобы найти применение ему — например, если у тебя какой нибудь браузер. В любых других ситуациях нужно наследовать другой контрол.
>Есть интерфейсный метод, который возвращает FrameworkElement кажется.
Я не совсем понимаю. Метод возвращает FrameworkElement тебе или домену?
Ты можешь свой контрол сделать Disposable и при unloaded событии твой контрол задиспозится автоматом. Что происходит со предыдущим элементом если запихнуть туда новый?
>Все что мне нужно, выгрузить Page самостоятельно, заранее. Но вот беда на нем нет ни Dispose, ни Close, ни Unload. Нихуя.
Во-первых, ты должен сам реализовать интерфейс IDisposble с методом Dispose, где ты выгружаешь всю потенциальную бяку, мешающую CG добить твой контрол. При событии Uloaded будет автоматически вызван Dispose (должен).
>При событии Uloaded будет автоматически вызван Dispose (должен).
Точнее ты подписываешься на событие Page.Unloaded и оттуда вызываешь метод Dispose.
Какие элементы мешаю помереть Page? Что именно как ты пишешь
>Однако делает она это плохо и все идет по пизде.
?
Почему локализация в WPF'е это такой пиздец?
Неужели нету лучшего способа чем выносить абсолютно все строки с UI в код бихайнд и биндить их?
И нихуя не работает - в рантайме после запуска окна не переключишся как с обычными строками, нужно задавать культуру перед инициализацией компонентов и срать пользователю окошко о том что ему нужно перезапустить приложение.
Обращайся.
Винапи это сишный интерфейс, а ты приперся в тред веб-макак которые знают только HTTP200.
активно использую винапи в WPF
но когда в тред приходит чудо которое вываливает "догадайтесь че у меня" и еще ведет себя как быдло, то правильно послать его
Локализацию лучше вообще хранить в xml или json, а потом десериализовывать в словарь ресурсов.
>>755820
А почему статик, а не динамик? Динамик позволяет обновлять изменения. Статик хоть и мене рексурсозатратен, но по факту экономия не такая уж и большая, а иногда ее вовсе нет. Статик юзают только в тех случаях, где не работает динамик.
>>755922
Как в случае с темой 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.
А что будет, если ты изменишь содержимое экземпляра Page, который ты отправил в приложуху? Будут ли фиксироваться изменения в этом приложении?
В этом 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; }
}
Что должно быть на выходе:
int[][] CallsCount; //[24,60]
Собственно, я нахуячил такое вот охуенное условие
((StartedAt<=startDt || (StartedAt >= startDt && StartedAt <= endDt)) && CompletedAt == null) // звонок еще идет
||((StartedAt<=startDt || (StartedAt >= startDt && StartedAt <= endDt)) && (Completed != null && ((Completed>=StartedAt && Completed<=endDt)||(Completed>endDt))))
Оно - работает и работает как нужно.
Но меня смущает что это пиздец какая громоздкая конструкция.
А как ее упростить - я хз.
Есть какие-нибудь сервисы для упрощения вот таких вот монструозных условий?
Ну. Сейчас вижу, что чутка можно упростить
((StartedAt<=startDt || (StartedAt >= startDt && StartedAt <= endDt)) && ((CompletedAt == null) || ((Completed>=StartedAt && Completed<=endDt)||(Completed>endDt)))
Все еще выглядит монструозно.
Если ты у себя в экземпляре Page очистишь содержимое Content, то в хосте это тоже очистится?
Page это же просто контейнер, который в идеале должен существовать на протяжении всей сессии. Я нихера не понимаю. Зачем ты шатаешь webview, если надо очищать Page, который запустит Unloaded webview?
Ты прибил гвоздями webview к page и страдаешь.
У вас же тут ниче крутого в принципе не существует. Куча фич, но кто-то вообще их использует? Еще расскажите как вы коллекции кортежей юзаете или что-то подобное, это просто курам на смех.
Ты с инопланетянами общаешься? Ты ведь даже не знаешь какие у кого задачи.
Я вот хочу перекатиться в няшный шарпик из блевотной жабы. Пыху вообще языком не считаю.
Лол, зачем с говна на говно? Любишь говно? Говноед-шарпо-джаво-блядун? Вот это микс!!!
>если надо очищать Page, который запустит Unloaded webview
Просто скажи куда нажимать, чувак. Я завтра попробую.
Ну. Давай я расскажу.
У меня, в детстве, хуй пойми откуда была здоровая такая книга что-то про .NET3.5
В ней шел диск, на котором была ВижуалСтудио.
Собственно. Вот представь, ты хуй лет 12, ты кодил на Паскале всякие задачки в школе. А тут тебе шарп в руки попадает. В котором и окошки делать сразу можно, а не непонятную консоль, и куча штук для работы со списками-колекциями, и, блядь, СТРОКИ удобные, а не как в ебучем Си, где ты ебись с этими строками сколько хочешь, все равно выебут тебя.
Ну так вот. Беру я, и начинаю всякую билеберду делать: решалка уравнений, чтобы просто вбить уравнение из задачника и решить, принести марьванне; и всякие игрульки текстовые(СТРОКИ НОРМАЛЬНЫЕ, БИЛЯДЬ); игрульки НА ФОРМАХ в духе мархухена или маривы; мамке бухгалтеру - программулину, чтобы заполняла как надо отчеты в экселе. А потом - иду я в вуз, а там ООП начинают объяснять, и, блядь, НА ШАРПЕ.
Собстенно. К чему я. К тому, что шарп - это первый язык, которым, блядь, УДОБНО пользоваться. Ты не ебешься с ним, а делаешь то что тебе хочется, просто, быстро, без всяких непонятных игришь с системами сборок, знаний арифметики указателей, миллионов непонятных библиотек, которые хуй пойми как подключать, окружения в десятки гигов, чтобы блядскуий хелловорлд вывести, никаких непонятных несовместимостей, когда ты копируешь код, а он, блядь, не работает, потому что хуйло решило, что теперь надо так а не так. Нет, блядь, ты просто берешь и делаешь что тебе хочется, при этом ты не ограничен был вебо-парашей, не ограничен консольками, единственное ограничение было - винда, но нахуй что-то кроме винды так-то надо?
Собственно. Вот так я и полюбил шарп. Да. Шарп это комфорт, шарп это жизнь. И даже, если сейчас, я старый хуй, который и на плюсах пару лет поработал, и в жаву наступил, и даже поддерживал код на ебучем ПХП, я все еще считаю, что шарп - это любовь, жизнь, процветание. Единственно чего бы я хотел для шарпа - это отвязку от майков, какой-нибудь Open.NET. А так - шарп - любовь. Да.
Ну. Давай я расскажу.
У меня, в детстве, хуй пойми откуда была здоровая такая книга что-то про .NET3.5
В ней шел диск, на котором была ВижуалСтудио.
Собственно. Вот представь, ты хуй лет 12, ты кодил на Паскале всякие задачки в школе. А тут тебе шарп в руки попадает. В котором и окошки делать сразу можно, а не непонятную консоль, и куча штук для работы со списками-колекциями, и, блядь, СТРОКИ удобные, а не как в ебучем Си, где ты ебись с этими строками сколько хочешь, все равно выебут тебя.
Ну так вот. Беру я, и начинаю всякую билеберду делать: решалка уравнений, чтобы просто вбить уравнение из задачника и решить, принести марьванне; и всякие игрульки текстовые(СТРОКИ НОРМАЛЬНЫЕ, БИЛЯДЬ); игрульки НА ФОРМАХ в духе мархухена или маривы; мамке бухгалтеру - программулину, чтобы заполняла как надо отчеты в экселе. А потом - иду я в вуз, а там ООП начинают объяснять, и, блядь, НА ШАРПЕ.
Собстенно. К чему я. К тому, что шарп - это первый язык, которым, блядь, УДОБНО пользоваться. Ты не ебешься с ним, а делаешь то что тебе хочется, просто, быстро, без всяких непонятных игришь с системами сборок, знаний арифметики указателей, миллионов непонятных библиотек, которые хуй пойми как подключать, окружения в десятки гигов, чтобы блядскуий хелловорлд вывести, никаких непонятных несовместимостей, когда ты копируешь код, а он, блядь, не работает, потому что хуйло решило, что теперь надо так а не так. Нет, блядь, ты просто берешь и делаешь что тебе хочется, при этом ты не ограничен был вебо-парашей, не ограничен консольками, единственное ограничение было - винда, но нахуй что-то кроме винды так-то надо?
Собственно. Вот так я и полюбил шарп. Да. Шарп это комфорт, шарп это жизнь. И даже, если сейчас, я старый хуй, который и на плюсах пару лет поработал, и в жаву наступил, и даже поддерживал код на ебучем ПХП, я все еще считаю, что шарп - это любовь, жизнь, процветание. Единственно чего бы я хотел для шарпа - это отвязку от майков, какой-нибудь Open.NET. А так - шарп - любовь. Да.
Люблю конфеты, потому и хочу шарпик. Жаба - говно, да. Пхп и другая пыхоплеяда - понос вперемешку с мочой и блевотиной.
Всё то же что ты описал есть в PHP, кроме того что он привязан к вебу - единственный недостаток. В PHP даже ООП шире и ярче играет, чем в Шарпе или Жабе, оно тупо удобное. И объявление переменных моё любимое конечно.
Page.Content = null;
Когда ты у себя в 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). Это надо учитывать.
Grid myGrid = new();
myGrid.Children.Add(new Button())
Page myPage = new();
myPage.Content = myGrid;
фикс
2023 год @ искусственный интеллект тебя заменит.
На вью есть несколько панелей, видимость которых должна зависеть от комбинации этих свойств.
Как это сделать?
IMultiValueConverter не хотелось бы - на каждое сочетание нужен будет отдельный конвертер в другом и параметры должны идти в определенном порядке.
Я думал можно сделать что-то типа такого:
<Binding Converter={BooleanToVisibilityConverter}>
____<Multibinding Converter={BooleansToBooleanAndConverter}>
________<Binding Path=Prop1/>
________<Binding Path=Prop2/>
________<Binding Path=Prop3/>
____</Multibinding>
</Binding>
Но так нельзя.
>В PHP всё гораздо проще и удобней, сделано для людей
ох насмешил. ладно бы хоть питон был, но пхп...
ну делай обычный конвертер, какая проблема
В треде есть некроёбы?
У меня случилась просто неведомая ебаная хуита:
Делал я когда-то один небольшой проект пару лет назад, и тут заказчик внезапно ожил и попросил допилить небольшую фичу. Открываю проект - студия говорит что 4.5 фреймворк на котором был проект уже выпилили и вот бери обновляйся. Я без задней мысли обновился на 4.8, начал пилить фичи, попутно их тестил, все было норм. Затем когда допилил, решил что стоит пройтись по всему проекту на всякий случай и тут почалось. В месте где идет обращение к XmlSerializer (System.Xml) вылетает эксепшн:
Не удалось загрузить файл или сборку "Проектнейм.XmlSerializers, Version=Версияпроекта, Culture=neutral, PublicKeyToken=null" либо одну из их зависимостей. Не удается найти указанный файл.
Причем в том месте я вообще никаких изменений не делал.
В проекте он присутствует, вскрывал дотпиком новую и старую версию - библиотека 4.0.0.0, идентичная.
Далее еще интереснее - у меня есть этот же проект, с обновленным фреймворком, но без изменений и если его запустить в дебагере - он тоже выдает эту ошибку, но если запустить просто exe в папке debug - он нормально работает. Но с измененным проектом такое не работает.
И если поменять название в свойствах сборки он вообще не запускается и выдает ошибку как выше только уже не пишет какую либу он не может загрузить. И дальше начинает спамить что поток не может получить доступ к объекту другого потока пока не словит стековерфлоу.
Кто-нибудь встречался с подобной хуитой?
Сегодня я конечно еще попробую создать совсем новый проект и руками перетащить файлы туда, и возможно потыкать разные версии фреймворка, но я не уверен что это поможет.
Это они че, спустя столько лет, добавили наконец этот диалог выбора папки? или че вообще
Одебиливший от динамикодрисни скриптозависимый вебпарашепыходебил, спок
> The WinForms dialog in .NET Core uses the newer API already
Ясно. Как обычно, нужно просто юзать няшные винформы вместо костыльного WTF.
Спасибо за ответ.
Подвожу итоги целого дня пердолинга.
Идея не использовать гвозди для размещения webview на page оказалось отличной - я сделал именно как ты написал. Благодаря этому удалось закрыть часть кейсов, когда webview нужно срочно уничтожить ради работоспособности всего домена. При этом Page может продолжать работать как ни в чем не бывало. Это то, что нужно.
Однако без подводных камней не обошлось. Обнаружилось парочка проблемных сценариев. Там происходит какая-то хуйня с переключением контекста, потоками и таким прочим.
Может так случиться, что основной поток приложухи, который является так же основным для окна, в котором живет мой Page, кладет прибор на это окно из за чего оно виснет. Эта забывчивость чинится хитрым костылем. Но причина не ясна.
И вторая проблема связана с инициализацией webview. Может так случиться, что оно не инициализируется. Есть ряд действий с приложухой, которые к этому приводят. Но это довольно искусственный сценарий. Скорее всего пользовательский, относительно меня, код делать так не будет.
смешная попытка. тут как бы и пхпшники сидят
вот я пхпшник еще со времен пхп 3 (на пхп уже СЛАВА КТУЛХУ не пишу, но приходится поддерживать проекты пхп 7)
так что твои потуги для меня выглядят смешно
> да ты крут. я за десятки лет не знаю нахрена нужен Page если есть юзерконтрол
Для навигации внутри фрейма.
это просто контрол. самый обычный контрол, с которым просто работаешь и не мудришь костыли. навигация делается элементарно и как угодно.
А вот с фрейм+пейдж какая то пляска с бубном
Есть одна проблема. Почему то отображается не все содержимое страниц с документацией. Например, на этой странице https://learn.microsoft.com/en-us/aspnet/core/tutorials/razor-pages/razor-pages-start?view=aspnetcore-7.0&tabs=visual-studio-code должна быть строка Required assets to build and debug are missing from 'RazorPagesMovie'. Add them? но ее не видно. Хотя она есть в исходном коде страницы и в сохраненной копии из гугла. Отключил блокировщик рекламы. В чем может быть проблема?
Ну и зачем они удалили это из новой документации? Дебилы.
static void Main(string[] args)
{
decimal data;
decimal data2;
double a = 35.4;
double a2 = 32.5;
Console.WriteLine("Enter the amount in rubles to buy a dollar.");
data = Console.ReadLine();
decimal result = a * data;
Console.WriteLine("Enter the amount in rubles to sell a dollar.");
}
}
}
Нахуя?
Видос очень тяжело смотреть, хуесос за кадром пять минут тянет сиську под смешные картинки а мыслей интересных нет.
Я работаю в embedded отделе, у нас в разных проектах по нужде или предпочтению обычно юзают:
Verilog/VHDL
Asemmbler
C
C++
Bash
Python
Что я нахуй буду делать с шарпами. Игры писать?
>Что я нахуй буду делать с шарпами. Игры писать?
То же что и с
>Verilog/VHDL
>Asemmbler
>C
>C++
>Bash
>Python
как работодатель скажет, на том и будешь писать, и на шарпе и на бейсике будешь, никуда не денешься, раб_отник на раб_оте.
Я старый 30 летний дед скуф.
Мне физически уже тяжело смотреть видео со смешной подачей. Особенно, когда нихуя не смешно.
Я этого говна наелся и меня от него воротит. Это ебаный кринж.
Твоя хуйня не компилируется! У тебя не может быть бинарника с кодом! Как я тебя подъебал, а? а? а?
Тебе прямо написано что нельзя СТРОКИ умножать на ДЕЦИМАЛ, что ты вообще ожидал от этой операции?
Второй случай тоже туповат, скасти одно из чисел к типу второго операнда
>>753902
>>758790
>>758795
>>758802
>>758810
Всё короче, написал. Конвертер трёх знаковых валют в консоли с курсом прямиком из 2007 года (который никто никогда не вернёт) (но я хотя бы попытался). Сам, без чей либо помощи и не списывая с других. Нужно было просто как следует разобраться в типах данных, посидеть и подумать немножко.
Пиздец вы спецы. Не смогли мне, вкатуну, объяснить как написать консольную хуйню уровня первоклашек. Чего там парсить? Чего там скашивать? Всё же просто как в аптеке. Я с вас в акуе короче, двощеры блядь. Но всё равно, спасибо.
Обращайся.
Сижу на одном и том же ЯПе, в доку по фреймворку заглядываю максимум раз в неделю.
подсказать не можем (ты ж не слушаешь)
можем только обосрать
1 короткие имена переменных.
2 спагетти код. ненависть к словарям?
3 а что будет если вместо числа я введу "абырвалг"?
4 а что если люблю вводить 1.2, а иногда 1,2?
5 зачем мне много знаков в результате после запятой? это ж деньги не?
6 хули не децимал
>1
И что с того?
>2
Не понял тебя.
>3
Приложение крашнется
>4
Приложение крашнется. Ты кстати в обменном пункте тоже покупаешь или продаёшь не 50 баксов, а 56.8?
>5
После какой запятой?
>6
Не знаю. Ругается чёт и выводит ошибки.
1 поймешь сам когда через год посмотришь на свой код. Ну или коллеги по работе (хотя о чем это я) тебе расскажут...кулаками
2 все это словоблудие можно было оформить словарем валюта-курс и в цикле красиво пройтись
3 как и твоя зарплата
4 в обменном пункте поле мне ЗАПРЕЩАЕТ ввести не то, консоль же позволяет ввести что угодно.
5 деньги это 2 знака после запятой. дальше не очень интересно. дабл же выведет тучу знаков. хот бы округлил до 3 знаков
6 ругается на то что стринг и децимпал перемножаешь? не пробовал децимал * децимал? чет с даблами и интами тебе не мешает перемножать, а с децималами какие трусы стринги у тебя
Бля, пчел... Ты такой важный прям пиздец. Еще раз мой пост прочитай. >>753843 Требовалось написать простенькую, консольную хуйнюшку.
>Ну или коллеги по работе (хотя о чем это я)
Ты о том, что я типа работу себе не найду. Все вы айтишники токсичные, аж пиздец.
>коллеги по работе тебе расскажут...кулаками
Я думаю коллеги по работе не вывезут мне что-то на кулаках объяснять.
>2
Ок.
>3
Оййй бляяя... сукааа рукалицо. Токсик ты ёбаный.
>4
Ок.
>5
Не понимаю тебя, но ок.
>6
Не даёт мне среда разработки создать переменную с decimal с нужным мне значением. Подчеркивает красным. Вот видишь? Всё исправил на Децл, но всё равно ошибка, а что это за суффикс "М" я хз.
>написать простенькую, консольную хуйнюшку.
если ты не знаешь базовых типов и зачем они нужны, то ты даже не ждун
>Ты о том, что я типа работу себе не найду. Все вы айтишники токсичные, аж пиздец
о том что за использование децимал любой уважающий себя джун который только полчаса назад узнал что такое си шарп просто бы офигел от твоего кода
>3
а ты учись сразу быть правильным программистом. иначе че сюда пришел?
>Не понимаю тебя, но ок.
ну будь реалистом. пусть результат будет все таки округлен. ну хотя бы до 6 го знака для особых любителей резать коейки на части.
>Не даёт мне среда разработки создать переменную с decimal
ну добавь ты м. жалко что ли
а так среда думает что ты децималу пытаешься присвоить дабл
Ну я так не умею еще. И тем не менее на выходе у меня получилось симпатичнее чем у тебя :3
>>759288
>то ты даже не ждун
Естественно я не ждун. Я ничего и не жду. Я действую, бро.
>о том что за использование децимал любой уважающий себя джун который только полчаса назад узнал что такое си шарп просто бы офигел от твоего кода
Блядь, так и не использовал децимал. У меня изначально дабл было.
>ну будь реалистом. пусть результат будет все таки округлен. ну хотя бы до 6 го знака для особых любителей резать коейки на части.
Я не знаю как округлить. Да и зачем? У меня ведь всё равно получилось так, как в настоящем конверторе.
>ну добавь ты м. жалко что ли
а так среда думает что ты децималу пытаешься присвоить дабл
Да, добавил. Теперь нет ошибки. Спасибо.
>Я ничего и не жду. Я действую, бро.
действовать нужно в правильно направлении. иначе зачем
>Блядь, так и не использовал децимал. У меня изначально дабл было.
А ЧЕ? если речь идет про денежку (которой тебе никогда не видать) то сразу нужно децимал. в общем то он для этого и придуман
>Я не знаю как округлит
бедный человече забаненный в гугле. Зачем? ну давайв мгазе требуй "а где тысячные в сдаче? вы тут охуели что ли"
>Да, добавил. Теперь нет ошибки. Спасибо.
А неважно. камень в твой огород заготовлен (иначе бы я спал) так лови.
1. Сокращения. Нахуй и в пизду. Пиши полностью.
2. new() - лучше только для инициализации полей класса, в остальных случаях нихуя не очевидно что там за new
3. Копипаст, который можно было заменить goto
4. Магические числа
5. var в результатах математических операций - я бы уже позвонил хрюше и стал просить нового джуна искать
6. Копипаст
7. Парсинг зависящий от культуры, вместо того чтобы сделать универсальный парсер, который от этой самой культуры не будет зависеть
8. Листы там где лучше подошел бы словарь
Но да. Ты хотя бы стараешься и как минимум автоформатирование настроил. Это плюсик и я уже тебя не ненавижу.
ну есть 2 случая когда готу реально рулит (я правда их не помню, но точно они есть - один из них break N а второй не помню)
так что он не совсем ебаунутый
Ну, давай, няша. Показывай как ты красиво и элегантно без goto будешь делать такое.
А теперь серьезный ответ.
1. goto - нормальная практика, если он улучшает читаемость кода. Если ты умняша, который делает методы по 10к строк, то отсутстве goto не спасет тебя, а только хуже сделает.
2. В шарпе - goto - кастрирован до такой степени, что все претензии, которые к нему возникали в свое время - просто не релевантны.
3. Если уже про более лоулевел будем говорить, ну, давай, покритикуй мне jmp и покажи как ты без него что-то в принципе полезное напишешь
4. Если так уж доебываемся до goto, то давайте как у MISRA - еще и срать на continiue, break, рекурсию, динамическое выделение памяти и т.д.. Ну, хули, тоже пиздец плохие практики же. Вдруг наш код шарповский в какой-нибудь автомобиль засунут, а там рекурсия, памяти контроллеру не хватит и все, пиздец, убили человека.
Короче. Если goto делает код лучше - использовать я разрешаю.
Как майков можно серьезно воспринимать после такого? Срочно отказываемся от использвования стандартной библиотеки дотнета и переписываем без goto
покажи мне break N без готу и я это обосру )
>удалить
>запритить
Всегда знал и говорил, что Майкрософт - оплот свободы в этом мире рабства. Лишний повод пользоваться только их продуктами, хотя оно и так очевидно, альтернативы лютое говно: винда, офис, студия, что ни возьми, одни блистательные вины от подобий которых от других только блевать тянет от убожества, хуже китайских подделок.
А хули не опенсорсить, если одна половина мира сотрудники микрософт, а другая его клиенты. Тупо упрощение и удешевление процесса разработки. Они где-то там внизу конкурируют между собой, непрерывно перетекая из одной группы в другую...
>да ты крут. я за десятки лет не знаю нахрена нужен Page если есть юзерконтрол
Лично я столкнулся с отличиями когда пытался забиндить какой-то экземпляр к свойству собственного класса на базе Page. Чтобы я не делал, но элемент внутри тупо отсутствовал. И добродушный анон подсказал в чем особенность. Вот, передал так сказать знания по наследству.
>>758392
>В чем профит UserControl'а по сравнению с Page?
Скорее наоборот. Юзер контрол это просто минимальная(почти) основа для твоего контрола. Ничего не мешает делать свой контрол на основе Grid, к примеру.
Особенность Page в изолированности содержимого, часто это используют для безопасности в браущерах, чтобы случайно какое-то говно не пролезло наружу или внутрь.
pragma warning disable не думал использовать, умник хуев
> Что я могу поделать, если интерфейс 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. В принципе причина логична, но вообще возможно ли получить экземпляр класса, в котором прикрепяемое свойство находилось изначально? Зачем я вообще при регистарции указывал другой класс?
> по аналогии с обычным DependencyProperty, я ожидаю что в параметре d я увижу экземпляр класса, в котором находится прикрепляемое свойство,
Ну тут вопрос в том, почему ты это ожидаешь. Прикрепленное свойство, ровно как и обычное, возвращает экземпляр объекта, у которого оно было изменено.
> но вообще возможно ли получить экземпляр класса, в котором прикрепяемое свойство находилось изначально?
Насколько я знаю нет.
> Зачем я вообще при регистарции указывал другой класс?
Чтобы среда знала, где искать геттер и сеттер.
Ну штош, жаль что нельзя. Спасибо.
Спору нет конеш, но даже на пхп меньше вакансий, где требуют знание frontend-технологий, а зп такая же, вакансий больше. Зачем вам здался этот шарп? Вы же в России живете, а не там. Выбирайте по делу, а не по желанию и будете с пирогом, а если нет - будете сосать бибу.
> и будете с пирогом, а если нет - будете сосать бибу.
Сижу с пирогом ещё и нравится стек что как хобби на нём же
>Или чисто ищете бэк вакансии
This. На шарпе сейчас достаточно проектов с микросервисами в которых либо вообще нет фронта, либо он таков, что проще нанять одного-двух фронтедеров которые будут его вести, вместо распыления на это дело ресурсов кучи бэкендеров.
Поебать + похуй, но чел потерял берега. И учитывая его пристрастия к политоте, таким шизоидам не впервой всюду лезть и ебать мозги мнением, которого не спрашивали.
Здорово, что в интерфейсах можно писать бизнес-логику. Не могу дождаться, когда в интерфейсы добавят статические конструкторы.
Да мне сейчас в принципе важнее любая практика. Но раз уж об этом, то на что хры смотрят?
Практика - это не портфолио. В учебных целях можешь написать, к примеру, имиджборду.
Хры смотрят на то, где учился и какие у тебя хардскиллы.
Тогда будет ли нормальной практикой написать браузерный IRC клиент? То есть помимо всего прочего подразумевается реализация уже существующего протокола.
Да, пофиг что писать, можешь брать идеи хоть из картинки pro/g/ramming challenges.
Так же как и с бейсиком — ИТТ мимикрируешь под шарписта и все охуевают от твоей странности.
Надёжный план
> в ансейфе можно дикую анальную эквилибристику устраивать вплоть до оптимизаций через ссе/авх/етц...
Я как-то попробовал "просто" вставить нативный код с винапи, так понадобилась анальная эквилибристика с пробрасыванием в C++/CLI. При этом оно запускалось без возражений, но не действовало, кончилось тем, что я просто кинул в папку нормальный экзешник скомпиленный на нормальном С++. Кошмар. Динамикодрисня и нативный код это взаимоисключающие понятия. Что бы там ни кукарекали маркетолухи: "мы не хуже, слышите, не хуже!". Да, вы не хуже, потому что вы днище к которому понятие сравнения неприменимо, слишком велика пропасть разницы.
Почитай .NET API, посмотри самые популярные библиотеки и фреймворки.
Как вкатиться на гречневую работу? Заебало айти. Вы то там в 9 пришли в 6 ушли и голова не о чем не болит, а мне с 8 до 8 сидеть, еще и на выходных выходить, если не успеваю.
Учу изучаю пытаюсь в "программирование" полностью самостоятельно (молодость просрал, курсами не пользуюсь), но цель не стать программистом (хотя кому я пижжу, хотелось бы, просто понимаю, что уже всё проебал), а научится делать более-менее хорошо для себя, мечтал пилить всякое ещё со школы, но как-то некогда было просрал время впустую.
Так вот совет нужен как научиться делать более-менее хорошо. Есть у меня микроидея, на которой я учусь, так сказать, но я её миллион раз начинал заново, потому что каждый раз осознаю, что получается не оче и хочется лучше, постоянно пытаюсь придумать, как исправить/переделать, чтобы было заебись (для моего плинтусного уровня, само собой). Я не стремлюсь сделать прям "идеально", а просто хорошо.
Сейчас это просто монолитное однопользовательское однопоточное приложение на ВПФ с бинарной сериализацией. Хочется как минимум перейти на ЕФ и выделить из приложения бизнес-логику/домен (если я правильно понимаю эти... пусть будут термины), в общем сделать так, как делают цивилизованные белые люди, но я хз как научиться. Может есть хороший материал на почитать? Или законченный проект, в сорсах которого можно покопаться? Я какие-то находил, но там всё куцо, ужато и вопросов возникает больше, чем ответов.
тлдр: ткните в проект на ВПФ с МВВМ с ЕФ и ДДД.
Спасибо.
Вот и уёбывай в свой петухон.
>А в чем прикол вашего "шарпа"?
Чтобы программировать, дурачок. А для pip install "либа написанная на C нейм" есть петухон, да.
>Множественное наследование
Собственно, все что нужно знать про петухон.
>Тут даже множественной наследования нет как в
И нахуя оно нужно? Тут и с обычным наследованием макаки умудряются такого наговнокодить, я представляю какое говно они выдадут с множественным.
Вот тут паря делает небольшой сайт при этом выделяет всякие слои-хуи и т.д. В принципе норм для начала про крайней мере мне зашло
https://www.youtube.com/playlist?list=PLeY40vx99GXbqajpsCOQ-Vjb3Cp03u7jN
- Проект с сущностями для базы данных
- Проект для работы с локальными данным
- Проект для работы с различными api
- Проект с сервисами, который взаимодействует с двумя вышеназванными проектами
- Проект с интерфейсами, на который ссылаются все проекты за исключением проекта с бд.
- И наконец проект с гуем, который работает с сервисами из соответствующего проекта.
Все правильно сделал?
Что жирного? Картинки можно будет просматривать не только из локальных директорий, но и со всяких бур. База данных для присваивания картинкам тегов.
Лечится тем, что я захожу в файл <проджект_нейм>.csproj.user и чет там меняю, к примеру добавляя строку или пробел. Я думал это проблема бейсика, но в шарпе эта залупа тоже прослеживается. Обновление предпоследнее (если считать вышедшее 13ч назад).
Вот перезагрузка точно не поможет. Точнее, ошибка не будет возникать пока я не открою проблемный файл (и будет пропадать, как только его закрою). Чтобы в принципе исключить проблему, нужно чтобы студия обновила .csproj.user
Можно объявлять абстрактные (и виртуальные конечно тоже) статические методы в интерфейсе, которые обязан имплементить тип.
Это сделано для дженерик математики, но чувствую скоро мы увидим большое разнообразие применение данной фичи. Так сказать во всех галерах мира
А что это за серые подписи сверху заголовков? Статистика наследования, использования и прочее. Как это включить?
это code vision в райдере
потому что при
foreach(int elem =
в elem было СКОПИРОВАНО значение ячейки из массива. И что там с массивом дальше происходит - ей до одного места, она ссылается на копию. ДАЖЕ если то будет ссылочный тип - все равно это будет КОПИЯ ссылки.
нужен ref чтобы ссылалось именно на ячейку в массиве и видело изменения.
>>764226
>ДАЖЕ если то будет ссылочный тип - все равно это будет КОПИЯ ссылки.
И что? Любые копии ссылок - равнозначны, ссылаются на одно и то же. У тебя так устроена файловая система на компьютере. Имена файлов это лишь ссылки, обычно ссылка одна, но ничто не мешает сделать еще, и они все будут одинаковые, везде тот же самый файл - один.
1) Если тебе в foreach понадобился индекс для элемента коллекции - значит код изначально неправильный, переделывай. Это не значит, что так делать совсем нельзя, но это явно не твой кейс и ты даже близко не подошел к темам где это может понадобиться.
2) Вообще использовать foreach для массивов такое себе. Используй for и не выебывайся. Да и само использование массивов - тоже не айс. Учись сразу пользоваться коллекциями.
3) Foreach не используется для изменения содержания коллекции, только для работы с конкретными элементами и изменения их. Если тебе эта фраза кажется странной, то ты еще не дорос. Возвращайся к изучению, что такое коллекции, как работает итератор и отличию reference types от value types.
>3) Foreach не используется для изменения содержания коллекции
Используется, есть .ToList() делающий копию которую перебирает foreach, с помощью ссылок из которого манипулируешь настоящим списком.
>И что? Любые копии ссылок - равнозначны, ссылаются на одно и то же
ссылаться они будут на одно.
но сами ссылки разные. они чисто физически лежат в разных местах памяти. Один объект в куче и 1000 ссылок на него лежат в 1000 разных мест.
>У тебя так устроена файловая система на компьютере
2 ярлыка на рабочем столе ведущих на 1 файл - все равно физически 2 разных ярлыка. И если ты изменишь 1 ярлык, то второй ярлык об этом ни сном ни духом
ВСЁ ВСЕГДА копируется. Независимо от того ссылочный тип или значимый. Поэтому при передаче ссылочного типа (без ref) в метод ты не можешь перезаписать этот объект чтобы он изменился и за пределы метода. Ты всего лишь перезаписываешь ячейку памяти куда была скопирована ссылка.
Так и переменная elem хоть и знает о значении (или ссылке) что лежал в массиве, но ничего не знает про про память массива и если память массива будет изменена, то откуда ей об этом знать.
для этого есть ref locals - вот он позволяет сослаться на конкретную ячейку памяти без копирования значения этой ячейки.
Это я и так знаю. Я же не спрашивал почему elem=10 выдает ошибку. Вопрос больше теоретический.
>>764226
>>764310
А вот тут не понятно. С одной стороны, похоже это действительно так и работает. Если предварительно инициализировать массив, то Console.Write(elem) начинает выдавать именно эти значения. И что тогда получается? foreach создает копию значений всех элементов массива? Такого быть не должно. Массив же ссылочный тип. А если в нем миллион элементов, и что, в кажом foreach каждый раз будет создаваться миллион копий?
одна копия создаётся на каждом цикле
если у тебя массив из миллиона элементов, в итоге, у тебя будет миллион копий, но в конкретный момент времени будет лишь одна, если ты её не сохранишь где-нибудь ещё конечно
>в итоге, у тебя будет миллион копий, но в конкретный момент времени будет лишь одна
Ну то есть он типа по очереди копирует каждый элемент в одну и туже переменную? Все равно как-то не очень. Получается по памяти может расход и не большой, а по времени в целом в конце концов выходит тоже самое, что скопировать весь массив в новое место.
>а по времени в целом в конце концов выходит тоже самое, что скопировать весь массив в новое место.
С байтоебством тебе в C++
То что там ToList под капотом делает вообще поебать. По факту ты все равно получишь новую коллекцию, а старая останется неизменной. Нельзя внутри foreach делать какие-либо манипуляции с наполнением самой коллекции. С отдельными элементами на которые у тебя в коллекции ссылки можно делать что угодно, а вот заменять/удалять/добавлять сами ссылки в коллекцию - нельзя, только собирать новую.
>Массив же ссылочный тип
какая разница если фореач на каждой итерации работает с ЭЛЕМЕНТОМ массива, а не с массивом
так что если в нем миллион элементов, то да, будет миллион итераций и на каждой будет создана копия значения очередной ячейки массива.
>что скопировать весь массив в новое место.
тебе копировать или работать с элементами?
не нравится - не копируй, работай через for, плоди ref. Вот только это стоит того только если у тебя там большие структуры или очень очень горячий кусок.
Вон при каждом вызове метода, коих в коде миллионы могут быть, тебя же не смущает копирование параметров...и ты не пишешь поэтому одну гигантскую 10000строчную портянку (хотя судя по скрину пишешь )))
>Вон при каждом вызове метода, коих в коде миллионы могут быть, тебя же не смущает копирование параметров...
джит смущается и где надо сделает портянку
нет не сделает. даже если его попросить сделать "агрессивный инлайн", то все равно далеко не всегда сделает.
тут вам не котлин с его настоящими инлайн функциями
значит там "не надо"
Как сделать так, чтобы на экран консоли выводился текст в скобке, а не просто "true"?
Что я запустил? Мне нужно чтоб текст в скобках в консоли отображался, а этого не происходит.
Ты не то запускаешь. См. справа Обозреватель решений. У тебя по умолчанию Test запускается, а тебе нужен Test_2.
Да да, я уже сообразил. Спасибо.
Привет, може ли как-то GC влиять на стек или он только кучу чистит?
Так то в любом языке сборщик занимается только кучей. Что конкретно тебя заставило сомневаться, что в C# это не так?
Да хуй знает, наверное здесь чувак оговорился просто https://www.youtube.com/watch?v=MgPbUjpONRQ&t=1040s&ab_channel=%D0%9C%D0%B8%D0%BD%D0%B8-%D0%BA%D0%BE%D0%BD%D1%84%D0%B5%D1%80%D0%B5%D0%BD%D1%86%D0%B8%D0%B8CLRium
Нет не оговорился. Span-ы это указатели на область памяти, а не на стек. И потому GC знает про span чтобы уплотнять память и не похерить их.
А вот в старом дотнете они сделаны через костыли - там неполноценные span
но там же некрофилы
а второне нужно?
Хочу рантайм который не падает от необработанного исключения в async void в пользовательском коде.
Я не понимаю, почему нет возможности через конфигурацию переопределить это поведение, без пердолинга на плюсах.
То есть async void существует, Assembly.Load() существует, Activator.CreateInstance() существует. А блядскую политику поведения при необработанном исключении, для собственного домена, переопределить нельзя. Без пердолинга на плюсах.
Скорее всего из за мультиплатформенной парадигмы. А может потому что домохозяйкам не положено безусловно убивать потоки, которые могут оставить после себя неосвобожденные ресурсы.
запретили потому что нет гарантий сохранить валидное состояние программы. Альтернатив не дали.
>>765162
Нуууу.
Я дам тебе только направление
Ты знаешь про 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 и на тебя снизойдет просветление, что нужно брать котлин - там скриптинг искаропки
Есть кастрированный аналог - Thread.Interrupt()
А если поток выполняющий пользовательский код не Dispatcher?
>задай свой SynchronizationContext
Спасибо за совет. Можешь код показать?
Нет. Я не знаю как решать твою задачу.
Мне понятно только одно - в случае async void исключение будет выброшено в текущем SynchronizationContext.
Я хз как Dispatcher разбирается когда исключение является именно unhaтdled. Ну ладно у него там 1 поток в котором он работает, а тебе нужно мудрить SynchronizationContext с бэкендом на тредпуле и хз как тут быть.
Даже если ты разберешь исходник класса Dispatcher (а то и вообще весь его просто перенесешь) и поймешь че да как, то все равно легко запустить async void без контекста и все упадет.
Хутиу какаю-нибудь одному тебе интересную говнокодить. Потом рефакторить и опять говнокодить. И так покругу.
да все просто
напиши свой двач, свой твиттер, свой фейсбук, свой вк
пересади на них весь мир и сможешь использовать их в портфолио и устроиться на на работу за 25тыс
С прошлого треда:
1) Электронная очередь. Учитывая все ньюансы. От выдачи номера, до распределения к кому из операторов клиент попадет на обработку, с учетом того, что задачи у посетителей могут быть разные и что у операторов тоже разная области ответственности. И все должно идти ровно и без долгих простоев. Если делать по честному от и до, то сможешь проработать дохуя ньюансов, о которых не стыдно будет рассказать.
2) Роутинг электронных сообщений. Это когда в какой-нибудь каталог на диске или сетевую шару постоянным потокам сыпятся xml-ки в охуительных объемах и их нужно оперативно оттуда разбирать, обрабатывать согласно бизнес-процессу и передавать дальше, попутно сохраняя нужную инфу в БД и выкидывая нужные ссобщения. Тут тоже дохуя приколов от многопотока, до разбора ЭС и т.д. И как бы тупо это не звучало, но это до сих пор стандарт и куча B2B взаимодействия происходит в таком виде (да-да никаких очередей вам сучечки). Поэтому нужно не просто уметь делать такие вещи, а делать их быстро и эффективно. Вплоть до того, что тебе тупо могут дать xml-ну на несколько тысяч строк и без всяких спеков и xsd схем и ты должен уметь ее разобрать и встроить это в существующий БП.
1. Пиздец. Кто мне тз на это всё напишет?
2. То же самое, плюс нихуя не понятно про "охуительные объёмы". Гигабайт в секунду? Тысяча xml по гигабайту каждый в секунду?
>1. Пиздец. Кто мне тз на это всё напишет?
Вот заодно и в этом тоже и потренируешься. Если ты думаешь, что на реальной работе тебе кто-то будет составлять ТЗ описанные более подробно чем здесь >>766388 , то ты ошибаешься.
Просто зайди на почту или в любую другую контору в которой где есть очердь по талонам, посмотри как там все происходит и сделай что-либо подобное.
>>766411
>2. То же самое, плюс нихуя не понятно про "охуительные объёмы". Гигабайт в секунду? Тысяча xml по гигабайту каждый в секунду?
Ну возьми для начала штук 3 миллиона в день, с пиком в тысяч 100 в час. XML достаточно килобайт по 20 там не размер важен,а содержание, плюс уметь это разбирать так, чтобы потоки друг с другом за файлы не дрались. Для примера можешь взять, ну хуй знает, ЭТРН какой-нибудь и попробовать доставать из него часть информации и формировать на их основе какие-нибудь свои данные, плюс можешь потренироваться подписывать, проверять подписи на xml-не, тоже полезный навык.
>так, чтобы потоки друг с другом за файлы не дрались.
Алсо, еще и очереди не должны копиться. Т.к. обычно бизнес на обработку одного такого сообщения дает лимит времени. Обычно несколько минут максимум.
>на реальной работе
Есть реальные люди, которые знают, как работают их процессы. Или у них можно спросить. Или можно подойти посмотреть.
Если ты думаешь, что ситуация когда тебе дают задание написать какой-то модуль или сервис, ты начинаешь пытаться узнать у окружающих что и как работает в системе и получаешь от всех в ответ "а хуй его знает" - это что-то нереальное, то я тебя огорчу. Такое случается с завидной регулярностью.
Почитай мать и отца своих.
в том, что пришел с этим сюда
Почитал про новые фичи нового шарпа.
И меня чутка смущают новый синтаксис для конструкторов по умолчанию.
Ну, т.е. вот та ебала из котлина, когда:
class Zalupa(ILogger logger, IServiceA serviceA){}
Почему смущает. Потому что я уже привык, что я в конструкторе делаю валидацию параметров. Как ее тута делать - хуй знает. Второе - я так и не понял - для классов это так же как у рекордов будет публичными свойствами? А если мне нах это не уперлось?
Так чё? Тебе запрещают юзать "старый" синтаксис?
Похуй + похуй
Ты, наверное, небольшой стаж имеешь. Спустя время, если не будешь сидеть сиднем, будет безразлично, что там и как выражается.
Мне вот фшарп сейчас больше шарпа нравится. Все ругают джаву за многословность, и есть за что. Говорят, на шарпе код лаконичнее. Так вот, фп код ещё короче, чуть ли не в половину.
Единственное, что бесит – фшарп для Майкрософт язык второго эшелона, соответственно, нет горячей перезагрузки и встроенного форматирования кода в VS. Ну и ошибки компилятора порой нечитаемая залупа. А так – как глоток свежего воздуха
Аноны, подскажите. Учусь еще. Хочу прописать взаимодействие с .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. В этом случае нужен ли ворд для работы готовой программы на компьютере где нет ворда?
Ясно. Тогда OOXML попробую. Похоже все в docx придется переводить.
Либа написана на netstandard2.1, а использую ее в net 7.
Может это из-за того, что в первой отсутствует ебатория с вопросиками? Но я впервые вижу чтобы в EventHandler sender был nullable. Или не обращал внимания
>Смотрю после гречневой работы уроки C#. Мечтаю вкатиться. Нет каких-нибудь идей, как найти подработку на выходные в около айти, но чтобы капали какие-то реальные деньги, пусть хоть 20 рублей в час?
Ну нет так нет
>>762624
>Как вкатиться на гречневую работу? Заебало айти. Вы то там в 9 пришли в 6 ушли и голова не о чем не болит, а мне с 8 до 8 сидеть, еще и на выходных выходить, если не успеваю.
https://2ch.hk/wrk/res/2625231.html#2730098 (М)
Тут глянь
Сделай копирование своим скриптом и положи в пост-билд эвенты.
На реальных задачах.
Пилить в 2023 дестктопную программу для картинок вместо использования профессионального софта - быть дауном. Бывают специфичные КЕЙСЫ, когда заказчик платит и ему похуй, но даже в таком случае стоит взять опенсорс проект, который легче всего экстендится.
Тратить время на это как на пет проект? Чтобы научиться круды шлёпать или орм юзать - так ты этому научишься в любом месте. Да даже если веб-приложуху делать - ты больше с технологиями познакомишься, как минимум нужна будет очередь юзеров на функционал для гостей.
Какие нахуй 1000 постов, сука? Тебе в ёбыч дать чтоле?
Кобол, спок.
>А я тупой сори
В смысле?
>надо преобразовывать в инт
Почему в инт? Я же калькулятор делаю. Дробные числа ведь тоже нужны. Более того, чел в видеоуроке делал калькуль с дабл, а не с инт и у него всё работало.
Посмотри, что у тебя в 16 строке находится в Сonsole.ReadLine()
Я уверен что там или пустой стринг или что-то, что не получается распарсить. Попробуй использовать Double.TryParse:
var successParse = double.TryParse(Console.ReadLine(), out firstValue);
if (!successParse) Console.WriteLine("Input value is not a number.")
>Посмотри, что у тебя в 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.")
Попробовал так. Теперь после ввода второго числа, консоль не вылетает, но и сумму чисел не даёт.
Функций нету.
которые те же в профиль.
метод = функция объявленная в классе. Так что можешь называть хоть так хоть этак - всем плевать. А если кому не плевать - плюнь на него.
Чем я тебя заебал, чучело? Я тебе на телефон названиваю что ли? Тред как раз для этого создан, чтоб общаться на тему кода в рамка С#.
Написал, получилось. Всё работает как надо.
Да уж. Что-то захотелось просто через wine попробовать запустить.
>что мне нужно в каждый case switch впихнуть блок try catch?
Каждый double.Parse в try/catch оборачивай.
Злая подъебка
Чувачок, это сарказм был если чо.
Он даже базовых if while и прочего нормально не знает скорее всего. На данном этапе абсолютно похуй как и что он делать будет, даже если он хоть каждую строчку в try-catch обернет. Потом уже когда научится нормально и соображалка будет работать, то если не дурак то поймет как надо.
Десктоп приложения и на винде-то с каждым днем все меньше и меньше нужны, нахуя их еще и на линукс тащить?
QUALITY ANIME
А с каким лицом читают книги по фреймворкам? Ладно там читать про параллелизм/архитектуру/паттерны/алгоритмы – про первичную базу. А читать про что-то вторичное – ну хз
На, мужик, тебе изоленту.
Я в курсе, что ты этого нихуя не проходил, но это тебе пример, того что ты должен понимать и уметь делать на уровне джуна. И это тоже далеко не самый лучший код.
Всвязи с чем вопрос, а почему делается так? Почему не делают цикл, где отправляются простейшие команды?
>Метод это функция cо скрытым параметром this.
>скажи это статическому МЕТОДУ.
Что не так? Рефлексию видел? Единственное отличие вызова статического метода против нестатического - это передача null в качестве инстанса, то есть в случае статики this == null, всё.
потому что за 1 проход быстрее, чем несколько последовательных вызовов программы, которая на каждый вызов должна читать файл, декодить и начинать работу заново.
>вызова статического метода против нестатического
ты эти вопросы адресуй анону, что стат метод функцией назвал, а класс со стат методом неймспейсом для этой функции нарек.
>>773989
>>774621
Я действительно в каждый case свитча запихнул по блоку try/catch, затем отшлифовал некоторые места и работает всё как планировалось изначально. Все четыре основные мат. операции, калькуль не крашится при вводе чего-то не того, а отбрасывает в начало, стирая результаты предыдущей операции и работает до тех пор, пока я не закрою консоль. Да, код выглядит громоздко, но работает.
string Name { get { return this.Argument; } }
да хоть на пастебин положи. вряд ли у тебя там более одной портянки
Возможно прокси для какой-нибудь легаси-хуйни. Может в источнике под капотом там какие-нибудь разные свойства были, а по новой бизнес логике должно отдаваться одно и то же но с сохранением старого API.
что почему?
Сложно ли будет найти РАБоту ( готов работать на галлере ) если потрачу время и силы на этот язык?
> Почему этот язык такой приятный?
Сахар.
> Сложно ли будет найти РАБоту ( готов работать на галлере ) если потрачу время и силы на этот язык?
Несложно.
Делаю программку по этому видеоуроку 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 гигов сожрали, я чет с этого опешил и решил что не надо так делать.
Ну и второе повторять не хочется, потому что там уже вся эта вуду-магия с визитерами, пайплайнами и прочим, что мне не особо интересно.
Собственно. Че посоветуете-то?
Собственно вопрос возник.
Что будет эффективнее в плане минимизации использования ресурсов и скорости работы.
Кейс. TCP-сервер, с кастомным протоколом и какой-то логикой связанной с работой с базой.
Допустим простейший кейс - TCP-сервер, у которого только один тип сообщений - зарегистрироваться на сервере, после регистрации - бродкастинг сообщений другим подключениям. АКА чатик с регистрацией.
Собственно два подхода вижу я:
1. Все на откуп планировщика. Алгоритм простой: подключились, сервер спарсил сообщение, зарегистрировал клиента, и давай рассылать всем подряд.
2. Событийная модель на базе эвентов. После подключения, в цикле проверяем, есть ли какие-то эвенты для обработки этого конкретного подключения. Используем либо тредпул, либо ручками настраиваем число тредов для обработки всего этого дела.
Собственно, я делал первым способом в свое время. И какие обосрамсы я увидел.
1. Я не могу нормально контролировать размер памяти что используется приложением, потому что надо каждому соединению выделять свой буффер, чтобы не страдать.
2. Из-за конкурентности и того что я использовал NetworkStream - надо каждому соединению синхронизировать доступ при бродкасте, это тоже боль, ну да ладно.
3. Если клиентов много (10к и более) и они разом подключаются - пиздец, сразу 100% ЦПУ задействовано, сразу резкий скачек с потреблением памяти, а потом - GC начинает ебать так, что мама не горюй.
4. Если клиентов много (10к и более) и они разом отключатся - пиздец еще больший чем при подключении. Особенно если клиенты неправильно отключались(просто отключились не послав FIN пакет и сокет закрыла ОС). Эксепшин погоняет эксепшином, их начинает GC собирать и ты сидишь, смотришь на это, попивая чай, пока блин все отключатся, чтобы можно было дальше работать.
Второй пример - я видел в коде MINA и Netty, когда изучал. Я пробовал на жаве написать c Mina. И типа работало-то оно быстрее. Но хуй знает почему - просто непомерно много жрало памяти. Я правда не уверен - это проблема жавы или подхода такого. Просто блин. Сам подход выглядит более экономным. Но 10к соединений - 10 гигов сожрали, я чет с этого опешил и решил что не надо так делать.
Ну и второе повторять не хочется, потому что там уже вся эта вуду-магия с визитерами, пайплайнами и прочим, что мне не особо интересно.
Собственно. Че посоветуете-то?
$" число: {number}"
от строки
string.Format("число: {0}", number)
?
2. В чем отличие
" \"какой-то текст\" "
от строки
@" ""какой-то текст"" "
?
3. Есть ли смысл использовать
string.Format("число: {0}", number)
вместо
"число: " + number.ToString()
При интерполяции - ты отдаешь на откуп компилятору все.
Обычно он просто приведет твою строку к string.Format("abc {0} def {1}", foo, bar)
Ясненько, спасибо.
ну вот потом и расскажешь что получилось.
>1
Второй способ удобнее когда тебе нужно в строку вставить несколько копий одного и того же параметра, например
string.Format("число: {0} и еще раз {0} ну и еще раз {0}", number)
>2
Отличие в том, что во втором случае компилятор за тебя сам потом отэскейпит последовательности.
1 в боксинге отличие. в первом случае компилятор и шарп 10 позаботятся чтобы его не было. Ну и тупо читабельнее в 1 случае, если он возможен
3 первый вариант читабельнее, в остальном пока разницы нет.
>1 в боксинге отличие.
1. Тащемта боксинга можно избежать просто передавая параметры через .ToString(), например:
string.Format("число: {0}", number.ToString())
2. Сам парсинг в String.Format сожрет намного больше времени чем боксинг, так что не особо стоит заморочек.
Свое навасянь и его кидай.
Тоже интересует данный момент.
В большинстве случаев я пытаюсь этого избегать, ибо придется в каждом методе проверять инициализацию. Если посмотришь в классы, где есть инициализация (типа контролы всякие), то там есть флаг IsInitialized.
И это надо в каждом методе
if(!IsInitialized) throw new Exception("ClassName is not initialized");
Но это же сумасшествие.
Это пулинг, чел. Рациональная работа с памятью. За это приходится платить приседаниями.
Как по мне, если твой класс спроектирован так, что он требует перед началом его использования вызов метода инициализации, то он спроектирован хуево и дурно пахнет. Либо полностью инициализируешь его как положено в конструкторе, либо, если по каким-то причинам это сделать не выходит (самый банальный пример - операция инициализации должна выполняться асинхронно), то запрещаешь пользователю дергать конструктор (internal можешь его сделать) и пишешь фабрику для объекта данного класса, инициализируешь объект как положено внутри методов фабрики и отдаешь пользователю в уже готовом к использованию виде.
А на счёт исключения. Как по мне, для такой ситуации вполне подойдёт InvalidOperationException.
Инжектишь экземпляр фабрики вместо экземпляра целевого класса. Потом, в том месте где необходимо, с помощью фабрики создаёшь нужный тебе объект. С DI тут вообще проблем нет. Единственное, если твой объект через параметры конструктора из DI зависимости получает, то переносишь их в параметры конструктора фабрики, а потом прокидываешь в конструктор объекта при его создании.
Можешь хелпер написать и в каждом методе просто дёргать ThrowIfNotInitialize()
Планирую вкатиться джуном.
Решил вот так сказать закрепить свои знания о том что изучил за последний год. В качестве пет-проекта типа тамагочи решил сделать.
В общем. Оцените код и дайте советов мудрых!
https://pastebin.com/tvFPjyaH
Не делай классы, которые надо инициализировать перед применением. Это максимально пидорское проектирование и ебал я в сраку таких вот составителей апи.
Вся инициализация целевого класса должна происходить в конструкторе. Если это публичное апи. В своем - че хочешь делай и че хочешь кидай. Но наружу такое просачиваться не должно, если ты не пидорас конечно.
InvalidOperationException
Не слушай «архитекторов», если удобно - делай как хочешь. Ну и книжку по DDD ебани.
>Оцените код
В нынешних реалиях на джуна - нет. На стажера может быть (только за стажировку платить будешь ты)
>дайте советов мудрых!
Сорян, но там такие базовые ошибки, что даже объяснять лень.
Ну это относительно недавно ввели, если я правильно понял. Ну а так вообще заебись, можно говнокодить всякие прикольные штуки с обобщениями
Сократил, немного, думаю смысл не потерялся.
Посмотрите?
https://pastebin.com/ajdw7cTb
А, усё. Справился, хуйню понаписал.
Заметил что они там get делают так:
string tmp = (string)Prop.GetValue(settings, null );
https://github.com/yfdyh000/PhotoSift/blob/master/PhotoSift/frmMain_Input.cs#L841
Поэтому и set я додумал будет так:
Prop.SetValue(settings, new_name);
А settings у них определен так:
private static AppSettings settings;
> ГетСеттер и Инвоук
Не знаю насколько это правильно, на шарпе я, честно, второй день работаю
вот кстати не пиши в таком стиле. это ж портяночный бардак. хотя бы минимальное MVP раз уж это винформсы.
Синтаксически лаконичнее (по крайней мере был), есть сборщик мусора - не надо следить за памятью, ябучие хэдеры не нужны, всякие полезные структуры данных из коробки
Короче суть такова. В бейсике есть свойства по умолчанию, которые автоматически вызываются при обращении к экземпляру. К примеру в классе List дефолтным свойством является Item, поэтому я могу выполнить подобную конструкцию
myList(0) = 999 что эквивалентно myList.Item(0) = 999
в шарпе почему-то это делается расширением
myList.ElementAt(0) = 999;
И что сломало мой мозг в шарпе, так это вот это
myList[0] = 999;
Почему скобки квадратные?
шоб у тебя видеокарта на таком драйвере работала
они везде квадратные в популярных языках- можешь пройтись по топу языков и удивиться
Это у вас они почему то круглые.
Опять ты свой заебавший бейсик тянешь?
В куче ныне живых языков обращение к элементу массива/индексатору идёт через [ ].
Может отпустишь воняющее писюнами прошлое?
Да есть такое, как-то по-китайски написано, много и ненужно. Но что ж поделать, проект уже готовый.
Рефакторить не хочется, этого и на работе хватает.
Так просто пару фиксов добавить для удобства надо, может даже пул реквест на них запилю, лол.
> В бейсике
Ты как из криокамеры сбежал? Когда тебя заморозили? 9/11 при тебе было или уже после?
>Это у вас они почему то круглые.
Потому свойства в бейсике это по сути метод, а метод может иметь кучу параметров. Грубо говоря я могу и вот такое провернуть
myCustomList("itemName", isChecked:=true)
Тут прослеживается логика, а ты мне про "так заведено" — очень странно.
>>781048
Забавно, что при отсутствии схожего функционала я в ответ получил только высокомерные оскорбления. Вообще со свойствами в шарпе полная задница. B cамое глупое в этйо ситуации то, что я не могу передать свойство в качестве параметра потому что свойство это метод, но при этом метод не поддерживает множество параметров. Зато обезьяньи квадратные скобочки — ага. Каргокульт бессмысленный и беспощадный, и высокомерие.
а причем тут свойства если мы говорим про индексатор
и да, он тоже может иметь кучу параметров.
и для индексатора используются именно []
для свойств же кто на что горазд.
Да. Извиняться не будем
И тем не менее - тебя когда заморозили? И как ты сбежал?
планирую врезаться в сеттеры рефлексией, подводные камни?
Делай декоратор и не выебывайся.
С рефлексией ты на пустом месте теряешь от 10 до 100 раз в производительности.
Дополнительно - рефлексия это как ЭссКуЭль: пока пишьеш - просто понятно, когда через два дня посмотришь на это - будешь думать, что за долбоеб писал и что оно вообще делает.
Ну и для твоей задачи - вообще хуй пойми зачем это.
Можешь кстати не декоратор сделать, а адаптер обычный.
Ну и да INPC - хуйня из под коня. Делай нормально тогда через реактивные события и автоматическую отписку.
Что бросается в глаза:
- Вместо абстрактного класса с одним абстрактным методом в шарпах используют интерфейсы.
- goto в бизнес логике использовать грешно, переписывай без него.
А. Чеж сразу не сказал. Ну, тогда да. Тебе только рефлексией и извращаться. Ну, еще ансейфа навалить придется и немного с илом поиграться.
Правда я не уверен все еще что стоит оно того и ты знаешь что делаешь.
>Дополнительно - рефлексия это как ЭссКуЭль: пока пишьеш - просто понятно, когда через два дня посмотришь на это - будешь думать, что за долбоеб писал и что оно вообще делает.
Этот шарит. И за sql и за рефлексию.
Чел. Я не знаю ты пытаешься рофлить или нет, но первые 3 года я работал администратором СУБД, лол. Писал хранимки, писал хуйню для SSRS, делал дохуя изъебистые выборки, оптимизировал то что работало медленно и прочей чепухой занимался.
И вот знаешь. Мое мнение - именно такое. Скуль - охуенно пока ты в контексте. Написать и забыть - охуенно. А вот если у тебя через месяц попросят модифицировать то что ты там написал - тебе проще нахуй выбросить все и написать с нуля, чем пытаться вспомнить. Блин. Да простейший пример- найти все дырки в таблице(т.е. есть в таблице последовательность значений, допустим целые числа от 0 до максимального в таблице, надо среди нее - все пропущенные значения выбрать). Делается в 4 строчки. Но сейчас я даже не вспомню как оно делается-то и уверен что даже те кто каждый день пишут SQL-запросы ручками - с ходу не напишут такой запрос без гугления.
в том то и шутка, что угодно будет лучше, хоть черная магия.
там сейчас опрос всех пропертей ахуилион раз в секунду.
Ну смотри. Если нет INPC то Wpf подписывается с помощью PropertyDescriptor.AddValueChanged
Это может вызвать утечку памяти, но в общем то это готовый велосипед
Никаких рофлов. Полностью с тобой согласен. Еще в эту же копилку - регулярки. Их обычно уже через неделю бессмысленно разбирать и проще сразу в конструкторе собирать.
Есть главный проект (1), LoggerService библиотека (2), Contract библиотека (3). Между ними зависимости 1->2->3.
Вопрос, должен ли я видеть в первом проекте референсы третьего проекта? Пример, во втором проекте используется либа NLog, но в первый проект его не видит. В туториалах пишут пикрил, хотя я по прежнему ничего не вижу даже после этих действий. И еще пример, в третьем проекте у меня есть интерфейс который используется во втором. В первом проекте у меня используется класс со второго проекта в котором есть поле типа интерфейса с третьего проекта, но если я хочу его использовать в первом проекте - он не находит тип интерфейса.
Пока что я тупо в зависимостях на указывал ссылки на все дллки всех проектов, это норма?
Что сказать то хотел?
Пошёл нахуй, даун.
Вообще нихуя не понимаю. Сверху написал ручками, а снизу код, который скопировал поправил немного
Да я примеры из книги рассматриваю и вот чё-то вылезает эта ошибка
Потому что ты объявил так называемый primary constructor вот этой строкой: record Point(), () <-- primary constructor
Если он объявлен, в любых других конструкторах ты обязан его вызвать с помощью : this()
Нормально, но можно лучше написать
ААААА, всё, допёр. А я даже не заметил. Спасибо
Нужно проверить, что определенный тип от интерфейсы не создается/инъектится в неймспейс.
Как это сделать?
Смысл в том, чтобы человек потом вместо прямого вызова хэндлера использовал медиатр.
Не вижу тут ничего костыльного.
ты не напишешь тест на хуйню аля
void ObrabotatZalupu()
{
var handlerZalupy = new HandlerZalupy();
}
ебаш DiagnosticAnalyzer который будет кидать репорт если найдёт использование типа
но может я неправильно помню
Нельзя
Нет. Обычно экстеншн методы для этого пишутся
А если класс реализует насколько интерфейсов?
Ага, я уже почитал. Тоже круто.
Что меня смущает в командах? Во-первых передача данных команде очень неудобна и порой невозможна.
Нельзя биндить данные к параметру Execute, который сам по себе неудобен тем, что он object.
Часто команду сложно сделать универсальной и проще переписать под нужную вьюмодель. Но тут вероятно моя беда. Все свелось к тому, что я в команду добавил INPC и добавляю множество параметров через биндинг свойств.
Но все же хотелось бы посмотреть другие реализации для общего ознакомления.
> Нельзя биндить данные к параметру Execute, который сам по себе неудобен тем, что он object.
Про commandparameter не слышал?
>Нельзя биндить данные к параметру Execute
а надо?
никогда не нужно
у тебя есть вьюмодель - она содержит стейт. у меня все
Короче я разобрался, я дебил - подключал сбилдженные дллки к мейн проекту, а надо было добавить проект к решению и затем добавить к мейн проекту ссылку на общий проект, тогда подтягиваются референсы с дочернего проекта.
Кстати вопрос, что сейчас вместо Microsoft.AspNetCore.Mvc? Он помечен как deprecated, но я чето пока не могу найти замены.
<Project Sdk="Microsoft.NET.Sdk.Web">
либо сдк как выше чел написал, либо FrameworkReference
Всм? Берёшь и работаешь как и с подавляющим большинством дебаггеров в идешках.
Ничего необычного и странного нет в шарповом дебаге
А получишь только хуй.
от убогости.
оно могло бы так https://marketplace.visualstudio.com/items?itemName=CodeValueLtd.OzCode
а может почти ничего.
ну ок. в 22 студии НЕМНОГО сделали получше, но все равно убогость.
ну у них на сайте сказано что их купил датадог, так что в будущем будет 22студия
>решарпер вообще тут никаким боком. даже рядом не валялся
я кажется где-то видел, что брейнсы тоже собираются сделать такое
да есть билд для 22 студии. давно есть
просто работает
а) не все фичи
б) регулярно виснет студия
полтора года уже вот как они выкатили "версию для 22 студии" и только что проверил - только этот кривой билд и существует.
Ты злой, токсичный, а ещё и долбоёб, раз спрашиваешь советы на дваче, даже не поопытавшись погуглить то, что тебя интересует. На msdn есть прекрасный туториал на эту тему: https://learn.microsoft.com/en-us/visualstudio/get-started/csharp/tutorial-debugger?view=vs-2022
Надеюсь на то, что ты не вкатишься в айти и нам не придётся иметь такого мудака в команде.
есть ли способ в подобном случае избавиться от RTTI?
проще всего же сделать свич xx is yy, но это кмк уродство и быстро засрется когда классов-настроек станет больше.
на словаре типов тоже делать не хочется.
ломаю над этим голову уже который день и не понимаю что с этим делать.
assembly1 хранит только настройки и в идеале не должна знать о том что с ними делать будут в assembly2.
В общем. Работаю на кафедре. Веду лабы. Раньше было на си.
В этом году - сказали что си не модно и надо первокуров сразу с шарпа учить.
Собственно. Пример одной из лаб которые я даю.
Думаю понятно, дан заголовочный файл, и main.c надо написать реализовать что там объявлено в заголовочном файле, чтобы в результате - вывелось правильное значение.
И чет я не совсем представляю как такое на шарп-то перенести, чтобы первокурсникам было понятно и чтобы типа ощутили как программы, и при этом не городить миллион абстракций.
На си-то это делается банальным свич-кейсом однми и немного с указателями поиграться.
> проще всего же сделать свич xx is yy, но это кмк уродство
Гоферы смотрят на это высказывание с глубоким недоумением.
Берешь объект. Предаешь ему другой объект. Вызываешь на последнем методы, которые возвращают значения, которые как-то там высчитываются. Какой метод вызвать выбирай свичкейсом. Вуаля.
Можешь еще один из объектов в отдельную сборку вынести и подключить эту сборку к проекту, где мейн твой. Будет у тебя юзинг красивенький сверху. Сразу +10 очков к ощущению программы...
я к сожалению не гофер
>>786231
заранее какой конкретный тип будет передан не знаю, поэтому подаю абстрактный, возможно на интерфейс заменю, но суть в том что мне хотелось бы чтобы к конкретному типу настроек создавался конкретный класс их использующий. буду 100% потом добавлять новые конкретные типы.
видимо все-таки придется словарь делать
>один из объектов в отдельную сборку вынести и подключить эту сборку к проекту
подключить динамически, вот и говнокодплагины почувствуют (:
Тот кто передаёт знает, что он передаёт setting1, а не setting2, почему этот код не может вызвать на билдере метод с нужной сигнатурой?
Что мешало сразу скинуть мне ссылку и не выёбваться?
>Надеюсь на то, что ты не вкатишься
Надейся. Выбора, кроме вката в ойти, у меня всё равно нет. Так что жди пополнение в своей команде, гавнюк.
Суть лабы - показать как процессор последовательно выполняет команды из потока байт. В том числе, что функция - это тоже просто кусок памяти, куда "перепрыгнет" процессор. Это одна из первых лаб. Дальше по программе - добавляются регистры, стек, метки, ветвление, циклы и прочее и типа к концу семестра - получаем "эмулятор" выдуманного процессора с выдуманным набором команд такой-то и интерпритатор к нему который уже из текстового файла получает набор команд и выполняет их.
Но в шарпе, как я понимаю, просто так передать указатель на ту же функцию - не так просто. Изначально надо вводить абстракции, А это для первокуров - будет сложно. Видимо надо дропать вот такие лабы и как деды - давать студентоте писать хуйню про "напишите программу, которая решит вот это уравнение".
Эх.
>просто так передать указатель на ту же функцию - не так просто
в шарпе для этого делегаты, проще простого
Как я засуну делегаты в массив/стрим байт/интов?
Да. Можно в массив object засунуть но тогда тот код будет просто нечитем.
Говнокод с твоего пика точно так же нечитаем, держу в курсе
Чел, я с продуктами твоего обучения каждый день на работе сталкиваюсь. Нихуя они не будут знать ни про процессор, ни про регистры ни про стек с кучей. Пожалей жеребят. Учи прикладному чему-то, а не низкоуровневой хуйне, которая без пару лет практики на реальной работе все равно не усвоится.
>>786393
Это же лаба для первого курса. Учить прикладным вещам, без базовых - странно. Вы же не учились рассчитывать ежемесячный платеж по кредиту - не освоив как складывать числа?
Прикладные вещи - со второго курса начинаются.
А я просто хочу чтобы интересно ребятне было. В прошлом и позапрошлом году вот так давал - и большинству понравилось. Сам помню как горел с лаб в духе: напишите программу, которая проверяет "пароль", напишите программу которая вычислит: "f(x) = sin(x)+tg(x) + 3.14 / 2", напишите программу которая вычислит число фибоначи для 10, напишите программу, которая найдет все простые числа. Ужас. Как вспомню первый курс свой. А это - как по мне - весело и интересно. Плюс типа к концу семестра типа почти законченный маленький проектик, а не laba_1, laba_2.
Хотя хз. Вы тут чет накинулись. Даже неуютненько стало.
Ты что бы использовать микроволновку тоже изучаешь какой хим состав меди в проводах? Или может хотя бы как работает магнетрон?
Ну, лично я, как минимум - изучаю принцип работы. Для новых и совсем непонятных мне штук - еще ищу от более шаристых объяснения, как оно там работает. А как иначе-то? Мне как-то не хочется оказаться в сводках новостей из-за того что я неправильно пользовался микроволновкой и у меня квартира сгорела или еще что-то страшное произошло.
Братан, базовые знания в программировании в 21 веке это не то, как работает процессор. Это очень далеко от вещей, которыми занимаются большинство кодеров. Об этом позаботились бородатые дядьки еще десятки лет тому назад.
Ты энтузиаст. 95% людей достаточно знать про микроволновку, только куда нажать и за что потянуть, чтобы получить ожидаемый результат.
Хоть убей не понимаю, чем
>напишите программу которая вычислит: "f(x) = sin(x)+tg(x) + 3.14 / 2
скучнее чем то что ты там выложил изначально.
Если накинуть какие-нибудь фракталы или там дифурчики и визуализацию, то вообще ништяк. Как раз на шарпах окошки с графикой приятно писать.
Тем более для таких пишут инструкции.
>>786418
Как будешь поступать с закрытыми системами коих вокруг нас огромное количество?
А некоторые знания тебе вообще никак не помогут. Все тут сидящие думаю постоянно оплачивают картами покупки но помогут ли им знания о протоколах бесконтактной оплаты и внутреннем процессинге банков?
Она в любом случае не будет сразу происходить.
Если для тебя эта 1мс прям так критичен - пихай в тредпул обработчик и все.
Берешь ConcurrentStack. Хуяришь TryPop в while(true), другими потоками делаешь Push. Вот тебе продакшен реди решение, не благодари.
Прокинь AutoResetEvent в бесконечный цикл и в метод, где у тебя push происходит. Пусть луп поток ждет сигнала в waitOne(). Когда кто-то добавит элемент в очередь он вызовет .set(). Луп поток разблокируется и выполнит TryPop. Затем опять вернется на исходную, ожидая вызова .set().
Но лучше просто тред слип юзай и проверяй очередь 10 раз в секунду или типа того. Человеческому глазу эта задержка не заметна.
Чел хочет чтобы задача сразу после попадания в очередь начинала выполняться.
Соответственно, ему вот эти вот переключения шедулера, чтобы пройтись по задачам и найти ту что выполняется - критические. Скорее всего он пишет свою RTOS на шарпе. Или под микроконтроллеры что-то программирует(соответственно все эти getNext - очень долго будут выполняться, да и растущий тредпул - тоже не круто)
Собственно, потому - все эти вот решения с очередями, каналами с эвейтами и прочее - не подходят.
Надо делать либо свою систему прерываний, либо брать ReadWriteLock/ResetEvent, ну или если хочется сэмулировать async-await - можно взять TaskCancellationSource
А эти вот Channel - там задержка такая, что под микроконтроллеры брать ни в коем случае нельзя.
> TaskCancellationSource
TaskCompletionSource конечно. Чет в голове слегка смешалось пока писал.
>Чел хочет чтобы задача сразу после попадания в очередь начинала выполняться.
В каналах есть специальная опция для этого allowSyncCompletion
>Скорее всего он пишет свою RTOS на шарпе. Или под микроконтроллеры что-то программирует
Из его поста это никак не вытекает. Больше похоже, что он пытается в велосипед, когда уже есть датафлоу или те же каналы.
TaskCompletionSource тоже с оверхедом, тогда уж ValueTask надо использовать
Допустим у меня есть свойство типа FileInfo. Само свойство вызывает событие INotifyProprtyChanged, но привязаться мне надо к FileInfo.Name, в котором вряд ли реализован INotifyProprtyChanged.
Не будет ли утечек памяти, если я привяжусь к FileInfo.Name? Или надо пилить ValueConverter?
Как ведет себя привязка? Она биндится к FileInfo, а затем ищет внутри свойство Name, или же биндится напрямую к Name?
ужас
BlockingCollection для этого и придуманы
для async Channel
Для любителей пониже уровнем могут лепить свое с AutoResetEvent и другими примитивами синхронизации.
Я работал. Что значит рисовать вне UI потока? Ты понимаешь, что такое UI-поток? Рисовать вне его - невозможно, если ты хочешь увидеть результат своего рисования. Возможно, если ты с результатом делаешь что-то еще, типа сохраняешь в битмапу - в таком случае просто создаешь канвас и рисуешь лол.
Если ты имеешь ввиду есть ли для SkiaSharp контролы под UI либы - есть, под все шарповые вроде.
Он про то что искусственное ограничение на работу с юи в один поток лишь от отсутствия блокировок и синхронизаций и что в либах где они заимплеменчены можно не заморачиваться
> Я работал. Что значит рисовать вне UI потока?
То и значит, берешь и рисуешь в любом потоке, как я уже писал CanvasSwapChainPanel позволяет это. К тому же в Uwp помимо ui потока есть еще и поток Composition, так что никаких проблем с отображением результата нет.
Вот собственно документация
> 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
Я пока решил не использовать MVVM, потому что в моем интерфейсе литералли 2 кнопки и мне нужен текст элемент, чтобы ошибки показывать.
В инфраструктуре есть класс GoogleLensUploader, который имеет метод UploadImade принимающий byte[] и вызывает несколько других методов, которые отсылают запросы и возвращают string.
Также в инфраструктуре я разместил кастомный json converter и враппер, который принимает этот конвертер и возвращает мож модель TextRow из домена.
Вся эта хуйня через dependency injection используется а application слое, который уже и используется в моем mainwindow.
Так вот, как в таком проекте ошибки отлавливать и рендерить из на текстовом элементе юзеру?
> впа
впф*
Ну и да, в интерфейсе буквально 2 кнопки, само mainwindow принимает ClipboardMonitor и подписывает метод на его эвент, который говорит, обновился ли буфер обмена и есть ли в нем картинка.
А 2 кнопка отписывает от ивента.
Синхронизация все ещё есть, просто на уровне DXGI и DirectX.
Со скиа так не канает, вроде потому что angle на котором скиа работает, не реализует эту фичу, Майкрософт пыталась сделать это в форке, но я хз попало ли это в апстрим Гугла.
В итоге сейчас да, в xaml контролы нужно рисовать по макету.
>Аноны, как в вп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] Просто информация
и так далее ...
Сам формат вывода информации: уровень, время, путь к классу — все это настраивается и ты можешь что-то убрать, или же добавить. Так же ты можешь писать логи параллельно в текстовый файл и в окно юзера — тоже на разных уровнях. Вариаций масса.
>Аноны, как в вп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] Просто информация
и так далее ...
Сам формат вывода информации: уровень, время, путь к классу — все это настраивается и ты можешь что-то убрать, или же добавить. Так же ты можешь писать логи параллельно в текстовый файл и в окно юзера — тоже на разных уровнях. Вариаций масса.
Из литературы по сути ток документации по графическим апи и может быть статьи по типу "как устроен vulkan". Я когда вкатывался, у меня долгое время было плато непонимания чо происходят нахуй, но потом втянулся. Рекомендую не начинать с opengl, хотя в инторнетах пишут обратное.
В современных апи типа вулкана с интероперабельностью все намного лучше чем в том же opengl. Например я совсем недавно решал задачу рендера на вулкане как раз в WinUI3 шную SwapChainPanel. То есть дружил вулкан и директ. Сделал на гитхабе репу - может какому анону поможет.
Если есть какие-то конкретные вопросы, можешь задавать, постараюсь развернуто ответить.
> WinUI3
Если не секрет, отчего такой выбор? Вроде как самый сырой и медленный XAML фреймворк.
как то так - https://github.com/malstraem/vulkan-interop-directx
>>788220
>Если не секрет, отчего такой выбор? Вроде как самый сырой и медленный XAML фреймворк.
Не соглашусь. Сыроват? Да сыроват. Но количество мощных контролов и консистентная тема под современную винду решают. Композинг удобный, сам xaml опять же сильно прокаченнее WPFного. Ну все это у него от UWP, но так как UWP официально фсе - то получается современный фреймворк под шинду это винурина3, ничего не поделать.
Если есть требования или перспектива кросс платформы, то лучше Avalonia выбрать, они как раз недавно жирный апдейт выкатили. Мы просто когда стартовали новый проект на работке - из требований заказчиков (аэропорты в основном) была только шинда, они все на ней сидят и сидеть будут.
потому я и выучил котлин для андроидов
Нужно попердолиться, почистить проект, иногда вручную поудаляв build, obj, поискать версию maui на предмет таких issues на гитхабе. Там анон говорит, что котлин выучил – я могу его понять. Хотел поиграться, но такие косяки отталкивают. Да и сам фреймворк какая-то срань – в 2023 году столько бойлерплейта, XAML с его допотопным синтаксисом. После этого реакт и css ощущаются как космолёт. Но это веб
Когда удобно тогда и юзаю. На тех кто не осилил прочитать релиз ноты по версиям шарпа чихал
База. Лист паттерн матчинг и возможность объявлять переменные если они попадают под условие - мега охуенно.
Мням-ням, сахар
Свич использую в основном для enum, а там все просто:
Я использую сниппет свича, который автоматом расставляет кейсы, дальше я его заполняю и студия предлагает превратить в шаблон.
По сути я ничего не делаю для этого. В чем дилемма? Выглядит компактнее, а большего и не надо.
Они же хотят, чтобы я сделал модели для этих операций, присобачил к ним валидацию и потом их реюзнул в последнем эндпоинте, да?
Непонятно, как будет выглядеть этот калькулятор. Может быть, там надо распарсить строку? Тогда зачем вебапи, неужели просто один аргумент принять?
Ну тип стучишься на эндпоинт /calc/pow даешь ему 2 числа и он тебе высылает ответ, либо говорит, что ты мудак.
Все тоже самое с другими простыми операциями, но последняя типа должна их всех объединять, насколько я понимаю.
Вот ток я думаю, че они именно хотят, чтобы я им показал.
> объединять
Как? Передавать название операции отдельно?
> я думаю
Зачем думать над мутным условием, если можно и нужно спросить, что они имеют ввиду?
>вычислить сложное выражение.
>Они же хотят,
Ты уже обосрался с тестовым. Никогда не угадывай того, что хочет заказчик. Если есть непонятка - значит нужно уточнить.
Очень часто в тестовых делают такие мутные места, чтобы посмотреть как поведет себя кандидат.
Поэтому сначала прорабатываешь, придумываешь два...три возможных варианта (чтобы их предложить, а не тупо спрашивать "я ни понил") и задаешь вопрос тому кто выдал тестовое.
Выскакивает ошибка при поиске на кнтрл+т: "Функция "Перейти к" сейчас недоступна из-за внутренней ошибки." Трассировка стека: https://pastebin.com/UyPHCjQ4
Сам поиск при этом работает отлично, но меня очень выбешивает этот постоянный алерт.
Если не знаете как исправить ошибку, может подскажите как ее спрятать?
чел, от тебя просто хотят получить решение рабочей таски, никогда не делай тестовое, если оно не оплачивается
да ну. кому нужен вебкалькулятор
Нечего гкглить на русском.
Использую, где это удобнее.
Всякие бизнес-руллы, где правила в духе: Если последний раз был больше недели назад, но меньше чем 3 недели и при этом является привилегированным пользователем, со знаком зодиака рак - то это, если ...
Ну ты понял. Вот в таких случаях - все эти охуенные правила удонбо запихнуть в tuple и достать нужный обработчик, чтобы дергнуть.
Еще, если просто у нас в зависимости от типа объекта - надо куда-то передать, то диспечер такой хуйней удобно мутить.
Где это скорее вызывает неудобства - не использую.
Сам синтаксис - как по мне неудачный. Лучше бы отдельное слово намутили типа match, убрали бы эту стрелку ненужную и было бы типа:
var x = some match
{
> 0 and < 10 : "Ok",
default : "Ne Ok"
}
мы все о тебе поняли
На пике все работает
Просто в самом обозревателе разные типы не подсвечиваются, как например в InelliSence, и отличить класс от enum невозможно. Хочу для енумсов выделить отельную подпапку — чисто для чистоты иерархии обозревателя.
Пытался перед именем поставить какой нибудь префикс, типа '#Enums', и в принципе студия болше не предлагала переназначить неймспейс при дропе туда файла, но она упорно создает неймспейс, если я создаю в этой папке новый файл — при этом она символ '#' заменяет на '_'.
Так вот, есть ли какой-то волшебный префикс, который говорит студии don't do that.
В решарпере есть надстройка для исключения папки из формирования неймспейса в идее тогда тоже должно быть. Голая студия такое себе
Черт, ну ладненько
Попробуй теперь к базовому классу скастовать свой Kuk
Ничего. Я либо cli/tui тулзы пишу либо вебовый гуй. Когда то немного ковырял впф но мне он показался оверинженереным
Авалонию надо долго сидеть и изучать, она для реально большого и сложного проекта, далеко выходящего за "прикрутить гуй к консольной программке".
Шиз, таблетки.
Мне лень открывать говорящие головы но с уверенностью могу сказать что на скрине лажа. Браузеру нужно хттп а не хелло в ответ.
Если ты приконектишься на порт условным телннтом или нц то он выведет
Эт я уже вычитал на StackOverflow. Прикол в том, что у него всё работает, а у меня нет. Думаю на той версии, которая у него можно было. А на .NET 7 уже нельзя. Хотя странно, вряд ли за такой короткий промежуток времени могли что-то сильно поменять
Нет, дотнет тут вообще не при чём. Это у того чела кривой браузер, а у тебя нормальный.
Походу мазила с 2021 года что-то обновила и стало работать так, как сейчас. Спасибо за ответ
Не в дотнете дело. Это НЕ могло никогда работать. Максимум что могло быть это какой либо браузер работает специфично
Делай как я! Не хочу быть единственным в треде, кто такой хуйней занимается.
ВОТ УВИДИТЕ! Я СДЕЛАЮ СВОЙ ТЦП ФРЕЙМВОРК ДЛЯ СЕРВЕРА, КОТОРЫЙ БУДЕТ УДОБНЫЙ КАК МИНИМУМ ДЛЯ МЕНЯ!
Знал бы только как удобно роутить сообщения без всяких извращенств(рефлексия ацтой!). Типа вариант Route<Context,MessageType> - не нравится, делать извращения про Route("{protocol}/{messageType}") - тоже не хотю. Пока что делаю как в первом варианте.
Еще хотелось бы несколько протоколов на одном "сервере" обрабатывать, но тута проблема в том, что тогда надо хранить буффер при парсинге, а это лишняя память для вот такого редкого случая.
И еще не хочется выносить на уровень событий отправку сообщений. Но без этого - какая-то хуйня выходит(приходится семафорчиком ограничивать отправку) если у нас многопоток и вся хуйня.
Короче. Да.
>рефлексия ацтой!
только для тех кто не умеет ее готовить.
есть хендлеры которые нужно как то роутить. Собственно хендлеры в классах. Если у нас заранее известен набор роутов, то можно хоть интерфейсами, которые классы хендлеры должны реализовать и зарегать себя как обработчики
Иначе же нуно как то указывать что куда мапится. и тут понятно 2 варианта - 1 многочисленные Add(....route info..., handler) в одном месте 2 аттрибуты конечно. Ну и 3 это когда класс хендлер делает пункт 1, но в себе для своих хендлеров.
кто любит декларативщину выбирает аттрибуты. А далее все сделает рефлексия разобрав все это дело и нагенерив в рантайме caller-ы для хендлеров
но даже в варианте 1 рефлексии не избежать если хочется делать биндинг на параметры
В общем то ничего сложного.
Я вот так примерно делал.
Ацтой, потому что выглядит рефлексия вот так как на прикриплейде. И вот я сам писал это полгода назад и не сразу вспомнил как оно работает.
Ну и про сложность. Не сложно. Просто у меня после какого-то времени - возникла мысль, что это становится похоже на магию и правильнее обязать того кто пользуется - реализовывать интерфейс IDispatcher<TContext,TMessage> и заставлять свой диспечер сообщений к серверу цеплять, а там человек как ему удобно так и задиспечеризирует сообщение.
Скорее вопрос в том, какой заголовок отвечает за тот текст, который я хочу отправить. Типо в какой заголовок этот текст засунуть, чтобы потом вытащить на страницу в браузере
Тебе то что отобразится не в хэдеры нужно пихать а в боди. curl -v тебе в руки и rfc по http 1.0/1.1
Всё, я понял. То, что находится снизу заголовков - тело. В прицепи логично. Почти как в хтмл структура
Но релокационные аутстафф-галлеры платят мало, Грузия страна дорогая. Я нашёл бывшую российскую компанию, которая успешно продвигает Creatio в Азии и Центральной Америке. У меня отличный опыт и портфолио, так что поставил ценник в пять тысяч чистыми. Это реально решит сейчас все мои проблемы и позволит копить на Европу (ещё осенью квартиру в ДС продам и, при хорошем раскладе, за всякими минусами ипотеки/риэлтора выведу в Грузию тысяч 130).
Тема крутая, финтех и доллары, но как при этом развиваться? На проектах Creatio я даже нормальных юнит-тестов не встречал, не говоря уже про работу с мультипоточностью и всякие фишки поздних версий .Net. И фронт там сейчас неакутальный, ExtJs, а я хочу погрузиться в божественный Ангуляр.
ну выглядит и выглядит. лишь бы работало. Ну разве что медленно ибо рефлексия.
хотя я бы не делал в RouteDescriptor сам вызов, да и Func<MethodInfo тоже
По уму рефлексия один раз при старте отрабатывает и потом уже переиспользуются результаты либо генерится на их основе ил
В Восточной Европе больше половины вакансий на .Net это .Net Core + Angular (в разных вариациях, но суть та же). 5к чистыми, ты тут не получишь, но если ты весь из себя синьор-помидор, то может и 6 вытянешь, в среднем около 4.
Хочешь больше? Ищи клиента в штатах/Канаде. Собственно я так и сделал, клиент в Канаде за 6 и местный за почасовую ставку, обычно 2-3,5к/месяц.
Развиваться норм, если писать на коре, то всё хорошо поддерживается. Если команда норм, то проект будет сиять от новых технологий и 90% покрытия тестами.
Выстрелит какая-нибудь древняя залупа, которой нужен COM.
Накатываешь на студию/vscode/райдер нужные плагины. Разрабатываешь на винде, собираешь на винде, деплоишь по SSH на линукс, запускаешь там, цепляешьшся к работающему билду, дебажишь из под винды и в хуй не дуешь.
В студии из коробки есть вариант прозрачного запуска под всл
Не знаю как у него, но сейчас в компаниях, которые имеют дело с гос сектором или разрабатывают для компаний которые работают с гос сектором - опять пошла пьянка, что сертификация винды - усе, пересаживайтесь на какую-нибудь астру или пиздуйте.
>>794516
Ну, прям критично - ничего. Особенно если райдер есть. Но блядь. Насколько же студия - удобнее.
Так вот, они запили видос с лайв-кодингом или местным литкодом (точно не помню). И все это происходит с периодическим "методом тыка". И так забавно смотреть, как, вероятно, серьезные разработчики, тыкаются в синтаксис аля школота и при этом восхищаются этим продуктом.
Как это работает? Чем больше тебя язык ущемляет, загоняет в рамки и заставляет себя чувствовать не комфортно, тем сильнее ты его любишь и считаешь его правильным?
Эту кучку пидорасов нужно выгнать нахуй с канала посвященному дотнету. Пусть валят на свои каналы по расту, раз не хотят пилить конент по дотнету.
> Как это работает? Чем больше тебя язык ущемляет, загоняет в рамки и заставляет себя чувствовать не комфортно, тем сильнее ты его любишь и считаешь его правильным?
Та не.
Просто раст типа на хайпе.
Хотя сам раст - то еще говно ебаное.
Вот срсли. Хуй пойми нахуй он нужен. Те области где он типа нужен - на си нормально живут и будут жить дальше без раста.
Вот F# - тема. Как мне грустно, что сколько не пытался в прод запихнуть - никто не хочет. Приходится грустно в стол дома на нем чет делать. А ведь блин. Ну охуенный же язык. И .net никуда не девается. Но нет. F# не будем юзать, хоть ты тресни, и никакие аргументы не работают.
Сначала студия ругалась, на это
public event PropertyChangedEventHandler PropertyChanged;
якобы такое событие уже есть. Но я не могу его вызвать, символ молнии события помечен "звездочкой". Что это?
Потому что эвент можно вызвать только с класса, на котором он объявлен.
Чо ты пытаешься сделать лол. Как уже написали, событие может вызвать только его владелец, то есть даже наследник класса не сможет инвокнуть ивент родителя. Потому что - как ты себе это представляешь? Объекты поднимают ивенты согласно внутренней логике когда меняется какой их стейт - тебя нельзя вмешиваться в этот процесс, в этом смысл ивента и в целом паттерна наблюдатель.
Это очень кривая хуйня, никогда так не делай или будешь избит коллегами. Но даже так это все ещё два разных события, просто в откройте ты руками через add и remove подписываешься ещё и на базовый ивент.
Для того чтобы у наследника была возможность поднять ивент - просто оберни вызов в метод.
>Это очень кривая хуйня
что удивляет почему так
почему при вызове виртуального метода ищется оверрайд метод и он вызывается
А вот события сделали через жопу. Зачем вообще слово виртуал если оно таковым не является
это еще одно в копилку "разрабы шарпа - рукожопы"
>но даже в варианте 1 рефлексии не избежать если хочется делать биндинг на параметры
Избежать, сорс генераторами, в нет8 над этим работают
речь вообще не про минимал апи
соурс генератор должен на что-то опираться для генерации вызовов хедлеров контроллеров и генерации биндеров для них.
самое банальное - навесить аттрибут (собственно они и есть)
подход "ты поищи по исходникам вызовы Add нужной сигнатуры у нужных типов и на основе их генерь" даже не знаю возможен ли, но точно нерентабелен.
зачем тебе атрибут на метод, который ты сам контролируешь? в восьмом аспнете mapX подменяется сгенерированным экстеншеном
https://andrewlock.net/exploring-the-dotnet-8-preview-exploring-the-new-minimal-api-source-generator/
>но точно нерентабелен
хаха ну да
это все равно упирается в "найди все вызовы MapX в коде, где бы они не были"
А вообще я не делаю особой разницы между рефлексией в рантайме и тем же самым при написании соурс генератора. Разница то просто в виде рантайма - сама софтина работает или билдер. Все равно пиши код вида "найди мне вот это с этими типами/аттрибутами и сгенерь для него код/il"
>Разница то просто в виде рантайма - сама софтина работает или билдер
Билд происходит один раз.
Разница в производительности и конкретно сколько времени занимает старт. Для веба, который сейчас повсеместно в контейнерах на каких-нибудь подах с хуй да нихуя cpu, это особенно важно. Сюда ещё идёт размер сборки, с рефлексией тримить очень сложно и опасно.
>Билд происходит один раз.
как и генерация этого же самого в рантайме.
и по сравнению с тем сколько времени жрет EF на свой запуск это ничтожно.
Как тот же DI - где его соурсгенераторная версия? че майки ее не делают?
трим понятно, но это ж асп.нет. кто его триммит то.
>и по сравнению с тем сколько времени жрет EF на свой запуск это ничтожно.
С пробуждением, для ef'а тоже пилят компайлед моделс.
>как и генерация этого же самого в рантайме.
Вот это всё накапливается и получается что время до обработки первого запроса в минутах исчисляется, это пиздец. Горизонтальное масштабирование хорошо работает только когда воркеры быстро стартуют
>С пробуждением, для ef'а тоже пилят компайлед моделс.
я его не использую. я как увидел время запуска так охренел. оно неприлично огромное. Может для асп.нетов это и допустимо (какая разница сколько оно стартует) - для других проектов нет.
>время до обработки первого запроса в минутах исчисляется, это пиздец
и 99.99% этих минут составляет EF )))
>Потому что - как ты себе это представляешь?
В бейсике такой проблемы нет. Как я себе это представляю? В наследнике появляются новые свойства. Как они будут уведомлять о своем изменении? Как? Делать перегрузку эвента? Затенять? Переопределять?
я НЕ представляю как может быть иначе. У меня рили горит сука нахуй. Мне нельзя вмешиваться в этот процесс, охуеть. Может и свойства заблокировать? Это же СОБЫТИЕ, оно имеет уведомительный характер. Я глубоко непонятно за каким хером ObservableCollection содержит protected событие PropertyChanged, которым сама не пользуется и другим не дает.
Я уже молчу про то, что компилятор благодаря "прекрасному" синтаксису шарпа не понимает, что происходит вызов события и раздает неуместные советы. Клянусь, вот эти вот "+-" ":" самое гнусное изобретение майкрософт.
Как иначе использовать async в обработчиках событий?
Опять ты со своим бейсиком рвёшься? Сиди на нём и всё будет по старому
Бейсикоблядь, спокуху оформи.
кто тебе не дает? специально для таких случаев есть PROTECTED методы вида OnCollectionChanged
и в ObservableCollection он даже virtual
Так вот. На вот это ^2, вижуал студио ругается и говорит, что такая шляпа прокатит только в C# 8. Я так понимаю, что C# 8 не доступен в бесплатной версии с сайта майков, так?
Всё доступно. У тебя в csproj выставляется версия как рантайма так и языка (можно использовать старый рантайм но включить фичи языка которые при компиляции только используются). Смотри что там и меняй. Актуалочка сейчас это net6.0 и net7.0
Дурачок, у коллекции (нахуя от нее наследуешься кстати, шиз?) есть методы для подъема событий, специально для таких шизов как ты.
Count - 1
ну попробуй без них - на каждый чих заводи именованный метод, который нужно где то разместить. Или в классе разместить или прямо тут в методе (шарп это позволяет) - все равно это будет "где то там".
Да без любых высокоуровневых фич можно обойтись. Ты же не думаешь, что без лямбд язык перестаёт быть полным по Тьюрингу?
Лямбды охуенны, чел.
Не сокращенные, а безымянные функции создаваемые "на месте". жаль что с классами так нельзя как в котлине (анонимные классы совсем не то)
Он пиздит. Там пейвол.
я ж написал - она может не иметь имя и быть создана "in place"
любые функции с именем должны
а) иметь имя
б) будут размещены не на месте использования, а где то в другом.
(хотя в некоторых случаях наоборот)
если тебе так сложно. то считай ее сахаром.
ничем она от обычного метода не отличается - ведь компилятор услужливо за тебя при компиляции даст ей имя и впишет в класс.
Лол. Я точно также могу тебе расписать чем
i += 10 отличается от i = i + 10
а) не нужно второй раз писать i
б) знак + находится рядом со знаком = и его не нужно искать где-то в другом месте после имени переменной
И чо, давай тогда += называть какой-нибудь сигмой.
> Прежде чем пытаться написатьICanvasImageInteropреализацию, рекомендуется хорошо понимать D2D, Win2D, COM, WinRT и C++.
спросили я ответил
если чел САМ НЕ ВИДИТ отличий от обычной функции и не может понять зачем в язык ввели лямбды (даже в богомерзкую жаву), и начинает искать скрытый смысл, то я ему и указываю на суть.
каждая фича сахар или нет имеет смысл зачем ее вводили и свое название.
>i += 10 отличается от i = i + 10
>а) не нужно второй раз писать i
и да. именно этим оно и отличается. и это его суть. и именно для этого оно и было введено
>давай тогда += называть какой-нибудь сигмой
а почему нет. оно также имеет собственное название - addition assignment
Собственно в конструкторе происходит следующее
public MyClass(string myProperty)
{
. . . MyProperty = myProperty;
}
При этом возникает предупреждение, что поле string myProperty не допускает значение NULL. Для этого я должен сделать вот так
public MyClass(string myProperty)
{
. . . this.myProperty= myProperty;
}
Почему студия упорно предлагает назначить значение публичному свойству, а не приватному полю и кто из нас прав? Если виноват я, то как поступить лучше?
Допустим в свойстве есть какая нидудь логика, и нужно инициализировать значение именно через него, но как сделать по красоте, чтобы студия не ругалась? Без подавления предупреждений.
Вот так сделай:
private string myProperty = string.Empty;
Или если оно может быть null:
private string? myProperty;
Вот пикрил.
Самое интересное, что если имена не совпадают, то предлагает на выбор назначить полю или свойству.
>>797515
>private string myProperty = string.Empty;
Но это же лишнее действие.
>Или если оно может быть null:
Не может т.к. в конструкторе запрашивается. По идее назначив non nullable стринг свойству, поле в принципе никак не может быть null, но студия просто тупорылая как утюг.
Теперь ты пишешь на C++.
Это должно решаться проверкой value в сетере на нал. Но кумпилятор не умеет это регистрировать. Костыль.
ну так ты сеттер сделал. сеттер на то и сеттер что сеттит. Это правильное предложение - щас сеттер пустой, потом нет, а значит разумнее делать через сеттер в общем случае. Ну а если разраб такой "мне виднее" - ну пусть сам и делает
с другой стороны, решарпер предложит инит приватного.
Да. Нужно заплатить на курсах 100 тыс миллионов чтобы они научили как скачать сдк.
Все прошли через это
это можно сделать везде. можешь хоть мне купить остров в океане, а я тебя научу гуглить.
В своём резюме вкратце описал основные инструменты в виде наброса ключевых слов, с которыми приходилось работать (аспы, мвс и рестапи, постгрес, немного тайпскрипт и ангулар), чутка описал чё вообще хочу (а-ля "интересна сфера бэкенд-разработки, хочу развиваться как специалист эмням пук"), ну и ссылка на гит с парой своих серверных проектов. Сам живу в дс2 и тотально охуеваю с того, что в таком крупном городе вакансий нихуя нет. Вбрасывают штуки две-три за неделю без указания требований к опыту в описании, откликаешься на них, и получаешь тотальный игнор. Уж лучше бы отказали бля, потому что так угнетает жить без каких-либо ответов.
Откликаться на то, где прямо в описании пишут требования к опыту, тоже результатов не приносит — сразу же отказывают (ну хоть не игнорят).
Один раз таки дали тестовое и по его результатам пригласили на собес. Спрашивали довольно дефолтную хуйню по типу "принципы ооп", "ссылочные и значимые типы", "как реализовать проверку правильной расстановки скобок", "как работает словарь" и тд. Имхо отвечал довольно норм, хоть и местами с затупами, что даже пригласили на второй этап, где... ебали голову на тему "почему ты поступил на программиста". Ответ что "просто потому что на интерес решил попрогать, зашло смотреть на то, как код, с которым долго ебался, наконец работает как надо, ну и всё заверьте..." их не устроил и позже мне прислали отказ.
Полагаю, проблема в целом в моём резюме, раз за пару месяцев мне ответили с приглашением только одна компания. Так что подскажите, анончики-джуны, как вы сваяли своё резюме так, что оно привлекло хоть какое-то внимание, и какими пет-проектами щеголяли?
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. Пользуешься ренджами
Я просто практикуюсь. А то немного надоело что отдел сопровождения ругается, что недостаточно подробно инструкции по развертыванию и эксплуатации пишу
Это не то чтобы синтаксический сахар. Потому что если так рассуждать - все конструкции любого языка - синтаксический сахар.
Тебе никто не мешает без циклов, вызовов и прочего писать на голом ассемблере. Просто последовательно:
start:
mov rax 1
add rbx rax
cmp rbx 10
JNE start
...
А все эти циклы и прочее - сахар получается. Все в принципе можно вот так написать.
Ну а конкретно про лямбды. Без них - ты бы писал кучу однотипного кода на каждый чих. В джава, допустим - довольно долго так вот и приходилось жить. Можно ли так жить? Можно. Хорошо ли тратить свое рабочее время на написание однотипного кода, который можно написать лямбдой - я хз.
Блин. Да. Нафиг я выдумал бизнес-задачу, и при этом не реализовал ее решение.
Пока вспоминал как там в ассемблере условные джампы делаются - забыл про то что надо день рождения учесть. Лалка просто.
Я знаю((( Но блин. Вот конкретно инструкции и документация. Ну блин. Аааааа. Все ж и так понятно. Положил docker-compose, docker-compose up -d, все. Дальше - методом тыка - разбирайся с программулиной. Преврати это в игру! Не. Не хотим. Хотим чтобы была инструкция че и как сделать, где скачать, какие галки поставить. Ууууу. Уууу!
Так в сопровождении - просто надо уже готовые образы развернуть из своего реестра.
А я постарался, что конечные образы 75-80 метров, так что прям страшно быть не должно.
Как минимум - под виндой нужон докер при разработке. Ставить сбоку виртуалку - такое себе. А за дуалбут на рабочем ПК тебе ИБ вломит.
Ну и к моему удивлению - куча клиентов имеют WinServer и не хотят с него слазить. А без докера - разворачивать 100500 сервисов та еще боль и для сопровождения и для разраба когда его привлекают, и потом для клиента.
я клиент. у меня винда. я попросил инструкцию по развертыванию софта. А мне "вот тебе докер образ", который непонятно как ставить на винду (давно докер под винду появился а????), да еще этот образ содержит в себе еще одну винду.
ага. это тот который использует hyper-v, включение которого ломает виртуалбокс.
уносите.
А размер виндовых имаджей я как то видел. И охренел.
Может чего изменилось ведь докерхаб услужливо не показывает размеры, но чет сомневаюсь я. Это ж винда. Она даже тини весит епрст.
Вопрос стоял в возможности а не в целесообразности.
Так то нахуй надо докер в винде держать если давно всл2 работает ещё и с гпу
Ты ещё скажи, что нет смысла ставить докер на сервер с линуксом.
Шарпаны, подскажите можно ли в xUnit сообразить такой тест, который будет проверять используется ли в сборке какой-либо метод или свойство определенного класса?
Например я хочу, чтобы в сервисе нигде не использовалось свойство DateTime.Now. И хочу чтобы тест это проверял. Это реально?
Это, конечно, звездец рантаймище, нахер оно вообще надо все, когда есть современные кросс-компилируемые языки как го, а теперь уже и раст с нормальным дизайном синтаксиса и еще без ГЦ и рантайма вообще?
ну так пиши на го, какие проблемы )
если у тебя клиентура из тех "низашонипоставимрайнтайм, жаву можна, питон можна, а шарп нееееетьььььь" то можно тебя только пожалеть
можно было бы посоветовать еще триммить, но лучше пожалеть.
Шарп вообще никогда не был предназнчен для написания "утилиток". Сборка в один бинарник нужна исключительно для облегчения развёртывания бэкенда.
ну это не совсем так. те же дотнет-тулз
просто тут начинается смешное (особенно от жавистов) - "ой ой нужно еще рантайм ставить", как будто лол рантайм жавы не нужно ставить.
Сдаётся мне, это не джависты, а бывшие крестоёбы.
1. Xunit не при делах
2. Ты можешь вычитывать il байткод сборки и искать там использование того что тебя интересует
Пиздишь косой. Там много настроек деплоя в том числе и прям вот одним файлом
Сорт оф пруф
<PropertyGroup Condition="'$(Configuration)' == 'SingleFileRelease'">
<PublishSingleFile>true</PublishSingleFile>
<SelfContained>true</SelfContained>
<PublishTrimmed>false</PublishTrimmed>
<PublishReadyToRun>true</PublishReadyToRun>
<IncludeAllContentForSelfExtract>false</IncludeAllContentForSelfExtract>
<EnableCompressionInSingleFile>true</EnableCompressionInSingleFile>
<IncludeNativeLibrariesForSelfExtract>true</IncludeNativeLibrariesForSelfExtract>
<DebugType>pdbonly</DebugType>
<Optimize>true</Optimize>
<DefineConstants>TRACE</DefineConstants>
</PropertyGroup>
ну технически когда софтина распакоываеся в темп и оттуда запускается - хрень
также тримминг та еще "радость".
В принципе анпак будет только один раз на версию происходить. Синглфайл же для удобства доставки нужен как правило так что под пивко сойдёт
Под линь тоже предлагаешь собирать пакет под каждый менеджер?
Тебя извратила винда. Окстись. Инсталлеры для портэйбл софта это зло
На линуксе вместо инсталлеров надо собирать винда-стайл снапы.
ммм, а что это приложение делает кроме НИЧЕГО?
и для НИЧЕГО ей конечно же НИЧЕГО и не нужно того, что может дуть файл.
DebugType => embedded
Как бы прикол в том что он собирал сингл без рантайма а не только и не сколько потому что проект пустой
Конкретно это - да, ничего особого не делает.
На работе - у меня выводок примерно из 50 микросервисов. Самый дутый(сервис авторизации, с кучей интеграция, OAuth и прочими входами ключем с флешки) - ~28МБ и в нем примено 90к строr кода. Я не понимаю, что там за утилитка такая, что 150МБ тянет за собой.
>>800099
>>800099
Публиковал этим
dotnet publish -c Release -a x86 --os win --self-contained
Рантайм, если верить документации - лежит тама.
var elems = items.Select(m => (string)null).ToArray()
выдает результат string?[]. С чего вдруг массив результат стал сам нуллабле?
Хм.
Анон. А чем вы засеиваете БД?
Просто я чет сначала начал CSV использовать. Пока было мало сущностей связных таблиц - было норм.
Но потом - всякие связи там. Для сложных сущностей - надо в нескольких CSV связать. И все такое. Решил XML. Но с XML - чет многовато дублирующего кода будто выходит. А просто сериализовать то что в XML к тому что в БД - тоже не удобно, потому что тогда надо все ID и все это проставить, а хотелось бы чтобы XML руками мог правиться по необходимости.
В общем. Как нормальные люди засеивают базу, когда 50+ таблиц и есть штук 5 таблиц с довольно сложными сущностями?
блин опечатался
результат string[]?
то есть нулл в массиве это норма, а значит никакой ! мне не нужен
ок, с array хер поймешь. С ToList() понятнее
результат List<string>?
почему?
как и когда результат этого LINQ даже в теории может быть null?
Что ты хочешь получить вообще в elems? Мне кажется, что есть способы сделать это правильнее, но надо понять зачем тебе это вообще надо
способов миллион, но почему LINQ неправильно выводит тип
var elems = matches.Select(m => MakeSomeNullable(m)) .Where(t => t != null).Distinct().ToList();
в результате должен быть список не-нуллов, да пофиг даже если список нуллаблов. но тут у нас сам список нуллабле, что ШТА????
я решил через OfType<> который собственно фильтрует нуллы, но все равно непонятно что за херь показывает студия в подсказке
Так объясни какая твоя цель. Что такое 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.
да неважно что такое матчес. просто список чего то, все равно потом в нулл превращается
видишь пик? видишь 2 знака вопроса. Почему их 2? потому что студия написана рукожопами.
Что-то тебя даже тут заигнорили. Знакомый вкатился недавно. Откликался долго, вкатился на, кажется, 65к. Он уже думал опыт накрутить, но не пришлось
Парень действительно толковый. Он заграницей, откликался на удаленные вакансии в России.
Хз, мне кажется, проще прямо в миграции захардкодить сущности, которые ты хочешь посеять
Но я особо этим не занимался, у меня простые случаи. Зато не надо лезть в файлики, смотреть, что же там такое.
Лол, наркомания, а письмо билу не надо еще написать, раз такие портянки приходиться писать?
В общем, опять мягкие обвели меня вокруг пальца, как дешевку.
Пускай свое интерпретируемое чудо сами жрут.
Полностью согласен. Без тебя всем будет лучше
>есть штук 5 таблиц с довольно сложными сущностями?
Сидируй прямо из excel-я. Сделай xlsx файлик (или еще какой открытого формата), распиши там все данные в связанных таблицах
и дергай данные при сборке контекста прямо оттуда.
>Хз, мне кажется, проще прямо в миграции захардкодить сущности, которые ты хочешь посеять
Хуевая придумка. Гораздо проще в табличке вроде csv посмотреть, чем лопатить кучу миграции где все будет выглядеть как жопа.
В го может да, а в расте почему портянки?
Всегда думал что больше бойлерплейт приходится на полу-пустые классы в ООП.
>В своём резюме вкратце описал основные инструменты в виде наброса ключевых слов, с которыми приходилось работать (аспы, мвс и рестапи, постгрес, немного тайпскрипт и ангулар),
Ко всему этому нужно описание опыта работы. Где работал или в каких проектах участвовал, какой срок, в какой роли, какие задачи выполнял, какие технологии/инструменты использовал. И так для каждого проекта/места работы.
>>798496
>чутка описал чё вообще хочу (а-ля "интересна сфера бэкенд-разработки, хочу развиваться как специалист эмням пук"),
Всем похуй чего ты хочешь.
>>798496
>ну и ссылка на гит с парой своих серверных проектов.
Чтобы кто-то заглянул в твой гитхаб, резюме должно сначала пройти первичный фильтр в виде HR. А потом еще заинтересовать того кто будет проводить собес, тогда он может быть и заглянет туда. Это если он твое резюме не перед самым собесом получит и вообще успеет его хотя бы просто проглядеть.
Сахар нужен, чтобы скрыть бойлерплейт.
Бойлерплейт в расте скрывается через код ген макросов.
Скажем одной строчкой можно превратить, скажем main в асинхронную main (и все это компильтайм), в других языках приходится городить новый синтаксис.
Сахар это сложность, вот добавили тебе первичный конструктор, но чтобы эта шляпа работала, тонну ограничений внесли. Так что нашел чем гордиться.
студия тут не причём
так показываются ссылочные типы-не дженерики
ты можешь написать string? str = ""; и тебе точно так же подсветит что он nullable, хотя очевидно что в данный момент нет, но этой переменной ты потом можешь присвоить null, а к string без ! уже нет
sql скрипты которые генерят/либо в них прописан xml из которого заполняются таблицы
Как в нем через хаб обернутый в IHubContext<MyHub> вещать не всем подряд а конкретному соединению/пользователю?
> конкретному соединению/пользователю
Никак. Я для этого оч оч сложный код писал, который внутри себя распределял коннекты и строил сложые дикшинари
понял.
студия считает любую переменную нуллабле ведь туда можно присвоить нулл
А val в шарпе нет
Привык я, что в котлине сразу все нормально сделали и var/val и нулабилити (в том числе lateinit - где он там в шарпе? чем закончилось? просто ! ну ну)
Если тебя не смущает, что аналоги формсов потяжее в плане производительности, то всегда есть смысл использовать что то другое вместо формсов, если твое приложение не пара кнопок.
Впрочем даже если так то зачем вообще помнить формсы
А чего их помнить-то, они ж простые как палка. Это зумерские WTF надо учить по полгода.
> зумерские WTF
Чувак, ты хоть видел сколько лет WTF? Я бы понял, если бы ты сказал "зумерское MaUI", но зумерское WTF это lil
ну это если писать говнокод. я когда на формсах писал, то использовал и их убогие биндинг и MVP юзал
щас там еще какие то биндинги аля MVVM подвезли, но это уже пусть любители простоты разбираются.
А мне и в WPF хорошо.
Сам подход "что-то случилось и я бегаю кодирую что обновлять в контролах" (говнокод или даже MVP в формсах) проигрывает подходу "есть стейт. за стейтом следят кому нужно и обновляются" (MVVM, MVI)
А уже вытягивание из контрола "мне нужно значение вон того элемента" или "обновить вооон тот элемент в дереве/списке" привьет любовь к биндингам быстро.
но вообще мне больше всего нравится подход jetpack compose/swift combine/flutter. Еще наверное maui че то там обещал, но результатов не знаю. свифт, дарт, шарп БЕДНЫ на выразительные средства и потому любой контрол суть класса. а вот котлин - чистая выразительная мощь и потому там все есть функция.
По возможностям "хочу сделать так" WPF не слабее. Но сильно сильно портяночнее и "собери проект, чтобы увидеть дизайнер" (задрало)
И если хочется раздробить большое описание, то не нужно делать кучу файлов с разметкой как в том же WPF, где ты просто вынужден делать либо "одна большая портянка" либо "куча файлов на которую ты эту портянку раздробил"
С нуля - WPF сложнее.
Про сторонние решения - пиздеж. Куча штук есть которые ТОЛЬКО для форм. А ВПФ - по остаточному принципу.
У ВПФ проблемы со шрифтами.
Из плюсов ВПФ - он заставляет тебя не говнокодить. Но не говнокодить - ты можешь и на формах. Тот же MVVM вполне себе можно с формами юзать при желании, никто не запрещает.
С формами как раз минус в том, что он слишком много позволяет тебе. В результате многие разрабы - решают там срезать угол, тут срезать, получают какаху, и ругают формы.
Но. Я не то чтобы ругаю ВПФ. ВПФ, особенно если в команде больше 1 человека - позволяет упростить жизнь, т.к. уже сказал - он заставляет более-менее разделять ответственность, в результате - один чел может заниматься чисто ДИЗАЙНОМ, второй логикой и всем этим вот.
Каждому соединению создаешь группу и вещаешь в эту группу.
Это наиболее простое решение и именно так майки сами в своих примерах по работе с SignalR показывают что надо делать.
Кто перекатывался из других языков, насколько тяжело дался процесс? Насколько просели по ЗП в сумме и по времени?
Пятый пункт - пиздежь...
await HubContext.Clients.Client(client.Id).SendAsync("MethodName", arg1);
Перекатывался из плюсов.
Заняло буквально 2 вечера чтобы разобраться с дотнетом, 2 собеса чтобы получить первый оффер.
ЗП на старте - просела на 40% примерно. Но через полгода - уже нагнал.
Да. но это лечится.
На авалонии не лечится
И впф не заставляет не говнокодить
Можно писать в стиле формсов
Он дает возможность отделить логику вида от самого вида. Ну и не заниматься ручным рисованием
И всё
С другого языка. Сложно сравнивать разное, а вот порт отлично показывает как одно и то же делается в разных языках.
А без этого все сравнения бла бла ни о чем. Сишник тебе скажет что ему си норм, пхпшник скажет то же самое. Каждый кулик...
>Ну и не заниматься ручным рисованием
А если очень надо, то можно? Давненько было, но помню сходу у меня не вышло порисовать и я доделал лабу на формах
Я про кастомный вид контролов. Я не про треугольные кнопки, но иногда нужно что-то свое.
https://www.reddit.com/r/programming/comments/15m2q0o/moq_a_net_mocking_library_now_ships_with_a/
Хорошо что никто тут не пишет тесты
Выглядит что чел в попытках потешить чсв просто всё заруинил а теперь пытается судорожно всех убедить что итс прэнк бро, сорсес ис эвэйлабл он гитхубе энд айм схаре онли хэш оф юр емейле
Хотя я ошибся. Он просто хочет денег и не хочет что бы кто то мог убрать эту хуету. Прям как в f2p играх
зависит от твоего опыта. Я в течение 1-2 лет перекатился, и всё это время работал.
А ему и так пизда.
Большинство и так уже спрыгнуло с его библиотеки.
Если кто-то и донатил, то теперь точно не будет.
Ну и жирная метка "но хаир" в резюме. "Вы автор библиотеки moq? А так это вы тот мудак из-за которого мы потратили миллионы баксов из-за того, что пришлось по быстрому выпиливать ваше говно из наших проектов""
Заставит писать на джаве.
Есть интерфейса:
IDeviceReader
С методом Task<Data> ReadData(CancellationToken ct);
Тот кто его имплементировал - сделал все синхронно.
В результате - из-за ошибки имплементации - иногда "зависает" выполнение метода ReadData, если просто устройство в процессе чтения - отключить.
Собственно. Проблема в том, что я не могу таким макаром отменить чтение получается. Там даже без зависаний - CancellationToken никак не обрабатывается.
Раньше бы я просто чтение выполнял в отдельных потоках и в такой вот ситуации сделал Thread.Abort()
А как делать теперь? Я не понимаю. Просто висит зависший кусок кода. Висит пока не рестартанешь приложение. Попытки обернуть синхронную задачу в асинхронную и уже ее отменить - ни к чему не приводят. Попытки извращаться с Task.WhenAny(reader.ReadData, Task.Delay(timout)) - тоже нихуя не делают пока не завершится чтение.
Я в тупике. А разраб который имплементировал это все дело - в упор не хочет нормально сделать, придумывая миллион хуйни и отшучиваясь, а уже месяц сделать не может, ну а забрать и сделать нормально - мне не разрешают, говорят что его задача - пусть он и делает, а у тебя есть свои.
>Я в тупике. А разраб который имплементировал это все дело - в упор не хочет нормально сделать, придумывая миллион хуйни и отшучиваясь, а уже месяц сделать не может, ну а забрать и сделать нормально - мне не разрешают, говорят что его задача - пусть он и делает, а у тебя есть свои.
Значит проблема не техническая, а организационная. Создаешь подзадачу на этого чела по исправлению косяка, помечаешь её как блокер своей и занимаешься чем-нибудь другим.
ничего ты не сделаешь. Если ты не можешь по таймауту закрыть сокет или что то такое, что сразу прекратит работу этого зависшего кода и выдаст исключение, то труба.
Кто-нибуть юзает шифрование данных в бд в своем проекте?
Сейчас использую шифрование на уровне приложения, то есть любая операция с данными с базы/в базу у меня идет encrypt/decrypt.
Вопрос можно ли это сделать как-то нативно на уровне самого mssql и настроить ef?
Какие подводные?
Сейчас читаю про TDE, но до ef'а еще не дошел.
Можно, но не нужно.
Если тебе понадобится потом БД сменить (а MSSQL тебе точно придется сменить) или поменять метод шифрования, то ты огребешь охуенных проблем и сам себя проклянешь.
Что по вашему лучше использовать: шифрование на уровне базы или приложения?
На уровне приложения как по мне более универсальный способ, т.к. можно без задней мысли подменять разные субд.
И еще - какой вариант лучше по производительности или особой разницы нету?
Хорошо, спасибо, я в принципе так и подумал, буду просто хуярить на уровне маппера.
А почему мне нужно будет сменить mssql?
>Хорошо, спасибо, я в принципе так и подумал, буду просто хуярить на уровне маппера.
>А почему мне нужно будет сменить mssql?
Примерно по той же причине по которой все когда-то спрыгнули с Oracle, ну и плюс современные обстоятельства.
>>801853
>Что по вашему лучше использовать: шифрование на уровне базы или приложения?
На уровне приложения, т.к. во первых шифрование - это по сути перемалывание чисел и не является нормальной задачей для БД. Во вторых тогда между приложением и БД данные у тебя будут ходить в открытом виде. И какой тогда толк от твоего шифрования.
Вообще у меня пока бд крутится на одном хосте с приложением, но вообще ты прав анон, спасибо.
> Во вторых тогда между приложением и БД данные у тебя будут ходить в открытом виде.
Если речь о канале то постгрес и мссукель могут в тлс
Какой ответ ты ждёшь с максимально абстрактным IДывайсРыдэр.ВычитатьХуету? У тебя должен быть ивент на отключение девайса, в нём ты можешь закенселить токен, например.
Task<Data> ReadData(CancellationToken cancellationToken) {
var cts = CancellationTokenSource.CreateLinkedTokenSource(cancellationToken);
huinyaDlyaRabotySDevicom.DeviceDisconnected += (_, _) / <-- жопа твоей жирной мамаши / => cts.Cancel();
дальше в методе используешь cts.Token, если всё синхронное, то придется проверять IsCancellationRequested или на каждый пук вызывать cts.Token.ThrowIfCancellationRequested
нормальный у него вопрос. А вот твой ответ капитанский - юзай cancellationToken, люк
В этом то и проблема что код не юзает никакой из паттернов отмены и не отваливается по таймауту. И ранее такое можно было хотя бы прибить через Abort, а теперь ничего - плоди процессы.
Вот и я о том же.
Пол дня на работе спрашивал у всех коллег, мож я тупой и чет пропустил и есть какой-то механизм отмены. Все чешут репу и про токены говорят, так блядь, чел игрорит их, че эти токены дадут-то?
А чел тот - в очередной раз - гнет лыбу, что сейчас-то он сделает нормально. Месяц уже гнет. Все считай встало, потому что ЗАВИСАЕТ. А вопросы - ко мне, типа ты же его обращаешься к его коду - отмени))). Офигеть. Думаю положу выполнение вот этих вот задач в отдельное приложение и из основного - буду убивать процессы если "зависло". Другого пути лично я не вижу сейчас(((
> есть какой-то механизм отмены
Есть какой-то другой механизм отмены.
Вообще. Я не понимаю, как в 2023 году - сеньер может просто забивать на таски и асинхронщину. Вот что сложного-то?
Еще конечно решение - не давать ему самому создавать сокеты, а поменять нафиг апи, чтобы я сверху мог ебнуть сокет по таймауту. Просто в остальных случаях люди нормально сделали, а тут подключился СЕНЬЕР и просто лыбу гнет, и не делает(((
Всё бывает. Вызов com, нативных либ написанные без знания о всяких ваших там токенов.
Может зависнуть или работать когда уже не нужно. Серьезная проблема и решение костыли если возможны.
в блазоре сделал селектор выбора языка что бы понять что в InputSelect НЕТУ никакого onselectionchange!!
WTF????????
НАХУЯ? нахуя тогда вообще нужен такой компонент, я не понимаю сука.
<InputSelect class="selectpicker btn " style="color:white" data-width="fit" @bind-Value="CultureName" @bind-Value:event="OnLanguageChanged">
<option style="color:black" data-content='<span style="color:black" class="flag-icon flag-icon-us"></span>'>@EnglishNativeName</option>
<option style="color:black" data-content='<span style="color:black" class="flag-icon flag-icon-mx"></span>'>@RussianNativeName</option>
</InputSelect>
@code {
public string CultureName { get; set; }
private string selectedLanguage = "en-US"; // Default language is English
public string EnglishNativeName { get; set; }
public string RussianNativeName { get; set; }
protected override async Task OnInitializedAsync()
{
CultureName = CultureInfo.CurrentCulture.NativeName;
EnglishNativeName = new CultureInfo("en-US").NativeName;
RussianNativeName = new CultureInfo("ru-RU").NativeName;
}
private void OnLanguageChanged()
{
ApplySelectedLanguage();
}
У тебя есть возможность запустить этот таск в отдельном Application? Не в смысле в отдельном инстансе программы, а в Application.Run?
Оу, спасибо, я немного слепой.
почему ты не можешь вызвать его говнометод в отдельном скедулере и там абортнуть тред?
Разве это не чисто виндовое АПИ?
Вся та суть того что сейчас делаем - это перенос старого работавшего приложения на фреймворке с WPF на .NET6 и дробление на наносервисы.
Не путай WPF и Авалонию.
Это у авлонии проблемы сол шрифтами, у майкросфтовского ВПФ все норм и есть вагон и тележка решений (причем я считаю это уступками для идиотов).
каких идиотов. что для тебя есть идиотизм
вот у меня монитор. фулхд+
и берем аппаратное ускорение и виндовое сглаживание.
впф - мыло (лечится), гугл хром - мыло (на фф все норм), студия норм. электроны приложения - мыло, авалония - мыло (лечится только если принять их гигантские шрифты), skia - мыло (в общем то на нем и есть авалония, так что это ее косяк)
в впф лечится. и в электроне лечится - просто всем похер.
>У НАС МОДНЯВАЯ АСИНХРОНЩИНА НО УБЛЮДОК ИГНОРИТ ТОКЕН
>ну ок вернись с небес на землю запусти его каловый метод в отдельном треде и абортни его
>ты че переходи на датнет 5
вот к чему ты это высрал? у нас в тиме уже семёрка и будет восьмой сразу по релизу, какое отношение это имеет к обсуждаемому сабжу и тому как иметь дело с многопотоком - я хуй знает, но тебе должно быть стыдно за свой уровень "компетентности"
>вот к чему ты это высрал? у нас в тиме уже семёрка и будет восьмой сразу по релизу
>свой уровень "компетентности"
О, мистер компетентный сеньер
О, великий гуру многопоточного программирования
Научите меня, неуча, как абортировать треды в дотнет 5+
И я посыплю голову пеплом и буду молиться на величайшего из величайших.
Читать скрытое всем, кроме величайшего
Кстати в одном из прошлых тредов давали решение аборта треда в дотнеткор+ через хаки. вида
private static extern bool TerminateThread(
И вроде бы работало, вот только Thread подвисает в неизвестном состоянии. А еще это только винда значит.
Сказочный долбоеб...
>что для тебя есть идиотизм
Шрифт имеет свою сетку, которая при несовпадении с сеткой пикселей дисплея неизбежно ведет к говну. И чем мельче кегль, тем больше сложностей. Поэтому существуют специалисты-шрифтовики, которые этим занимаются и чуть ли не создают шрифт конкретно под задачу, чтобы добиться наилучших результатов при определенном кегле, несмотря на тот факт, что шрифт зачастую векторный и способен в масштабирование.
Это вообще касается любой векторной фигуры, которая имеет свои полюсы только при достаточной плотности пикселей, иначе проще работать с растром. Чудес не бывает.
Все методы от майкрософт в WPF это по сути костыли, которые позволяют васянам натянуть сову на глобус. Там так искажается шрифт, что одни (хром) возвращаются к мылу, другие (фф) соглашаются на покосоебленные детали.
Но есть вот прям конченые имбецилы, которые считают, что дав 5% к высоте шрифта, умещающегося в 10 пикселей, смогут каким-то там ВОЛШЕБСТВОМ добиться красивого результата. Стоит ли имаджинировать их ебала?
Так что есть три выхода у честных ребят: взять стильный модный молодежный монитор с большей плотностью пикселей и не видеть мыла, либо не мельчить со шрифтами, либо рисовать свой собственный шрифт под конкретный кегль.
Все остальное, типа привязок к пикселям — подспорье и небольшой тюнинг. Я когда рисовал мелкие векторные иконки, то все равно ориентировался на конкретный размер иконки и рисовал по сетке — только тогда получился чистенький и красивый результат. Всякие привязки делали круглые формы яйцеобразными, либо неоднородными по четкости.
Идея состоит в том, чтобы копировать это xaml документ и править цвета под конкретное приложение. А как это делать с нюгетами? Может есть возможность прикреплять сопутствующий файл?
Отпиздил бы тебя за такой нейминг.
> А как это делать с нюгетами? Может есть возможность прикреплять сопутствующий файл?
Просто переопределяешь ключи, они будут скрывать ключи из нюгет пакета.
> взять стильный модный молодежный монитор с большей плотностью пикселей и не видеть мыла, либо не мельчить со шрифтами, либо рисовать свой собственный шрифт под конкретный кегль.
вот только заставить мир покупать мониторы невозможно и глупо.
не мельчить - ну разве что в метроподобных и всякое материалдизайно приложениях такое можно. вот в GDI получается мельчить и все норм.
свой шрифт вообще не нужен если не лепим всякие аляповатые красивости (нам ехать, а не шашечки)
в итоге "кривое" сглаживание суть наименьшее зло, ведь позволяет сделать шрифты приближенные к GDI, и только особо придирчивые знатоки узреют проблему. А таких 3.5 человека на галактику. А вот мыло видно даже домохозяйка, которая и слово шрифт то не знает.
И еще можно использовать 4й хак - в зависимости от DPI выбирать рендер шрифтов тем самым сидя на 2х стульях (без пик и других торчащих предметов)
Есть вариант при установке нугет пакета в дерево твоего проекта копировался файл. Как реализовано не помню но возможность есть
>Отпиздил бы тебя за такой нейминг.
Или ты про .Border6 ... 8 и т.д.?
Я еще не определился как лучше. Суть в том, что создается очень большой список из брашей, чуть ли не около сотни, но у всех них есть пересекающиеся цвета. Вот я хочу собрать все в одну кучу, так называемых базовых цветов. К примеру Button.Border и TextBox.Border ссылаются на один базовый цвет Border. Но что-то может иметь небольшой оттенок, поэтому базовых цветов Border может быть несколько.
Как это адекватно назвать — хз. Никаких правил или договренностей на этот счет я не нашел. Называть по оттенкам Border.Dark Border.Medium Border.Light вроде как логичнее, но в зависимости от темы, Dark может стать Light и наоборот. А еще нужно, чтобы очередность именования подразумевала вставку новых оттенков.
Пока что у меня так: .Border2 .Border4 .Border6 с резервом под оттенки.
Не знаю пока как лучше поступить.
Называть нужно так, чтобы было понятно, где и для чего используется тот или иной ресурс, например - EditPageMagicButtonTooltipHeaderTextBlockSolidColorBrush
Либо чтобы сделать названия короче можно разделить словари ресурсов по страницам.
Либо, если это ресурс по умолчанию, то так и пишешь EditPageDefaultTextBlockSolidColorBrush
>Называть нужно так, чтобы было понятно, где и для чего используется тот или иной ресурс
Так он получается динамическим по своему предназначению, но статическим по ключу.
>Либо чтобы сделать названия короче можно разделить словари ресурсов по страницам.
Это так и сделано. У меня отдельный словарь потом все это смешивает.
я знаю про их опасность и поэтому содержимое этого метода в try..catch (которое и то не всегда нужно)
как по мнению студии я должен делать асинк код - хендлер + доп метод с Task что ли.
БЕСИТ
Вот бы господь покарал каждого уебана, который в своем коде async void без трай кеча делает. Эх, мечты-мечты.
Возьми да отключи ненужные предупреждения в проекте/файле
Не везде он нужен.
что такое перекат
Перекати.
>только особо придирчивые знатоки узреют проблему. А таких 3.5 человека на галактику
Это как аудиофилы, которым нужны провода из волос девственницы, чтобы убирать косяки звука, которые 98% населения никогда не услышит.
> забрать и сделать нормально - мне не разрешают, говорят что его задача - пусть он и делает, а у тебя есть свои
Правильно говорят. Тебе за это не плятят. Если начальство это не ебёт, и начальство не ебёт тебя - не твоя проблема.
В итоге у него просто исчерпается пул или будет миллион спящих потоков и приложение начнет просто тормозить
Хотя даже до этого не дойдет - ведь если девайс завис, то нужно обращаться к нему снова. Начнешь новый сеанс - бац, старый ожил и спамит своими данными в девайс. И как с этим жить?.
Так что его прямая проблема.
Терпильная тактика
а почему IReadOnlyList появились когда появились, и как костыль?
А почему фрозен коллекции только сейчас?
А почему нуллабилити появился когда появился и снова как костыль?
А почему FolderSelect диалог появился в WPF только вот щас (и то не знаю что в итоге), когда WPF уже мертвым нарекли сами мс?
А почему годами висит предложение "ну сделайте вы возможность задать ConfigureAwait(false) на уровне сборки"?
> а почему IReadOnlyList появились когда появились, и как костыль?
При этом его не реализует IList...
он имеет весь контракт IReadOnlyList , а не реализует он просто потому что про эту очевидную деталь вспомнили не на этапе проектирования языка, а аж потом и не стали ломать бинарную совместимость и получилась хрень.
На завод иди, кнопки красить. Хард скиллы до небес взлетят.
Сходи, потусуйся пол года и если что уйди в другое место или прямо в это же на другую должность.
Лично я ебал в рот управлять людьми. Как бы грустно не звучало но я хороший исполнитель и паршивый руководитель
Но допустим. У меня есть класс: СерверУстройств, СерверПользователей.
Все отличие в них - это парсер которым парсятся байтики и эндпоинты к которым надо отправить сообщение.
Так почему мне бы не сделать БазированныйСервер. Который будет в себе содержать всю логику которая общая. И при этом, вместо того чтобы возиться с женериками и конфигурированием DI - не описать в СервереУстройств и СервереПользователей - специфичные парсеры и эндпоинты.
Что будет в этом плохого?
Почему бы не сделать композицию из функций, где отличаться будет только функция парсера?
Мне не нравится наследование, потому что есть любители накрутить иерархию, а потом ебись, прыгая из одного файла в другой. Хочешь потом поменять что-то, начинается ебка с наследниками.
Но конкретно твой пример чем-то напоминает класс контроллера из аспнет, и, возможно, будет работать
DI – удобная штука. Можно сделать экстеншены и конфигурировать будет удобно
Потому что тогда начинается;
Server<TContext, TParser, TMessage, TDispatcher>
where TParser<TContext, TMessage>, IParser<TContext, TMessage>
where TDispatcher<TContext, TMessage>, IParser<TContext, TMessage>
А я этого не хочу.
Дополнительно - я не хочу чтобы мне приходилось каждый раз в случае если я что-то там добавляю - бегать и регистрировать в отдельный файл все эти зависимости.
>>807612
>DI – удобная штука. Можно сделать экстеншены и конфигурировать будет удобно
Удобная. Но в ряде случаев - не нужная.
тогда тебе правильно подсказали - vim
с райдер или студией ты будешь регулярно "да епрст че оно все красное, че оно не билдится, что за msbuild ошибка которая ни на что не влияет но постоянно висит в уведомлениях студии, да блин че ты на точках останова виснешь и появляется мессаджбок что оно что то там резолвит. чего оно тормозит то так. чего оно не обновляется без впн, что за оом при билде у меня 100500 памяти, а оно ж вроде 64битное стало и даже если оом почему его нет при повторном билде, почему дебаг такой ущербный (ну да в вим полная жопа с ним, но то ж вим, а это студия - как бы главная IDE), что за тупой навигатор по коду в 23 году блин и т.д."
с vim у тебя будет "да блин как неудобно", но тут же "так это vim, а чего я ждал" и сразу спокойствие от осознания.
Со студиями же жопа будет гореть ибо такого осознания не будет. Нет оправдания ущербности студиям и райдерам.
Ну тогда х.з.
Меня студия в принципе вполне устраивает. Можно на неё еще суперчарджер сверху накатить и вообще норм будет.
Залез в теорию по шарпу и увидел создания стека таким образом Stack randomnumber... , это че серьезно так на шарпе создается стек и другие базы?
Я просто анон, который вкатылся в плюсы и мучаюсь от этого, ибо документация для iq 300, нужно следить за памятью, а иначе идешь нахуй, да да знаю что можно создать стек на плюсах также но с помощью stl.
Пиздец, если это правда и так вы пишите стек и другие, то я в ахуе нужно было на шарп вкатываться, а не в эту ебанную головоломку
У меня другой вопрос. То как ты мысли выражаешь - это твоя личная особенность или тебя так плюсы поломали?
Нихуя же не понятно.
Да нормально написал, но скорее плюсы поломали меня.
Дико обфусцирована или не вскрывал?
Модификация дотнетовских дллок обычно буквально в два клика делается
Вроде как обфусцирована, из того что я вижу через dotPeek, в классе Licence у ребят куча полей просто не отображается (типа названия) нет.
Вот я и хочу понять каким образом там можно эту блядскую проверку на лицензию убрать, потому что в стоке она при работе с файлом накладывает туда вотермарку блэд
Если есть инструкция как лицуху в два клика крякнуть, буду благодарен если дашь))
за 1199 долларов есть надежный кряк
Стек на шарпе создается:
var stack = new Stack<int>();
Все.
В плюсах. Ты создаешь стек:
stack<int> stack;
Про память. Тебе никто не мешает прикрутить к плюсам свой умный алокатор или пользоваться смарт поинтерами.
Все, сдох.
В ходе долгих размышлений на этот счет - я пришел к выводу, что в методе - лучше использовать как раз
> var stack = new Stack<int>();
Почему?
Потому что ситуация в духе:
SupperDupperClass<SupperDupperType1, SupperDupperType2, SupperDupperType3> some = new();
менее читаемая, чем
var some = new SupperDupperClass<SupperDupperType1, SupperDupperType2, SupperDupperType3>();
Тебя это ебать не должно.
Потому что уже 500+ постов как тред в бамплимите, умник.
А у меня нет картинки с аниметянками, чтобы перекатить уехал в отпуск с новтбуком, на ноутбуке только браузер, докер и студия есть.
Ну а без аниметянок я перекатывать не хочу.
Возьми из шапки этого треда.
Ну у меня вопросов пока не возникало. Что писать? От шарпа я не ушел.
Вот давича решил воспользоваться сервисами яндекс клауда, а точнее сервисами машинного обучения: переводом, озвучкой (gpt-чат пока только для избранных) — хотел сделать себе аналог переводчика видево яндекс браузера, но для своих, локальных видео.
Какая же эта залупа дорогая получилась, пиздец просто. Если взять условный видеокурс на ~ миллион символов, то его перевод и переозвучка обойдется в 1500 рублей. За такие деньги можно и от человеческих переводчиков получить человеческую озвучку на сервисах по переводу уроков.
При этом яндекс браузер переводит контент килотоннами бесплатно.
В общем, эксперимент не удался.
Правда я тупо отправлял джейсон-реквесты, а там есть еще технология gRPC, которую мой моск не осилил, а там стоимость рассчитывается для gRPC и Rest по разному.
выглядит как просто надстройка над платным сервисом. С чего ей быть рентабельной.
>>808614
ну так это не SO. Спрашивать тут нечего.
Отчеты разве что писать
ну вот я вчера взял linq2db, а там запросы такого вида
db.Product.Set(p => p.Discontinued, true).Update();
А у меня только строки вида "Discontinued" и как вызвать Set?
И чтобы быстрее банального Delegate.Invoke
Пришлось расчехлять дикий уровень рефлексии (Set - экстеншен метод с кучей дженерик перегрузок) и юзать Expression-кодоген.
Ну я сделал в итоге. Вот я молодец. Только кому оно надо?!!
Зря ты стал на этот путь
Мне обычно глубоко похуй и добавляю в зависимости логгер от майков а там юзер пусть сам решает что, откуда и куда
Если ты выбрал среди всех этих диагностик, трейсорс, евенсорс, логгеры и выбрал таки логгеры, то вот
https://youtu.be/Sq_h5bVWJ0k?t=2006
Хотелось бы узнать есть какие то сервисы по проверке чистоты/читабельности того говнокода что ты написал ? Сам только пытаюсь учить шарпы
Да. Тут напихают от души
ну тогда разъебите что ли(заранее спасибо)
using System;
using System.Threading;
namespace Pong
{
public class Pong
{
int width;
int height;
int racketXPosition;
Board board;
Racket player;
BotRacket CPU;
Ball ball;
Score score;
ConsoleKeyInfo keyInfo;
ConsoleKey consoleKey;
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("/");
}
Console.ResetColor();
}
}
}
}
ну тогда разъебите что ли(заранее спасибо)
using System;
using System.Threading;
namespace Pong
{
public class Pong
{
int width;
int height;
int racketXPosition;
Board board;
Racket player;
BotRacket CPU;
Ball ball;
Score score;
ConsoleKeyInfo keyInfo;
ConsoleKey consoleKey;
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("/");
}
Console.ResetColor();
}
}
}
}
Гпт4:
Ваш код в целом хорошо структурирован, но есть несколько областей, где можно сделать улучшения:
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`, который определит направление движения мяча.
В целом, ваш код хорошо организован и легко читаем. Однако рефакторинг в соответствии с вышеуказанными рекомендациями поможет сделать его еще лучше.
Гпт4:
Ваш код в целом хорошо структурирован, но есть несколько областей, где можно сделать улучшения:
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`, который определит направление движения мяча.
В целом, ваш код хорошо организован и легко читаем. Однако рефакторинг в соответствии с вышеуказанными рекомендациями поможет сделать его еще лучше.
> В целом, ваш код хорошо организован и легко читаем. Однако рефакторинг в соответствии с вышеуказанными рекомендациями поможет сделать его еще лучше.
@
> Ты написал говно но мне не разрешают открыто хуесосить юзеров. Так что внемли тому что выше и не позорься в следующий раз
Настолько, что думаешь, куда расти, чтобы ИИ не заменило через пяток лет. Думаю вкатываться потихоньку в машоб
Кто, я?
но это уже совсем другая история
>>2808819 (OP)
>>2808819 (OP)
>>2808819 (OP)
Кто - то перекатил и не сказал об этом
Ответьте в некст треде на мой вопрос пж
дожили. уже жависты треды шарпистам создают.
Это копия, сохраненная 7 сентября 2023 года.
Скачать тред: только с превью, с превью и прикрепленными файлами.
Второй вариант может долго скачиваться. Файлы будут только в живых или недавно утонувших тредах. Подробнее
Если вам полезен архив М.Двача, пожертвуйте на оплату сервера.