Вы видите копию треда, сохраненную 8 ноября 2022 года.
Скачать тред: только с превью, с превью и прикрепленными файлами.
Второй вариант может долго скачиваться. Файлы будут только в живых или недавно утонувших тредах. Подробнее
Если вам полезен архив М.Двача, пожертвуйте на оплату сервера.
1. Ресурсы:
— https://dotnet.microsoft.com/learn
— https://ru.stackoverflow.com/a/416585/422180
— https://metanit.com
— https://professorweb.ru
2. С# для веб
— https://docs.microsoft.com/ru-ru/aspnet/core
3. C# для десктопа
— WPF ( https://docs.microsoft.com/ru-ru/dotnet/desktop/wpf )
— WinForms ( https://docs.microsoft.com/ru-ru/dotnet/desktop )
4. С# для игр
— Unity-тред в /gd/
— Учебники https://ru.stackoverflow.com/a/609901/422180
5. С# для мобильной разработки
— https://docs.microsoft.com/ru-ru/dotnet/maui
6. Годные ютуб-каналы
— 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
Прошлый тред: >>2433268 (OP)
— Для Windows Visual Studio ( https://visualstudio.microsoft.com/ru/downloads ). Также есть версия для macOS.
Кроссплатформенный IDE Rider ( https://www.jetbrains.com/rider ).
Если в C# хочется, но пк уж слишком хуёвый: https://docs.microsoft.com/en-us/dotnet/core/tutorials/with-visual-studio-code
8. Что нужно знать, чтобы взяли работать?
— Общие навыки — TPL, Linq, DI, интеграционные тесты. Преимущество перед такими же вкатунами даст парочка интересных пет-проектов где вы делаете всё максимально правильно и точно следуя архитектуре.
— Архитектура — DDD, микросервисная архитектура. Так же необходимо ознакомиться с паттернами проектирования. Обязательны к изучению: MVVM, MVC, MVP
— Базы данных — PostgreSQL/MSSQL + Redis/Mongo. Из ORM: EFCore обычно достаточно, но есть более быстрый, но менее удобный Dapper. Тратить время на ADO.NET не стоит.
— Алгоритмы — сортировка, поиск, оценка сложности алгоритмов, рекурсия, алгоритмы на строках.
— Структуры данных — связанные списки, деревья (бинарные, красно-чёрные), хеш-таблицы, графы.
— Системы контроля версий — обычно гита достаточно.
обычный асинхронный код. То есть самый обычный
Все эти IObservable<T> и прочие
Реактиве ЮИ комманды требуют это вместо обычного bool CanExecute.
Всё утро ебался, как это правильно реализовать, сдался и полез в документацию. а там лямбда на лямбде и расширениями погоняет. И потом в конце написано "ради перфоманса у вас всё равно это работать не будет, реализуйте автообновление самостоятельно".
Удобный хуябрик. Сейчас всё кажется сложным но в один момент ты проснёшься и всё осознаешь, буквально. После этой ночи в жизни поменяется многое
Было
a : 01 - 03
b : 05 - 07
c : 08 - 10
d : 12 - 15
e : 16 - 18
добавляем :
03-08
изменяем
d : 12 - 15 -> 10-16
удаляем
08-10
в конце ожидаем
f : 01-08
g : 10-18
и на удивление оказалось что задачка далеко не настолько простая как может показаться на первый взгляд, так к тому еще я не нашел никаких алгоритмов в интернете что бы правильно джойнить такие оверлапы.
есть хоть у кого-то идеи как это приготовить?
Профиты - асинхронно + быстро если не брать Thread'ы, но это это нужно когда надо супер быстро. Подводные следующие:
1. Легко обосраться при async-void;
2. async/await код порождает новый async/await код и заставляет переписывать старый на async/await
3. Неудобно использовать вместе с Thread
https://stackoverflow.com/questions/56868258/how-to-consolidate-date-ranges-in-a-list-in-c-sharp
А дальше? после перезвона перестать в этом ковыряться не получится.
Если сделать все так просто как ты хочешь ты получишь не правильный результат, простым циклом тебе прийдется начинать его сначала каждый раз когда какой-то диапазон схлопывается потому что он в этот момент может начать перекрывать предыдущие которые ты как бы уже "проверил", и это не самый умный и быстрый алгоритм
>в этот момент может начать перекрывать предыдущие
с чего вдруг.
если вливаемый диапазон перекрывает что то - то это будет видно при первом же и единственном проходе.
он же поглощает, а не набивает пузо
Примерно вот так:
class cl : Interface {
bool Interface.Method(...)
.
.
.
}
Дай мне свою голову, я вложу в неё своё понимание.
А что сложного? Наоборот, новичку в проекте позволяет легко понять что от чего зависит.
Не вроде, а точно можно.
Ты прав. Я слишком все усложнил.
Сам по себе DI не особо прикольный, а вот IoC контейнеры, значимой частью которых и является DI, это крайне сильная вещь для построения очень сложных систем.
DI же без IoC тебе просто даёт разносить код по разным классам.
> Сам по себе DI не особо прикольный, а вот IoC контейнеры, значимой частью которых и является DI, это крайне сильная вещь для построения очень сложных систем.
Ioc это инверсия управления? Можешь пояснить, зачем оно надо? Ну зависит класс не от другого класса а от интерфейса, что это дает?
IoC это автофабрика объектов. ты регистрируешь зависимости, а оно само собирает
Очень удобная штука.
class Foo
{
public Foo() {
Console.WriteLine(%ЧТО-ТО%);
}
}
var Boo1 = new Foo(); // Консольный вывод: Boo1
var Boo2 = new Foo(); // Консольный вывод: Boo2
с чего ему вдруг знать имя без дополнительных средств, которые тоже ограничены ибо специфика
так что у тебя в руках только 2 инструмента
nameof()
[CallerArgumentExpression]
Давайте попроектируем абстрактно.
Допустим, будем придумывать облачную систему менеджмента ресурсов.
Под ресурсами понимаем - любую хуйню, которую можно как-то измерить.
Так вот. Допустим мы не знаем какую хуйню мы можем измерить. Но мы уже знаем, что нужно будет графики красивые строить, нужно оповещения о том что что-то привысило лимит, либо подходит к нему, нужно чтобы некоторые действия происходили при определенных условиях.
Ну, допустим кейс: мы измеряем количество топлива в самолете, и если количество топлива приближается к границе - отправляется уведомление диспетчеру, чтобы тот 1. Предупредил пилота, 2. Уже готовил команду для дозаправки.
Или другой кейс - при приближении к нижнему порогу количества чернил в принтере - уже состовляется заявка на замену картриджа, и в момент исчерпания реусрса картриджа - уже бежит эникей заменять.
Так вот. Какие сущности вижу я:
1. Нам нужна некая система именно что измерений. Тип измерения - абстрактный, содержит в себе только имя, и опционально - описывает метод проверки на нуль и сравнения значений. Сами измерения представляют из себя сущность вида: Метка времени, тип измерения, значение.
2. Нам нужна некая система профилей измерений для разных сущностей. Некое описание объекта, через его измерения.
3. Нам нужен канал получения данных. Это может быть некий протокол сетевой, может быть ручной ввод, может быть рассчитанное значение. Все это должны быть каналы получения данных. Данные отсюда - не знают что они такое.
4. Именно поэтому нам нужен некий интерпритатор/форматтер, который полученные данные из канала - преобразует к измерению.
5. Дальше - нам нужна некая система триггеров и пороговых значений. Ну, тут все просто. Имеем профиль, а дальше дело техники.
6. Нужна некая система действий. Простейший вид - действия определены заранее(отправить сообщение, воспроизвести звуковой сигнал). Чуть более сложный - действия можно комбинировать. Совсем сложный - пользователь может сам создавать действия на основе некоего графического языка программирования.
Вот так я это вижу.
А как бы вы такое спроектировали, шарпаны?
Давайте попроектируем абстрактно.
Допустим, будем придумывать облачную систему менеджмента ресурсов.
Под ресурсами понимаем - любую хуйню, которую можно как-то измерить.
Так вот. Допустим мы не знаем какую хуйню мы можем измерить. Но мы уже знаем, что нужно будет графики красивые строить, нужно оповещения о том что что-то привысило лимит, либо подходит к нему, нужно чтобы некоторые действия происходили при определенных условиях.
Ну, допустим кейс: мы измеряем количество топлива в самолете, и если количество топлива приближается к границе - отправляется уведомление диспетчеру, чтобы тот 1. Предупредил пилота, 2. Уже готовил команду для дозаправки.
Или другой кейс - при приближении к нижнему порогу количества чернил в принтере - уже состовляется заявка на замену картриджа, и в момент исчерпания реусрса картриджа - уже бежит эникей заменять.
Так вот. Какие сущности вижу я:
1. Нам нужна некая система именно что измерений. Тип измерения - абстрактный, содержит в себе только имя, и опционально - описывает метод проверки на нуль и сравнения значений. Сами измерения представляют из себя сущность вида: Метка времени, тип измерения, значение.
2. Нам нужна некая система профилей измерений для разных сущностей. Некое описание объекта, через его измерения.
3. Нам нужен канал получения данных. Это может быть некий протокол сетевой, может быть ручной ввод, может быть рассчитанное значение. Все это должны быть каналы получения данных. Данные отсюда - не знают что они такое.
4. Именно поэтому нам нужен некий интерпритатор/форматтер, который полученные данные из канала - преобразует к измерению.
5. Дальше - нам нужна некая система триггеров и пороговых значений. Ну, тут все просто. Имеем профиль, а дальше дело техники.
6. Нужна некая система действий. Простейший вид - действия определены заранее(отправить сообщение, воспроизвести звуковой сигнал). Чуть более сложный - действия можно комбинировать. Совсем сложный - пользователь может сам создавать действия на основе некоего графического языка программирования.
Вот так я это вижу.
А как бы вы такое спроектировали, шарпаны?
Просто меня немного подзаебало, что вот есть контроллеры. Вот есть сервисы. Я хуйнул Either<TResult, TError>, переопределил приведение.
Сейчас контроллеры выглядят примерно так:
public IActionResult GetList() => _service.GetList();
В случае если все ок - вернется лист, если не ок - ошибка вида:
{
Error:Code,
Message: ErrorMessage
}
Но чет я думаю - и со стороны ж не очивидно. Типа да, коджа стало меньше, он чище. Но теперь кому-то еще - нужно лезть в реализацию сервиса, чтобы понять, чому ему возвращается что-то там. А потом - разбираться как оно работает.
Короче. У вас такое делают?
Я думаю хуйня. Контроллер отвечает за возвращение результата на запрос, пусть он этим и занимается.
Ну блин. Мне не нравилось, что в таком случае - сервису нужно какую-то хрень делать.
Вот мне нужно получить по Id что-то.
Сервис полез в базу. Не нашел.
Что он должен вернуть? Null? MyNotFoundResult? Что еще?
Так я возвращаю Error.NotFound
А в контроллере просто делаю
return _service.GetItemById(id).ToActionResult();
>Что он должен вернуть? Null? MyNotFoundResult? Что еще?
Сервис может вернуть пустой список или ссылку, а уже контроллер смотрит на результат и решает, что отправить в ответ..
Нормально вроде. Херочки из чатов пишут иногда, а что ?
>Что он должен вернуть? Null? MyNotFoundResult? Что еще?
Что надо. Это называется контракт.
>А в контроллере просто делаю
то есть контроллер знает что ему возвращать, а сервис знать не может да?
зы: контроллер должен быть тонким
посмотрел по диагонали. ох любит народ лисапедить.
1 бесполезно проверять через Dns.GetHostEntry. Это ни о чем не говорит. Делай запрос и в случае проблем уже разбирайся что не так.
2 Convert.ToDouble(readver) это вообще что такое блин. Есть же Version.TryParse. Как он будет в дабл перегонять 1.2.3.4?
3 taskkill /f - пох на несохраненные данные. юзер сам виноват ага )
Да норм всё, устроился без опыта даже на норм стек и продукт
до ассемблера далеко. на уровне сборки все имена на месте
Это нельзя сделать. Среда CLR внутри себя переменные может переименовывать. К примеру int a = 5; будет переименовано внутри метода как int num = 5; Помимо этого в Release если они не используются, то они даже не появятся в низкоуровневом C# коде, т.е и память на них не выделится и соответственно получить даже их значение нельзя. Однако, если эти переменные используются, то их можно получить, но имена их - нет.
К слову, подобный способ не всегда работает в Release режиме, поскольку компилятор упрощает код и внутри метода вместо объявления новых переменных он просто сразу закидывает их значения в методы Console.WriteLine():
Т.е вместо:
int a = 5;
Console.WriteLine(a);
Будет
Console.WriteLine(5);
Тогда локальные переменные можно получить если ты их создаешь, например, в результате выполнения другого метода И при этом используешь, иначе компилятор опять съест неиспользуемые локальные переменные.
Так же хочу еще добавить, в IL коде имён переменных вообще нет (вроде), там просто происходят манипуляции со стеком, а при вызове какого-то метода значения достаются из стека.
А что не так? Ты можешь получить любые имена, кроме локальных переменных. Когда ты помечаешь атрибутом CallerMemberName какой-то входящих параметр в методе, то при передаче условного поля в этот метод атрибут просто получит имя входящего параметра. Входящие параметры это не локальные переменные.
Да - это Хач! Он такой, да. А ещё если твой пост ему в конфочке написать, он завизжит и забанит. Нуфф сказал.
Странный какой-то метод обновления.
1. Твой домен могут подменить без каких-то вопросов, в результате - его метод удалит его же программу.
2. На каждый запрос создается HttpClient. Нахуя?
3. Заменяет программу целиком. Что это вообще за бред-то? У тебя вышел микропатч на здоровенную программулину, допустим кнопка глючила на такой-то вкладке в такую-то фазу луны. Ебись оно все конем - 10 гигов качаем, сносим все. Бред короче.
4. Общая подача, дескать я пиздец как разбираюсь, а потом пук-сереньк, если бы мне не сказали, я бы никогда не узнал, что такое workdir. Это уже не вопрос к методу обновления, а к самому челу.
5. Версия приводится к double - что вообще за бред-то? У нас на работе, допустим, система версий вот такая: 1.0.0.0beta1buildTimebuildHash
6. Почему не делать как человек: скачали, подождали пока пользователь закроет программу, и после этого - обновились, либо при следующем старте.
JetBrains Datagrip
Тоже не перестаю охуевать. И ладно другие языки, но шарп! Майковский язык, созданный с прицелом на винду. Но нет, пердолек это не останавливает.
Кривое говно
>>447480
Кхм. А на чем будет ваш шарповский код крутиться? 10 лет назад - еще было непонятно, там вроде и люмия была, и десктом еще вроде как жив. Сейчас - шарп на 90% это веб-хуйня, с прицелом на облака.
Ну так вот. Сейчас на шарпе не для линукса будет писать либо дурачок, либо застрявший на легаси, либо чел который кодит для себя. В остальных случаях - ты пишешь под линукс. А если пишешь под линукс - хорошо бы и окружение линуксовое иметь. Потому что я ебал проверять что все нормально работает в WSL или на виртуалке.
Оконные приложения сейчас пишутся на Шарпе. Некоторые игры, например, X-com, пишутся на шарпе
А 90% остальных программулин - это веб-хуйня на асп, чтобы жсоны гонять.
Но я веб-макака будущая, так что и по этому критерию тоже линукс. Увы, Датагрип не помог сконнектиться с блядской мелкософтовской бд. Ошибка и иди нахуй. В чем ошибка, что поправить - иди нахуй. Типичные майки. Контора пидарасов.
Ну, разве не удобнее так оно выглядит?
Типа да, в такой реализации - всегда 200 вернется.
Но 1. Я сторонник всегда 200. 2. Можно не к строке с жсоном приводить, а к тому же ActionResult MVC'шному.
>Сейчас на шарпе не для линукса будет писать либо дурачок,
Есть разница писать ДЛЯ линупса сидя в мощной визуал студии
и НА линупсе
>все нормально работает в WSL или на виртуалке.
жуть какая. это нужно нейросетями баловаться чтобы такая проблема возникла
>>447653
>Но я веб-макака будущая, так что и по этому критерию тоже линукс
Я пью воду, я пью - значит я алкаш. Логично же )
без явного указаний типа ref
всегда что-то копируется
разница лишь в то что копируется
для значимых типов - значения
для ссылочных типов ссылка
ListNode first = head копирует ссылку из head в переменную fisrt
потом что хочешь делай с оригиналом, копию это не затронет.
Чтобы поржать.
https://pastebin.com/Jq96CrWU
В первом передаётся строка hello1?=1/1, во втором
hello2/1/1, но так как это надо можно распарсить как hello2 => 1 => 1, то вот делается такое приведение
> то вот делается такое приведение
Это понятно, но почему в 1-ом случае на выходе он делает обратное преобразование, а во 2-ом нет?
Интересно, что на входе он автоматически экранируется в обоих вариантах.
Как получить оригинальную строку при использовании 2-го варианта?
Да
Студия написана на нормальном языке, а ридер на жабе.
За 15 лет экспирианса десктопного линукса, его так нефига до ума и не довели, большая часть окошечек-приложений выглядят на уровень лаба1. В итоге сложилось впечатление, что на этом говне реально сидит 1,5 анона, но по требованию из инета звучит так что линукс-десктоп это 99% рынка и все возмущаются - "да как же так! Нет кросс-гуи на линупсы!" это не отменяет того факта, что MAUI выпилили технично линукс, который там был, лол
Можно потыкать Compose Multiplatform, дурацкое схожие название, которое вводит в заблуждение, но это именно гуишка. Я лично жду когда они начнут свои флагманские проекты на нем писать, ибо это выглядит хренова, когда автор технологии сам в своих продуктах юзает поминимому
если выражение после if/for идет многострочное то лучше поставить скобки {} везде. Если все условия не многострочные то лучше без скобок
Потому что майкрософт ушёл из России. Скоро все будем на Роса ОС сидеть.
Ставь скобки везде, будь скобкоблядком, как мы!))
> это все таки котлин
…который тянет за собой ЖВМ.
> больно много в ней "блин а это как блин делать?"
Открытая в соседнем окне документация решает проблему. Вот, например, третьего дня решил поначалу неочевидный для меня момент с IObservable<bool> в качестве параметра CanExecute команд. Я дико ругался и топал ножками, что за хуйню они выдумали и как это туда передать? А оказалось всё просто и удобно, через WhenAnyValue.
Потому что либо ты платишь и профи делают всё за тебя, а ты только готовые компоненты расставляешь, либо делаешь всё сам. Бесплатно. Другой реальности у нас для вас нет.
>…который тянет за собой ЖВМ.
на это как бы плевать, шарп тоже тянет clr
там другие траблы
наряду с няшным синтаксисом от которого у меня постоянно в шарпе пригорает "ну почему в шарпе так нельзя" имеем торчащие уши жава рантайма и не самая понятная система корутин.
>Открытая в соседнем окне документация решает проблему
нет не решает. частично решает если ты решил использовать именно реактивеуи, но даже в кратком списке что я вот вспомнил реактивуи никак не поможет.
ну и конечно же шрифты с их мылом.
> няшным синтаксисом
Синтаксис всем хорош, вот только паскалевские объявления переменных с типом впозаде всё портят. Тип должен быть первым, это не обсуждается, поэтому котлин соснёт и займёт своё место на свалке истории. Можете скринить.
> в кратком списке что я вот вспомнил
Пили список. Порешаем вместе. (И я попрактикуюсь).
Как же хорошо, что devexpress платный! Я вообще за то, чтобы платными сделали ещё и WinForms, WPF, UWP, MAUI, Avalonia и Eto.Forms.
>с типом впозаде всё портят
на любителя. я выучил шарп за многие годы как изучил питон и котлин, и мне типы позади нравятся больше.
>Пили список. Порешаем вместе
да хотя бы тот что я дал
триггеров в стиле нет - вместо них нужно юзать бехавиорсы какие то
инпутбиндигс нет - снова бехавиорсы
дизайнер - DesignInstance нет. <Design инстанцирует вьюмодель что плохо.
дизайнер с его постоянными придирками "плохой хамл" но при этом все прекрасно работает.
Visibility.Hidden нет и так и не нашел чем заменяется
шрифты на винде мыло. вроде там внедряли ClearType (в упор не видел разницы) но в skia опять сломали (хотя я разницы и не увидел)
> <Design инстанцирует вьюмодель что плохо
Эм... А какая разница? Этот инстанс же только в дизайн-тайме?
Ну он как бы не инстанцируется без пустого конструктора
а делать пустой конструктор ради только дизайнера - на нах
в итоге он пытается что то там резолвить и выдает NRE
в WPF есть IsDesignTimeCreatable=False что решает проблему
а тут хрен
У меня вопрос. В геймдеве - не научились отключать уровни логгирования в самом логгере, чтобы не писать это вот if(Log.Level >= LogLevel.Information) ?
Ну, банально блин, обернуть этот вот статический класс другим таким же, чтобы не хреначить постоянно это вот if(Log.LogLevel), а дергать его.
А по хорошему - вообще сделать обертку без статики, прокидывать ее к твоему коду.
это защита от лишних аллокаций же. даже если в логере вывод отключен, то твои данные для лога аллоцируются, боксятся и так далее.
Это только в 10 шарпе появилась возможность сделать это дешевле, но это не про геймдев.
Хер знает какие там лишние аллокации. У нас на работе - логгировать нужно каждый шаг, потому что правила такие, чтобы потом можно было восстановить, какие пакеты приходили, есть ли там проблемы с сетью и прочее. Так вот, 40к подключенных устройств с трафиком под 100ГБ/с, без лога - 800мб, с логом - 810МБ. Да, я логгер писал свой, но там никаккой магии, простой поток, который очередь разгребает, а при остановке приложения - все что осталось в очереди - пишет.
Короче. ХЗ. Экономия как по мне на спичках, при этом код - ужасно неудобен из-за того что потом придется везде менять это вот, вместо того чтобы просто конфиг поправить в одном месте.
>который очередь разгребает
он разгребает НЕНУЖНУЮ очередь. каждый вызов метода логирования вызывает необходимость аллокацировать хотя бы LogEntry для постановки в очередь + боксинг для параметров, а то и вычисление самих параметров.
Если неудобно, то вот есть подход (тайминг)
https://www.youtube.com/watch?v=Sq_h5bVWJ0k&t=2130s
https://devblogs.microsoft.com/dotnet/dotnet-6-is-now-in-ubuntu-2204/
в смысле? Это всегда так было, ты чего?
> а делать пустой конструктор ради только дизайнера - на нах
Делай конструктор с дефолтными значениями параметров.
> В чем не прав этот интеллигентый господин?
В том, что растянул на 16 минут 3,5 слова про то, что джава говно, а шарп лучший!
законом не запрещено писать и на ассемблере. хули ты на языке высокого уровня пишешь? чего экономишь то?
Мне нужны только подсказки имен и для этого пытаться реализовывать весь контракт вьюмодели мне нах не всралось - это тупо бойлерплейт.
> чтобы не писать это вот if(Log.Level >= LogLevel.Information) ?
Ну напиши это вот один раз псевдосвойством с геттером и вставляй везде.
[code]
bool LogLevelInfo { get => LogLevel.Debug >= LogLevel.Info; }
void test()
{
if (LogLevelInfo)
{
Console.WriteLine("Okay");
}
else
{
Console.WriteLine("Not Okay");
}
}
[/code]
Двачую! А я уйду на Лазарус/фрипаскаль.
и как это отменяет необходимость писать if на каждую строчку кода? никак
та же херня и в Diagnostic
> необходимость писать if на каждую строчку кода?
А вот это сообщение попахивает дурной архитектурой.
Как по мне, так лучше завести таки по отдельному методу расширения для каждого метода логгирования, в которых и будет происходить проверка, и навесить на каждый [MethodImpl(MethodImplOptions.AggressiveInlining)]
Типа
[MethodImpl(MethodImplOptions.AggressiveInlining)]
public static void TraceIfEnabled(this Logger logger, string mesage)
{
if (logger.Level >= LogLevel.Tracing)
{
logger.LogMessage(message);
}
}
В таком случае, с очень большой вероятностью при компиляции тело метода будет поставлено в места его вызова, а там уже компилятор проведет внутриподецурную оптимизацию (один из самых простых видов оптимизации для него) и повырезает лишние аллокации.
Так это по сути и есть такая же обёртка. Мне просто удобней, когда есть отдельные методы для каждого из уровней логгирования. И, судя по наличию в MS.Extensions.Logging методов расширения типа LogDebug(this ILogger, ...), это удобно не только мне. Можно, конечно, вообще сделать и обёртку по твоему типу, и метод расширения.
причем тут архитектура до строчки лога
>>450182
>снабжая логлевелом
в огороде бузина а в киеве...
ты вообще не понял суть проблемы
>>450179
>AggressiveInlining 256 Метод должен по возможности выполняться как встроенный.
>по возможности
как то все ненадежно.
вариант с видео от Jetbrains пока самый лучший
> при компиляции
разве что при третьей -- второй IL->native компиляция.
в ИЛе это отдельный метод остаётся, я многократно проверял
Ну как бы да. Но, как по мне, это не проблема. Скорее всего, если ты пытаешься так изъебнуться с оптимизацией логгирования, то ты опасаешься, как бы оно не оказалось в горячем коде и не начало там стрелять. А горячий код у тебя, так или иначе, через какое-то время будет пересобран JIT-ом на максимальным уровнем оптимизации. А там и PGO ещё подтянуться может, который отметит, что код под условием ни разу не выполнялся, и выкинет его к херам, оставив на всякий случай fallback.
проблема стара и проста
1 ты пишешь логи уровня трейс допустим. никаких проблем
2 тебе не нужны на продакшене такие подробные логи и ты отключаешь на уровне логера писать трейс в лог, но все строки logger.Log* по-прежнему продолжают вычисляться, рождать никому не нужные объекты, делать боксинг. На все это зря тратится cpu и нагружается gc
3 Это не те строчки лога, что можно вырезать через ConditionalDebug - они должны быть в сборке продакшена.
И потому чтобы решить проблему ты берешь стандартное решение - У КАЖДОЙ строчки лога пишешь if(TraceEnabled)
4 потом тебя задалбывает писать этот if и ты идешь искать решение как писать поменьше бойлерплейт кода.
> но все строки logger.Log* по-прежнему продолжают вычисляться
> ты берешь стандартное решение - У КАЖДОЙ строчки лога пишешь if(TraceEnabled)
Но я предложил написать этот иф единожды в методе-обёртке.
Соответственно, в продакшене метод-обёртка будет пропускать неподходящего уровня вызовы, и не пускать их дальше в логгер, и методы логгера не будут вычисляться и занимать память.
Почему же я неправильно понял суть проблемы?
Подход с if-ом также позволяет избавиться от операций по подготовке сообщения для логгирования. К примеру, сборки строки сообщения с подстановкой в нее значений различных переменных.
Предложенный тобой способ избавляет от записи лога, но все же требует, чтобы сообщение было собрано до вызова метода.
Значит, вынести сборку сообщений в отдельные методы и передавать эти методы коллбэком в обёртку. В том числе лямбдой на месте писать:
Add2Log( Loglevel.Level, () => { // Сборка месседжа здесь; } );
Предложил переобъявление рекордов с новыми значениями заменить на
var new record = oldRecord with {someProp = newValue}
А эта хуйня делает теневую копию - не копирует строки и референс тайпы а копирует их ссылки.
И нахуя такой авторефакторинг предлагать спрашивается?
Какая из старых версии мне лучше подойдёт (4Гб памяти)? 2015?
Где-то так, но там и будет какой-то дотнет 2 или 3, который та же самая лютая некрота.
>Но всё равно старое говно.
А как быть-то. Качать новую, но ставить минимальную комплектацию и использовать офлайн документацию?
хз че за классы-атрибуты
if бесплатен
Подход jetbrains тоже бесплатен при выключенном трейсинге, а если включен то очень очень дешев.
инлайн метод - тут не котлин где инлайн методы есть и надеятся встроит не встроит это не дело.
Устанавливай .net 3.1 и какую-нибудь vs 2015. для пту хватит.
В данном случае да, так как они инстанцируются один раз при загрузке класса. Объекты лямбд же у тебя будут создаваться каждый раз при вызове такого метода логгирования. Ведь чтобы сбилдить строку, зависимую от аргументов, ей придется эти аргументы замыкать. Ну если только ты туда не хочешь статическую лямбду передавать. А это тупо, так как в таком случае проще строку один раз собрать и не париться с какими-либо лямбдами.
> Объекты лямбд же у тебя будут создаваться каждый раз при вызове такого метода логгирования
Ну значит создать делегаты под каждый случай по одному разу и передавать их, а не лямбды.
Как ни крути, получается бойлерплейт, проще не ебать мозги и юзать иф.
> я аутист с некропк, который предпочитает писать в блокнотике и кокомпилировать ручками
Ну и не ставь студию, пиши в блокноте, компилируй через C:\Windows\Microsoft.NET\Framework\v4.0.30319\csc.exe
Не, пусть ставит дотнет 6 и вс-коде. Конпелирует пусть через dotnet run / dotnet build / dotnet publish. Я так делаю на своей некропеке, базарю, всё летает, ещё захочеш!
Пока вижу только вариант использовать один экземпляр StringBuilder. И его метод:
AppendFormat(String, Object, Object, Object)
Предварительно все аргументы привести к строке, чтобы избежать боксинга. А если аргументов больше 3х, ну придется аллоцировать, хотя в обычной ситуации больше 3 и не надо.
мне говорят что ентити будет делать 100 реквесто в базу, я считаю что убдет делать 2, кто прав?
Если я создам структуру, внутри которой будет поле массива, то это будет плохой идеей? Тогда структура будет передаваться по значению?
Если уж так горит сделать с минимумом аллокаций, то можно string.Create заюзать. Правда придется сначала вручную вычислить длину финальной строки, а потом же вручную копировать span-ы строк аргументов в span финальной.
использовать 10й шарп
>GC сам должен управиться со всей магией
он и управляется...за счет поедания ресурсов на свою работу
> Типичное зумерье, которое верить, что чем ниже язык тем производительнее.
Чем более низкоуровневый язык, тем меньше накладных расходов.
> Что не ассемблер? А может сразу машинный код?
Ты дурак? Ассемблер это набор мнемоник для машинных кодов.
>Чем более низкоуровневый язык, тем меньше накладных расходов.
только есть тонкость. растет сложность и в итоге компилятор рождает более эффективный код, чем человек.
В случае с написанием кода на ассемблере компилятор сей действительно скорее всего родит более эффективный код, однако к более высокоуровневым языкам это не относится. А про интерпретирумые вроде шарпа и речи не идёт.
Как бы net-ий MSIL перед выполнением каждого метода собирается JIT'ом в машинный код. Классической интерпретации уже давно нет. Плюс JIT потом может пересобрать методы с большим уровнем оптимизаций. А так как JIT имеет доступ к статистике исполнения кода, то он может сгенерировать код более эффективный, чем выдал бы AOT-компилятор. Как пример, в рантайме JIT может убедиться, что у интерфейса есть только один класс, его реализующий, и выполнить девиртуализацию вызова.
>Эффективно юзать буфер из массива байт, а потом его привести в строку (не просрав кодировку).
Так стринг билдер этим и занимается. Нахер городули городить? Еще и медленнее получится.
в общем повторю
1 переходишь на дотнет6
2 читаешь вот это https://devblogs.microsoft.com/dotnet/string-interpolation-in-c-10-and-net-6/
3 нихера не понимаешь
4 ???
5 профит
> В случае с написанием кода на ассемблере компилятор сей действительно скорее всего родит более эффективный код
Дядь Вась, ассебмлер это И ЕСТЬ МАШИННЫЙ КОД
> нихера не понимаешь
Прочитал треть, дальще стало скучно. Понял, что майки продолжают совершенствовать шарп и оптимизировали компилятор. Молодцы, чо. Спасибо.
Почему диспатчер все называют диспетчером??
Кстати да!
> с написанием кода на ассемблере компилятор сей действительно скорее всего родит более эффективный код
> то есть прессуппозицией является то, что ассемблер это язык, который подвергается анализу, а не просто перекладываемый 1:1 в байт-код процессора
И какое же слово я прочитал неправильно?
Да, все таки жопочтец. Я имел в виду, что код написанный на си, и скомпилированный в машинные коды скорее всего будет столь же или даже более эффективным, чем код написанный вручную на асме.
Судя по профайлеру он каждый раз делает новый запрос
жопочтец как раз ты. где я спорил с ЭТИМ тезисом? Я спорил с тем, что ассемблер не перекладывается 1:1 на нативный процессорный язык, а не с тем что сишный код будет быстрее за счёт всяких Спанов и прочьего. Не надо мне приписывать того, что я не говорил.
>после них другие языки кажутся недоделаными.
кому как
в котлине синтаксис лямбд куда приятнее.
Тоже сначала так считал, пока не стал замечать в кодах лямбду в лямбде, лямбдой погоняя. В итоге уже на хрен знает какой ступени теряешь понимание что вообще тут происходит.
Да, опять программисты плохие, язык хороший, но язык способствует такому синтаксису и люди это делают. А лямбда должна быть короткой и понятной, а не размазанными кишками бизнес логики
> $"Hello, {name}! How are you on this fine {DateTime.Now.DayOfWeek}?",
Как же я люблю ПоХаПэ
Я имею ввиду языки без лямбд. А в котлине глянул, вроде синтаксис такой же, стрелка и скобачьки.
Почему бы не применять полезную мировую практику?
>в кодах лямбду в лямбде, лямбдой погоняя.
ну в обычном коде - ссзб. а в DSL это просто пушка.
>>451021
ну да. делали "свою жаву" и потому много изначально не сделали нужного, а потом уже впихивали как придется - IReadOnlyList, nullable, $"", [^1]...
>>451022
>вроде синтаксис такой же, стрелка и скобачьки.
которые можно не писать если у тебя один параметр, да и сам параметр можно не писать. и вынести тело ламбды из вызова в блок, если ламбда параметр последний (такое еще в руби и руби силен именно DSL). Да и сигнатура выглядит приятнее
Func<string, int> vs (String)->Int
и поскольку там есть инлайн, ноинлайн, кроссинлайн жуть, то для них есть и возможность указать ретурн с точным указанием из чего ты делаешь ретурн.
А еще там есть скоупы - то есть допустим ты определил расширение к string типа "".Md5() Так вот ты можешь сделать скоуп - и только в нем будет доступно это расширение и больше нигде.
Результат этого - jetpack compose прямой которого эквивалент на шарпе выглядит бы коряво, да и работал бы не так
Чел, видимо ты ни разу в жизни OutOfMemoryException не ловил.
Может быть для твоего легасного проекта с 1 rpm это и не важно и преждевременно, но когда начинается настоящий хайлоад приходится выкручиваться и писать allocation free код.
> IReadOnlyList
А что не так? Рид-онли листов быть не должно?
> nullable
А здесь-то что не так?!
>А что не так?
они внедрены ПОЗДНО, а значит их впихивали "как получается", а не по нормальному.
как итог IList не наследуется от IReadOnlyList
можно побухтеть про Interface Segregation Principle, но по факту у тебя по коду ходит Ilist и ты не можешь передать его просто туда, где ждут IReadOnlyList. А ведь именно так и правильно ожидать, то есть делать минимальный контракт. Но это неудобно и потому народ так и продолжает гонять везде IList по методам (я не из таких - у меня контракты жесткие и мне неудобна)
nullable же пришлось вводить как хинтинг. Можно конечно попробовать трактовать как ошибки, но это создаст свои проблемы - я пробовал Threat Warnings As Error и в итоге выключил нахер.
> как итог IList не наследуется от IReadOnlyList
ну естественно. Рид-онли коллекции запрещают изменение или добавление элементов
> там есть
> есть и возможность
> А еще там есть
Но энивей это жаваподелие, которое тянет за собой жаварантайм. Странная придирка из треда, который аналогичный рантайм за собой таскает, но всё же. Присматривался к котлину. Вроде неплохо, но что-то смущает.
>ну естественно.
перечитай внимательнее гринтекст )
>>451061
> который аналогичный рантайм за собой таскает
я выше писал. срать на таскание рантайма - он везде большой и его можно установить и бинарник будет маленьким.
беда котлина это жава рантайм - нет типов, нет структур. сильная сторона - синтаксис и фичастость.
у шарпа синтаксис лучше жавы, но все многословнее и топорнее чем у котлина.
>Странная придирка из треда,
Что поделать. Когда пишешь на нескольких языках, то постоянно в каждом языке "блииин ну почему тут так не сделали, удобно же"
Ну, допустим у меня на моем проектике - 10к+ rps.
Сервер для взаимодействия с устройствами. Устройства подключаются, висят на сервере подключенные, с ними может как сервер взаимодействовать так и кто-то извне что-то делать через сервер.
Юзал лямбды активно.
Относительно потребляемой памяти. 100к единовременно подключенных и висящих устройств и 10к клиентов что с ними работают. Трафик под 100Гб/с
2 ГБ оперативки.
Хуй знает короче. Я не то чтобы оптимизатор какой-то там. Единственное что делал оптимизатроского - свой буффер и пул для работы с памятью, ну и не юзал я этот вот хост который сейчас майки используют, а просто сделал свой, кек, в котором только то что мне нужно было. Но вот так вот. OutOfMemoryException за два года непрерывной работы хуевины - ни разу не было ни на одном из объектов где оно крутится.
Если нет захвата переменных лямбдой то такие лямбды не влияют на память и gc ибо создаются один раз
Да что ты? Где же Vector3 двойной точности?
Куча это объём неаллоцированной памяти, там ничего не хранится кроме мусора от предыдущих программ
Да. Даже если список пуст
ты еще скажи что куча это гомер.
Span<char> наиболее быстро. Быстрее только наверн сделать функцию на С++ и потом маршаллить её результат в C#, но и тут свои подводные есть.
> маршаллить её результат в C#
Я чекал вариант с dll на сях. Да, сявый код работает быстрее, но эта скорость нивелируется ценой вызова функции из dll
IdentityServer пока забей, он платным с недавних пор стал. Сейчас все переходят OpenIdDict
Всё зависит от контекста. Дай побольше информации о задаче
Дедушка, подскажи пожалуйста, что для аутентификации учить зумеру?..
ну спаны это уже ручной труд
ну вот либа ZeroLog которая логгер без алоков
он основан на ZString
а с выходом 10го шарпа стал использовать интерполяцию.
так уж лучше ZString использовать чем руками городить спаны
а зачем вот писать кучу экономных жсон сериализаторов если есть многофункиональный ньютонсофт?
спичек может быть очень очень много и вклад суммарно очень весомый.
Это важно на мобилках и в серверных приложениях. Чтобы лишний раз не драконить гербедж коллектор.
Почитал ваш тред, интересно.
Сам вот недавно только осознал, шо свято хочу изучить этот язык. Начал, вроде все прикольно, интересно. Изначально, ещё при выборе языка, даже не думал, о работе в этом направлении, а вот теперь встал вопрос. Есть ли здесь аноны, которые РАБотают именно с этим языком на РАБоте. Пилите стори: какой функционал выполняете? Сколько зарплата? Насколько сложно было найти работу и т.д. да и в принципе, насколько сложна сама работа? Я имею ввиду переработки, сроки, пиздюли от начальства, ну и вот это вот все. Понимаю конечно, что в этом вопросе у каждого субъективная точка зрения, но все же... Просмотрел ютуб на эту тему, но там чёт все как будто через розовые очки, а мне хотелось бы услышать более реальные истории. Я захотел обучаться этому всему не из-за историй 300к/сек. А как просто смена профессии.
Сам работаю с ебучими людьми в продажах и откровенно говоря - заебало. Толпы ублюдков, которые чем-то не довольны. Ух сука, ненавижу клиентов, а недавно меня ещё и на руководящую должность сунули и теперь я ненавижу ещё и сотрудников. Ну и я решил кардинально сменить тип деятельности.
В общем анонасы, рассказывайте.
Если я вдруг не по адресу и у вас тут за подобные вопросы шлют нахуй, ну чё....пойду нахуй отсюдова
>Есть ли здесь аноны, которые РАБотают именно с этим языком на РАБоте
Полтреда работают, еще половина вкатывается. Сам я вкатился уже как 1 год и 15 дней (без 15 минут 16 дней). Но первые 10 месяцев были очень хуёвыми т.к работал на заводе программистом, платили мало и обучался всему сам с помощью гугла и стековерфлоу
>какой функционал выполняете?
Ну сейчас веб-апи пишу для всякого калового говна из жопы, скучно пиздец. Ищу вакансии чтобы обратно перепрыгнуть на десктоп, а то заебал веб.
>Сколько зарплата?
60к
>Насколько сложно было найти работу
Буквально за 2 недели нашел после выпуска из ПТУ и психиатрической больницы чтобы не идти в армию.
>Сложна сама работа
Всё подозрительно легко. Ну это потому что веб-апи писать просто там особых скиллов не надо. Переработки иногда бывают, но в основном по моей собственной инициативе если что-то интересное появляется. Кабан-кабаныч не давит, не выёбывается, всё тихо и спокойно по человечески.
> Насколько сложно было найти работу
Главное, чтобы у тебя было что показать. Это как минимум пет-проекты. Тогда работу найти не сложно. Конечно, ещё нужно будет знать основы, чтобы пройти собеседование. Но если увидят, что ты знающий чувак, есть опыт разработки, то без проблем возьмут.
>ну в обычном коде - ссзб. а в DSL это просто пушка.
В том то и дело, что в обычном коде этого стало полно, а DSL оказался перехайленным костылем, где как как его писать знает только автор самого DSL. Ну типа там вообще нет никакой возможности задать какие-то условия, типа обязательные поля или нет, ну и сохраняется возможность загадить все простым кодом.
Проще взять какой-то json или toml, так как доку все равно придется писать.
>и поскольку там есть инлайн, ноинлайн, кроссинлайн жуть, то для них есть и возможность указать ретурн с точным указанием из чего ты делаешь ретурн.
Это вообще обязательный костыль, ибо ритёрн выйдет не из последней лямбды, а из всей цепочки и самого метода, лол
Котлин кажется красивым пока не начнешь нюхать все эти костыли. DSL огрызок и попытка от реального DSL, на деле проще взять json чем этой имитацией баловаться. Функции кажутся крутыми на деле приводят к импорту со звездой (один хер в одном файле группированы, можно было и статик методами сделать, да, статик нет, есть отдельный костыль какой-то).
Ну, в общем, кажется все вроде круто, но потом понимаешь что шарп кратно лучше продумал и продизайнен, а все это жабо наследие на котором придется писать, это отдельная тема для трэш треда (даже сколько радости приносит тот же грэдл)
не туда запостил, лол
>а DSL оказался перехайленным костылем, где как как его писать знает только автор самого DSL.
А для использования любой сторонней библиотеки на любом языке тоже без доки никуда. Так устроен мир и без DSL.
DSL лишь позволяет удобнее выражаться. Тот же LINQ - тоже DSL на уровне языка, но ты же не назовешь его хайпом )
>ну и сохраняется возможность загадить все простым кодом.
ну на то он и DSL чтобы быть именно кодом. Просто с более простым выражением
>>451553
>Это вообще обязательный костыль, ибо ритёрн выйдет не из последней лямбды, а из всей цепочки и самого метода, лол
дается возможность - дается и инструментарий. У всего есть достоинства и недостатки. Получаем настоящую инлайновость и плюшки от этого - взамен получаем необходимость строже выражать свои мысли. Всего то достаточно просто указывать и проблем не будет.
>Функции кажутся крутыми на деле приводят к импорту со звездой
вообще хз о чем ты. Причем тут функции до звезды?
да и вообще проблема где? в шарпе ты делаешь импорт неймспейса который аналогичен звезде.
Поначалу меня бесило когда копируешь код с SO, а там импорты не указаны и он найти не может и ты не можешь понять что ему нужно. Но... в asp.net с его service.Add та же самая херня. Да и не только с ним - мелкие пошли по пути "делаем через расширения" и без гугления не разберешься какую либу подключать и неймспейс чтобы код перестал быть красным. Хорошо, когда знаешь какую. Ну так и в котлине тоже та же ситуация.
> что шарп кратно лучше продумал и продизайнен
ну это уже вообще смешно. шарп родился как жава, а потом стал обрастать уже к этой основе как придется. продуман ха
- нулабилити не было изначально.
- $""
- [^1]
- IReadOnly*
- нельзя сделать расширение для статических классов
- ConfigureAwait(true)
- event. идея понятна, реализация понятна, но разве она удачна
- инлайновость (да нет ее и вот с логированием выше разговор был)
- свойства. не хочешь автосвойство - будь добр пиши полную портянку.
- нет val, только var
...
У шарпа свою плюшки, но продуманность синтаксиса и базовых фич к ним не относится.
>а все это жабо наследие на котором придется писать
не технически для меня, НЕ УЧИВШЕГО жаву, все наследие упирается в
- да гребаные дженерики. на деле я просто не сидел и не разбирался.
- нет структур, а я как то привыкши думать об экономии памяти.
и нулевое вникание в "как там у жавы"
>а DSL оказался перехайленным костылем, где как как его писать знает только автор самого DSL.
А для использования любой сторонней библиотеки на любом языке тоже без доки никуда. Так устроен мир и без DSL.
DSL лишь позволяет удобнее выражаться. Тот же LINQ - тоже DSL на уровне языка, но ты же не назовешь его хайпом )
>ну и сохраняется возможность загадить все простым кодом.
ну на то он и DSL чтобы быть именно кодом. Просто с более простым выражением
>>451553
>Это вообще обязательный костыль, ибо ритёрн выйдет не из последней лямбды, а из всей цепочки и самого метода, лол
дается возможность - дается и инструментарий. У всего есть достоинства и недостатки. Получаем настоящую инлайновость и плюшки от этого - взамен получаем необходимость строже выражать свои мысли. Всего то достаточно просто указывать и проблем не будет.
>Функции кажутся крутыми на деле приводят к импорту со звездой
вообще хз о чем ты. Причем тут функции до звезды?
да и вообще проблема где? в шарпе ты делаешь импорт неймспейса который аналогичен звезде.
Поначалу меня бесило когда копируешь код с SO, а там импорты не указаны и он найти не может и ты не можешь понять что ему нужно. Но... в asp.net с его service.Add та же самая херня. Да и не только с ним - мелкие пошли по пути "делаем через расширения" и без гугления не разберешься какую либу подключать и неймспейс чтобы код перестал быть красным. Хорошо, когда знаешь какую. Ну так и в котлине тоже та же ситуация.
> что шарп кратно лучше продумал и продизайнен
ну это уже вообще смешно. шарп родился как жава, а потом стал обрастать уже к этой основе как придется. продуман ха
- нулабилити не было изначально.
- $""
- [^1]
- IReadOnly*
- нельзя сделать расширение для статических классов
- ConfigureAwait(true)
- event. идея понятна, реализация понятна, но разве она удачна
- инлайновость (да нет ее и вот с логированием выше разговор был)
- свойства. не хочешь автосвойство - будь добр пиши полную портянку.
- нет val, только var
...
У шарпа свою плюшки, но продуманность синтаксиса и базовых фич к ним не относится.
>а все это жабо наследие на котором придется писать
не технически для меня, НЕ УЧИВШЕГО жаву, все наследие упирается в
- да гребаные дженерики. на деле я просто не сидел и не разбирался.
- нет структур, а я как то привыкши думать об экономии памяти.
и нулевое вникание в "как там у жавы"
>шарп кратно лучше продумал и продизайнен,
...
- рекорды с его with когда появились только
- многострочный текст запарился ждать когда завезут
- main без класса Program - крайне сомнительная хрень, постоянно забываю галку ставить в студии
- if и остальные ничего не возвращают.
- нет изначального разделения на мутабельные и риоднли списки, словари и т.д. Никакой строгости - все используют if
- даже контрактное программирование не взлетело лол. Кроме как в фреймворке нигде и не используется.
...
(да ебу... иконки мешающие набирать этот текст. Какой идиот придумал делать их поверх текстовой формы....)
>нулабилити не было изначально.
Нефига ты мечтатель для языка которому 20 лет. Если в котлине покапаться, он там тоже местами через одно место, благо в шарпе это опционально.
>нет val, только var
Тот еще звездец, который котлинисты признают. А вот нужна ли иммутабельность для мультипарадигменного языка (а не лиспа) это долгий спор.
>нельзя сделать расширение для статических классов
Зачем? Расширение то еще зло, которое нужно использовать осторожно.
>статических классов
В котлине вообще какая-то байда.
> свойства. не хочешь автосвойство - будь добр пиши полную портянку
Видно что свойство это отдельный элемент, а в котлине до сих пор не могут в приватные сеттеры, потому что авторы думали что умнее других.
>$""
Вот как раз продуманно, ты задаешь контекст для строки, ты бы видел как раньше в котлине нужно было символ "$" писать и нельзя было по другому, потому что все строки интерпритируются (а я не хочу чтобы все!). В этом и продуманность
Списки и всякие мапы - это такие динамические "резиновые" структуры, если список сделать неизменяемый, это уже будет не список. В общем, вся это дрочь на иммутабельность, она ломает идеи структур данных. Там где тебе нужен массив ты берешь какой-то выдуманный замороженный список.
> if и остальные ничего не возвращают.
И это реально круто, потому что есть тернарный оператор!
>- [^1]
В кокотлине выкинули классический for, чтобы добавить кривые ренджи и писать такой трешь
for (i in 8 downTo 1 step 2)
>Нефига ты мечтатель для языка которому 20 лет
ну так я и НЕ заявляю что он хорошо задизайнен. задизайнен он паршиво как и жава, просто потом засахарился и оброс полезными (и бесполезными) плюшками. Но основа осталась какая осталась
> благо в шарпе это опционально.
ну как и в котлине тоже есть lateinit и !!. разговор о том, что это пришло через многие годы. и такая ситуация именно потому что слизывали жаву. а не продумывали
>Тот еще звездец, который котлинисты признают
это признают все, кто достаточно много кодил и начал понимать ценность строгости контракта. Когда язык защищает от ошибок. А то ведь так можно и константы мутабельными сделать - ну а почему нет
>Зачем? Расширение то еще зло, которое нужно использовать осторожно.
Чтобы не плодить своих классов ClassEx.Mymethod - раз. Ну и еще для одной штуки что используется в композе, но я щас не вспомню. А насчет зла - ну мс идет по пути зла. раз пихает расширение где угодно. Пример хттпклиент и его функции жсон.
>В котлине вообще какая-то байда.
угу. я хейтил пока не разобрался. там синглтон классы object и companion object - буквально "приаттаченый к классу сигнлтон класс без имени". А раз это класс, то и все возможности класса - те же расширения
>Видно что свойство это отдельный элемент
я про backfield, который не зарезервировали и приходится каждый раз прописывать вручную свойство, если оно не авто (что довольно часто)
>а в котлине до сих пор не могут в приватные сеттеры
хз о чем ты. использую их на постоянной основе.
>(а я не хочу чтобы все!)
ну это уже спорно и на уровне фломастеров.
>это уже будет не список
нет. это будет списком. в котором нет "риоднли не значит что он иммутабелен".
>она ломает идеи структур данных
>Там где тебе нужен массив ты берешь
отвратительные идеи. есть четкое логическое разделение на мутабельные, иммутабельные и поверх них риоднли + перечисляемость, то есть строгое определение контракта
А что в шарпе? а в шарпе IList (который не наследник IReadOnlyList лол) и Array... в итоге (у 99% шарпистов) метод принимает Ilist, потому что "так привычно", ты передаешь ему массив и оно валится в рантайме.
Строгость контракта уровня "мы шарп, нам нинужны никакие контракты" (что видно по тому что Contract.Requies() так и не пошел в массы)
>потому что есть тернарный оператор!
вообще не замена. вложенные ифы выглядят как катастрофа.
а обычный иф требует заведение внешних переменных
и возвращаемость настолько "не нужна", что в новом switch именно ее и сделали и все ей пользуются )
>В кокотлине выкинули классический for
ну я выдвигаю претензии к шарпу как шарпист. Я не хвалю котлин (в котором тоже хватает WTF), а жалуюсь на шарп. И стараюсь избегать сравнения фич которых нет в шарпе. И var/val, иммутабельность, выражения я упоминаю не потому что они есть в котлине. Я имел эти претензии еще до изучения котлина.
>Нефига ты мечтатель для языка которому 20 лет
ну так я и НЕ заявляю что он хорошо задизайнен. задизайнен он паршиво как и жава, просто потом засахарился и оброс полезными (и бесполезными) плюшками. Но основа осталась какая осталась
> благо в шарпе это опционально.
ну как и в котлине тоже есть lateinit и !!. разговор о том, что это пришло через многие годы. и такая ситуация именно потому что слизывали жаву. а не продумывали
>Тот еще звездец, который котлинисты признают
это признают все, кто достаточно много кодил и начал понимать ценность строгости контракта. Когда язык защищает от ошибок. А то ведь так можно и константы мутабельными сделать - ну а почему нет
>Зачем? Расширение то еще зло, которое нужно использовать осторожно.
Чтобы не плодить своих классов ClassEx.Mymethod - раз. Ну и еще для одной штуки что используется в композе, но я щас не вспомню. А насчет зла - ну мс идет по пути зла. раз пихает расширение где угодно. Пример хттпклиент и его функции жсон.
>В котлине вообще какая-то байда.
угу. я хейтил пока не разобрался. там синглтон классы object и companion object - буквально "приаттаченый к классу сигнлтон класс без имени". А раз это класс, то и все возможности класса - те же расширения
>Видно что свойство это отдельный элемент
я про backfield, который не зарезервировали и приходится каждый раз прописывать вручную свойство, если оно не авто (что довольно часто)
>а в котлине до сих пор не могут в приватные сеттеры
хз о чем ты. использую их на постоянной основе.
>(а я не хочу чтобы все!)
ну это уже спорно и на уровне фломастеров.
>это уже будет не список
нет. это будет списком. в котором нет "риоднли не значит что он иммутабелен".
>она ломает идеи структур данных
>Там где тебе нужен массив ты берешь
отвратительные идеи. есть четкое логическое разделение на мутабельные, иммутабельные и поверх них риоднли + перечисляемость, то есть строгое определение контракта
А что в шарпе? а в шарпе IList (который не наследник IReadOnlyList лол) и Array... в итоге (у 99% шарпистов) метод принимает Ilist, потому что "так привычно", ты передаешь ему массив и оно валится в рантайме.
Строгость контракта уровня "мы шарп, нам нинужны никакие контракты" (что видно по тому что Contract.Requies() так и не пошел в массы)
>потому что есть тернарный оператор!
вообще не замена. вложенные ифы выглядят как катастрофа.
а обычный иф требует заведение внешних переменных
и возвращаемость настолько "не нужна", что в новом switch именно ее и сделали и все ей пользуются )
>В кокотлине выкинули классический for
ну я выдвигаю претензии к шарпу как шарпист. Я не хвалю котлин (в котором тоже хватает WTF), а жалуюсь на шарп. И стараюсь избегать сравнения фич которых нет в шарпе. И var/val, иммутабельность, выражения я упоминаю не потому что они есть в котлине. Я имел эти претензии еще до изучения котлина.
Нет, ебеня на 2 млн человек.
я поясню шире
Я не говорю про иммутабельные типы что там в System.Collections.Immutable - это вообще отдельные структуры для многопотока.
Я говорю про строгость, что я могу указать принятие неизменяемого списка и быть в этом уверенным. IReadOnlyList такой гарантии не дает. Принимать массив? У кодера по всему коду списки ходят и материализовывать в массивы только чтобы угодить очередному методу- лютая дичь. В итоге и родился подход создания защитной коллекции в самом методе/конструкторе потому что нет на уровне языка средств гарантий.
И когда добавили IReadOnlyList , то пользоваться им все равно неудобно (от него не наследуется IList), что все так и продолжили использовать IList
В шарпе много хороших вещей, но тут создатели знатно обосрались.
> от него не наследуется IList), что все так и продолжили использовать IList
Я уверен, что они оба реализуют IEnumerable<> вот прям настолько уверен, что даже гуглить не полезу. а раз реализуют, то вот бери и объявляй IEnumerable<YoItemType> YoVar = BazTask.GetList();
Что может пойти не так?
Не всегда удобно, чтобы метод принимал именно IEnumerable, так как а) Вместо коллекции могут подсунуть бесконечный генератор б) Твоему алгоритму нужно выполнить двойной обход коллекции. С произвольным IEnumerable можно таки поломаться.
Кривой дизайн
-Везде автовывод, без IDE нечитаемо.
-Кривая асинхронщина, читаемая только с IDE
-Иммутабельность только для ссылки, когда у тебя все мутабельно, для додиков сойдет, ФП-господа ржут с этого.
-lateinit говнофикс с магией, потому что иммутабельный дрочь не до конца заходит в императивную разработку.
-val, жесть.
-магия с автокастом, в божественно шарпе надо явно указать новую переменную, никакой магие, все явно.
-отключение нуллабельности, не всем этот развод "на миллион долларов" заходит, когда у тебя вся типизация умножается на два.
-!! говнофикс, что так ты упадешь с НПЕ что так.
-Мешать процедурный стиль с ООП это плохо, еще в 90х к этому пришли и именно жаба себя ставила противовес С++, указывая на то что нет функций.
-100500 зарезервированных слов, там звездец.
Выкинул на помойку, когда у меня сломался код (год спустя), когда компилятор вместо метода стал дергать базовую функцию расширения (то ли let, то ли run... хз туча их там) и ругать меня за то, что сигнатура не совпала, лол.
Там еще тонна говна, которого я не помню, просто надергали говная с груви, скалы и шарпа и ботинком прибили - и так сойдет.
Ну вообще ide не обязательно, чтобы увидеть, что метод обозначен как suspend, так что это придирки на пустом месте. Вообще на котлине вне idea вряд ли кто-то будет писать, раз уж это целиком и полностью продукт jb, как собственно и на сишарпе писали только в студии пока райдер не вышел.
как и все остальное - не дает гарантию неизменяемости.
>>451636
мы вроде в шарпотреде и должны обсуждать недостатки шарпа, а не котлина. И уж тем более не натягивать сову на глобус
>-Везде автовывод, без IDE нечитаемо.
в шарпе идентично. var, вывод типов, без IDE не понять откуда взялся класс ибо неймспейсы это как import *
>Кривая асинхронщина, читаемая только с IDE
да нормально читается. я в основном читаю код на планшете без всяких IDE. хз причем тут вообще IDE для читабельности
>Иммутабельность только для ссылки, когда у тебя все мутабельно
какие то фантазии. риоднли список он реально ридонли. он заморожен и гарантируется что не будет изменен. И это не на уровне ICollection<T>.IsReadOnly, а я могу описать сигнатуру
>-lateinit говнофикс с магией
null! говнофикс )) в чем разница? ты определенно не понимаешь разницы между иммутабельными типами для многопотока (которые на самом деле мутабельные) и frozen-коллекциями которые в обычном однопоточном коде (я все время говорю о вторых)
>-val, жесть.
я так понимаю конкретных аргументов против не будет. Любой аргумент против val - все равно что аргумент против использования констант как oneinit вещей.
>-магия с автокастом
сложно оценить проблемность. мне это тоже не нравится, но проблем не испытывал
>!! говнофикс
null! никакой разницы. если ты используешь его как "отвали с варнингами" то ссзб и в шарпе упадешь с NRE аналогично. А так это просто фикс когда тебе виднее, а анализатору нет.
>Мешать процедурный стиль с ООП это плохо
это нужно DSL. даже MAUI если не будут тупить будет использвоать static using чтобы было похоже на процедурный стиль и избавиться от многочисленных new
>>451649
>Нужна IDE чтобы увидеть что метод асинхронный
зачем это видеть? что это дает?
напомню - я наезжаю на шарп в шарпотреде (на тот самый шарп на котором я пишу с его рождения, а на котлине всего чуть), и нападать на котлин в шарпотреде....
как и все остальное - не дает гарантию неизменяемости.
>>451636
мы вроде в шарпотреде и должны обсуждать недостатки шарпа, а не котлина. И уж тем более не натягивать сову на глобус
>-Везде автовывод, без IDE нечитаемо.
в шарпе идентично. var, вывод типов, без IDE не понять откуда взялся класс ибо неймспейсы это как import *
>Кривая асинхронщина, читаемая только с IDE
да нормально читается. я в основном читаю код на планшете без всяких IDE. хз причем тут вообще IDE для читабельности
>Иммутабельность только для ссылки, когда у тебя все мутабельно
какие то фантазии. риоднли список он реально ридонли. он заморожен и гарантируется что не будет изменен. И это не на уровне ICollection<T>.IsReadOnly, а я могу описать сигнатуру
>-lateinit говнофикс с магией
null! говнофикс )) в чем разница? ты определенно не понимаешь разницы между иммутабельными типами для многопотока (которые на самом деле мутабельные) и frozen-коллекциями которые в обычном однопоточном коде (я все время говорю о вторых)
>-val, жесть.
я так понимаю конкретных аргументов против не будет. Любой аргумент против val - все равно что аргумент против использования констант как oneinit вещей.
>-магия с автокастом
сложно оценить проблемность. мне это тоже не нравится, но проблем не испытывал
>!! говнофикс
null! никакой разницы. если ты используешь его как "отвали с варнингами" то ссзб и в шарпе упадешь с NRE аналогично. А так это просто фикс когда тебе виднее, а анализатору нет.
>Мешать процедурный стиль с ООП это плохо
это нужно DSL. даже MAUI если не будут тупить будет использвоать static using чтобы было похоже на процедурный стиль и избавиться от многочисленных new
>>451649
>Нужна IDE чтобы увидеть что метод асинхронный
зачем это видеть? что это дает?
напомню - я наезжаю на шарп в шарпотреде (на тот самый шарп на котором я пишу с его рождения, а на котлине всего чуть), и нападать на котлин в шарпотреде....
Ты немного не в теме обсуждения.
Мы тут выражаем недовольство, что ICollection<T> не реализует IReadOnlyCollection<T> в силу исторических причин. Это бывает временами очень не удобно, и припятсвует распространению этого интерфейса. А он как раз очень удобен для использования в конкрактах методов, так как даёт всем понять, что коллекция меняться не будет.
Анон предложил использовать в таких местах IEnumerable, но у него есть подводные камни, о которых я и написал.
Как по мне, выходом, пусть и корявым, могло бы стать добавление в ICollection<T> метода IReadOnlyCollection<T> AsReadOnly(). В нем можно было бы возвращать саму коллекцию, если она поддерживает IReadOnlyCollection, либо объект-обертку. Но на это тоже скорее всего не пойдут, так как даже добавление новых методов в столь древний и широко используемых интерфейс дело очень болезненное.
Так что остаётся только городить свои методы расширения.
>в шарпе идентично
Ты пиздабол, в шарпе ограниченно только локальной областью. Дальше можно не читать
кто ограничен?
поясняй разницу. иначе получается ты пиздобол
впрочем после претензий к val я этого и не ожидаю что ты пояснишь нормально
> мы вроде в шарпотреде и должны обсуждать недостатки шарпа, а не котлина
Ты попался на дерейл олух! олух! Ты попался на дерейл, глупый дурачок!
Рекомендую игнорировать котлиномразь, закатившуюся в тред, а если не прекратит, начнём репортить.
ясно. значит закрыли вопрос.
вместо вменяемых аргументов в защиту шарпа ты стал нападать на другие языки, хотя котлин был просто для примера "что такое, когда язык продумывали все таки, а не "так исторически сложилось"" и почему это может быть удобно"
Но ты не понимаешь даже недостатка Ilist, а претензия к val вообще занавес
так что проходим мимо.
Ты используешь самые примитивные подходы в демагогии, поэтому хватит косить под несведущего дурочка, мы не в джава треде, тут так просто не разведешь никого.
Шарп это язык общего назначения, котлин прокси-язык жабы, который кроме мобильной разработки практически нигде не прижился.
Жаба протухла, не носи её сюда.
>Шарп это язык общего назначения
И?????
это как то оправдывает кривые решения в нем?
кривые решения бывают везде. это нормально. просто нужно трезво смотреть на вещи, а не защищать с пеной у рта, и уж тем более не объявлять что именно так и правильно аргументами уровня "а мне норм".
> котлин прокси-язык жабы, который кроме мобильной разработки практически нигде не прижился.
не знаю почему ТЫ так вцепился в котлин ведь претензии к шарпу от шарписта (я шарпист - это мой основной язык, а котлин чисто замена хамарина на мобилках для меня), но аргументы уровня "ваш язык говно потому что говно". Котлин молодой язык, а жависты - дикие консерваторы мазохисты, ведь столько лет пишут на убогом языке и их не парит. Вооо. на тебя похожи ))). Любой недостаток разбивается об "а мне норм"
Напомню - шарп до некоторого времени тоже мало где приживался ибо был виндоонли язык, а всякие моно это был страх и ужас. Только после выхода кор, и то не сразу, началось расширение шарпа в использовании
>Жаба протухла, не носи её сюда.
к жабе у меня такие же претензии как и к шарпу (у них же одинаковый изначальный дизайн).
ты сам ее принес
на мой список претензий к дизайну шарпа ты списком претензий к котлину (причем высосанными из пальца). Про котлин от тебя я уже наслышался и про жаву тоже. По шарпу есть че сказать то? ну кроме "мне норм, а значит так правильно"
Жаба протухла, не носи её сюда.
Но ничего, сейчас школа началась, сегодня только линейка, а завтра уже уроки, так что уровень неадеквата снизится.
В сишарп треде восхищаются сишарпом. Никогда такого не было.
>Но ничего, сейчас школа началась, сегодня только линейка, а завтра уже уроки, так что уровень неадеквата снизится.
Мы будем по тебе скучать.
И правда, что один символ юникода может занимать 2 байта, а другой четыре?
Т.е. если мы возьмем кодировку ютф-8, то нельзя сказать, что все символы там имеют одинаковый размер?
Да.
Пробел, цифры и латинские буквы = 1 байт
Русские буквы = 2 байта
Китайские, Японские, корейские = 4 байта
Эмодзи вроде вообще 5 байт, но я могу ошибаться
должен.
ICollection расширяет IReadOnlyCollection
и должен без проблем передаваться как есть в методы принимающие IReadOnly
Ну а если пойдут аргументы про ISP, но если напирать на этот аргумент то ICollection также не должен наследовать IEnumerable
Ситуация с IReadOnly* это следствие проблемы бинарной совместимости (о чем явно писали), а не потому что "не должен"
ну размер без кодирования ты не узнаешь
можешь только максимальный размер узнать чтобы знать какой буфер выделять.
в первом возвращают жсоны
во втором сгенеренный хтмл.
вот и вся разница
во времена "все фронтенд" генерить хтмл на бэкенде приходится редко
- как запланировать событие которое должно произойти через 6 часов
- Thread.Sleep(...)
- ПРИЕМЛЕМО
>обоснуй предъяву.
в твоем решении выделяется буфер в памяти
работает - да
эффективно - нет
>Напиши своё
ну вот https://docs.microsoft.com/en-us/dotnet/api/system.text.unicodeencoding.getbytecount
> работает - да
чувак, Thread.Sleep не просто не эффективно, но ещё и НЕ работает. Как ты, например, будешь Ctrl+C (то есть токены отмены) обрабатывать?
У кого сейчас больше будущего? У котлина или шарпа и главное почему (ваше мнение)?
.NET офк, вот почему:
1. Котлин живет потому что живет Джава
2. Джава живет потому что много легаси
3. Легаси переписывается на упругий Go и .NET
4. Меньше легаси - меньше джавы - меньше котлина
Но, у котлина есть своя ниша, которую .NET пока что не занять - это мобилки под андроид. Но тут майки просто долбоёбы не хотят нормально линукс поддерживать.
Это две абсолютно разные ниши. Котлин подмёл под себя андроиды. А Шарп — многоцелевой. И его Замарин — непопулярен
хотя вижу родной метод GetByteCount такой же бестолковый. Я не знаю что он делает в наследниках, но в базовом классе превращает текст в массив чаров зачем то (и это из Span<>)
>>451827
у обоих. языки не связаны.
шарписту незачем переходить на котлин. шарп - один из лучших современных языков
котлин будет занимать нишу
гугель никого не заставлял писать на котлине. просто объявил его еще одним офф языком разработки - и как результат люди сделали свой выбор.
но жава будет сверхдолго сопротивляться в силу инерционности жавистов и оверхеда котлина при компиляции
>>451829
надо, но проблемы нет. Как вот в видео про обнволятор killall /f остановит все.
Не анон. Я как раз не знаю длину строки.
Изначально я хотел передавать в пакете байтов инфу о размере одного символа и количестве символов в строке, но анон >>451801 написал, что размер символа вариативный.
Так что да, буду предавать данные об общем размере в байтах.
Просто почему я по первому пути пошел, потому что у меня еще передается и массив интеджеров, к примеру.
То есть и там и там внутреннее устройство именно бэка будет одинаковое? Как подключается база, как идет работа с зависимостями, репозитори паттерн и вот это вот все.
>Но тут майки просто долбоёбы
Знаешь, это причина большинства провалов. Како смысл перспективности идеи, если ее реализует долбоеб?
ну да. просто генерация вида уносится на фронт (если она конечно есть эта генерация вида. а не просто данные ради данных)
ну и подход к авторизации будет немного другой, а в остальном идентично.
> надо, но проблемы нет
Вообще есть. Graceful stop это обязательное условие для части сервисов.
> Как вот в видео про обнволятор killall /f
А, ну ясно, понятно
>Graceful stop это обязательное условие для части сервисов.
такое требование только к сервисам написаное прямыми руками. К тем, кто юзает sleep вместо таймера, это не относится.
>>451849
разницы нет. мне, условному жависту, придется его выучить и только потому что кто-то объявил его предпочтительным? это так себе аргумент.
правда, ЭТО АНДРОИД. а там жава немного совсем не та жава, что полная и выбор сделать проще.
>Легаси переписывается на упругий Go и .NET
Жаба легаси (хотя что считать легаси) в основном и дальше продолжает жить на жабе, иногда перекатываясь на 11 или даже на 17 версии, иногда впиливая котлин в проекты, просто потому что проще и дешевле оставить все как есть, чем вкладываться в переписывание с нуля на го, так как под это дело нужно целую команду собирать. На дотнет ничего не переписывается, так как реальный перформанс по итогу будет почти что одинаковым, увы, так что жаба будет жить дальше десятилетиями.
>>451831
>которую .NET пока что не занять
Андроид на дотнете никто никогда писать не будет, для этого нужно будет обеспечить полную совместимость с либами жабы и котлина, иначе он попросту никому не нужен будет, что мы сейчас и видим.
Котлин такой же язык общего назначения, как и шарп, можно и мобилки, и бек писать, и даже фронт с нативщиной.
Вобщем планирую делать примитивную crm по гайдам с ютуба, подводные? Хватит на джуна?
У котлина нет своей JVM, котлин топит джаву и сам вместе с ней идет на дно. Сами джависты не хотят за одну зарплату писать на двух языках, а мобильники слишком узкая ниша.
JVM все, надо было развиваться.
На котлин-нейтив
> Сделать url encode
Это что получается, надо в каждом методе будет вызывать Uri.UnescapeDataString?
Выглядит как костыль...
> 3. C# для десктопа
> — WPF ( https://docs.microsoft.com/ru-ru/dotnet/desktop/wpf )
> — WinForms ( https://docs.microsoft.com/ru-ru/dotnet/desktop )
А че кроме этого есть еще что-нибудь?
Еще же было что-то для вин10, не очень популярное
Может еще какой способ интересный есть чтоб графическое приложение напиать
мимо-вкатываюсь-обратно-после-армейки/нихуянепомню
А точно, а кроссплатформу никак не сделать на этом?
Есть мертворожденный uwp и совсем новый maui, но они в целом построены на тех же принципах, что и wpf. Знаешь последний, считай что знаешь и остальные два. И по wpf лучше всего будет навернуть уроки шмачилина на ютьюбе. Затем отполировать троелсеном, у него рассматриваются некоторые продвинутые вещи. Для джуна этого хватит.
Есть условный лист айтемов с повторяющимися id, я хочу выбрать айтемы:
Item.Id = 1 <-
Item.Id = 2
Item.Id = 3
Item.Id = 2 <-
Item.Id = 3
Item.Id = 3 <-
Через оконные функции.
>uwp
Точно.
> maui
На MAUI реально можно написать норм приложение разом для всех мобилок?
> по wpf лучше всего будет навернуть уроки шмачилина на ютьюбе. Затем отполировать троелсеном, у него рассматриваются некоторые продвинутые вещи
А за это двачая
>котлин топит джаву и сам вместе с ней идет на дно
>джависты не хотят за одну зарплату писать на двух языках
>мобильники слишком узкая ниша
>JVM все
Спасибо, посмеялся. Пиши чаще, techempower-шиз.
> На MAUI реально можно написать норм приложение разом для всех мобилок?
Без знания жавы нет.
Не знаю, сохраняет ли порядок группировка, но попробуй сделать GroupBy по айди, а затем из группы брать Last.
>на Xamarin'е норм писать под ведроид
В теории писать-то можно, но на пратике андроид разработка это котлин/жаба/реактив натив
нуу
1 долгий запуск. На современных девайсах не так заметно, но вот мой старенький планшет с MediaTek MT8732 8+ секунд для хелло ворлд. На моем старом смарте - 15 секунд было.
2 ограниченность функционала вида "да блин как тут сделать"
на старте решил взять хамарин, там все похоже на WPF ну разве что глюки (ну а где их нет). слепил и нужен был мне вроде был все виды клика в гриде. И бац - не работает лонгклик. Вот прост работает, а конкретно там внутри грида, внутри чего то да в комбинации с другими кликами не хотело. Гуглю - а там пишут "не реализовано, но вы можете сделать поддержку сами". Давно было дело, но как то мне это сразу не понравилось и как раз появился первый альфа compose, где все было чудесно (если конечно не считать необходимости изучения котлина). Не текущий момент я в восторге (но да, заплатил за это изучением котлина, что совсем не мелочь. Язык имеет огромную выразительную мощь - но это же является и недостатком. И очень весомым. Я бы не рекомендовал так грузить голову)
3 больше жрет памяти и больше весит.
хотя на это всем плевать как бы. Просто я имел возможность сравнить абсолютно идентичное мое приложение которое я портировал. В нативе на стареньком MT8732 работает пошустрее визуально, то есть весьма приемлемо.
в общем то вряд ли это проблема на текущий момент.
Кстати, где Фуксия? Я уже год не слышу этого названия. А про неё говорили уже много лет назад
Фкусия, котлин, дарт - всё это говно забудут через год после релиза.
> мобильники слишком узкая ниша
Бро, тебе что-нибудь говорит статистика прибыли из онлайн игр по отношению к другим?
Зумерье не в состояние отличить что такое ниша разработки и продукт. Если Гейтс самый богатый человек, который заработал на винде, которая на сях, значит си самый популярный язык? Так в ваших поридж мозгах работает?
Имелось ввиду мобильная разработка под нишевое железо (ARM) и нишевую операционку (андроид), под нишевую виртуалку (Dalvik)
ну если не брать старое в виде жавы, фрагментов, хмл разметки, руннеры, асинтаски и прочую херь, а взять все последнее, то писать не просто неплохо, а даже приятно
не после, а перед. читай внимательнее.
C2.4. Найти:
а) сумму кубов всех целых чисел от 20 до 40;
б) сумму квадратов всех целых чисел от a до 50 (значение a вводится с клавиатуры; 0<a<=50);
в) сумму квадратов всех целых чисел от 1 до n (значение n вводится с клавиатуры; 1<=n<=100);
г) сумму квадратов всех целых чисел от a до b (значения a и b вводятся с клавиатуры; b>a).
при изучении яп?
Имхо бесполезны
Конкретно те что ты написал - ты должен изи делать по хорошему.
> (и более сложные подобные)
Нужны примеры.
Вообще, ты НЕ обязан знать математику, если ты про это, т.е. вот те задачки что ты скинул - это чисто проверка того, что ты умеешь писать простые циклы, а не знания математических определений. Что такое сумма кубов ещё любой дурак знает, но если будут какие-то более ебанутые задачи где ты чисто математические термины не понимаешь - то скорее всего автор задач даун
>сумму кубов всех целых чисел от 20 до 40;
int i;
int sum = 0;
for(i=20; i<=40; i++)
{
sum += i × i × i;
}
Ньюфаг не палится.
>Enumerable.Range(20,40).Sum(num => numnumnum).
Какая-то нечитабельная хуйня, которая неизвестно во что скомпилируется. Нахуй с пляжа.
Вкатун, спок
https://c-sharp.pro/задачник/
вот примеры
я понимаю как работают циклы в целом, просто интересно нужно ли подобное прям до самой тяжелой задачки задрачивать
Очевидно, если уверен, что можешь решить задачу - просто переходишь к следующей, пока не найдётся такая, которую ты пока решать не умеешь.
Посмотрел, все решать смысла вообще нет. Может 1-2 задачи в каждой теме решить и все, там где тяжело побольше.
Но, повторюсь, если сложности с математикой в какой-то задаче - забей на нее.
Я понимаю синтаксически как её использовать, знаю, что там компилятор делает класс стейт машины которая сохраняет все нужные данные.
Но я не очень понимаю контекст сихронизации - я же правильно понимаю, что в фреймворках которые её поддерживают в какой-то(в какой?) момент в основном потоке срабатывает какая-то функция и в ней выполняются все куски между авейтами?
И мне нужно больше практических примеров использования, типа лучшие практики там хз, вот такое где посмотреть?
Приведу аналогию
Допустим ты пишешь на тасках в стиле Task.Run()
И ты пишешь продолжения вида task.ContinueWith(). Где будут выполняться эти ContinueWith? А за это отвечает TaskScheduler, который можно передать свой или же будет использоваться дефолтный (который пихает в тредпул эти продолжения)
await та же фигня только сбоку
await разбивает код на цепочку "продолжений". И вот за то, где выполнять эти продолжения и отвечает SyncronizationContext. Семантически он ведет себя как TaskScheduler для тасков.
await-ер захватывать текущий SyncronizationContext (если он есть конечно) и если сказано его учитывать ConfigureAwait(true), то все выполнение делегируется ему, иначе тредпулу.
Это самый обычный "выполнятор" как и TaskScheduler, которому можно передать делегат продолжения, чтобы он его выполнил как хотел.
GUI создает свой SyncronizationContext и устанавливает через SynchronizationContext.SetSynchronizationContext, а дальше уже механизм await сам будет его захватывать и работать с ним.
Ты можешь и сам создать свой контекст - сделать наследника SyncronizationContext в котором создать поток, впилить туда BlockingCollection и все поступающие делегаты туда запихивать, а твой поток будет перемалывать их все в 1 потоке. Собственно вот ты и сделаешь так свой простой UI контекст.
понял, спасибо большое, анонче
Лол
Работаем, стрижем сотыги, заходим сюда исключительно для развлечения, пока идёт сборка или юниттесты или когда хочется отдохнуть от таски
Я просто под гнетом обстоятельств решил сферу деятельности поменять, ну и спустя месяц мытарств пришел к выводу, что наиболее реальный вариант сейчас это 1с. Но мне до ужаса не хочется туда лезть, ибо бухгалтерия и все в этом роде явно не мое. Поэтому сейчас в раздумьях. Для каких целей предпочтительней изучать сишарп? Что можно для начала выбрать? Чтобы без особых требований к опыту и скилам, дабы хоть какой-то релевантный опыт наработать в процессе обучения и как можно быстрее начать полученные навыки использовать. Ну типа техподдержки или чего-то подобного.
на данный момент я между джавой и сишарп выбираю, поэтому очень хотелось бы ваше мнение и на этот счёт услышать
Спасибо.
другой анон, но в тему поста. Вот, например, написал метод, где заменил все синхронные вызовы на асинхронные, всё я правильно делаю, просто приписывая await к асинхронным методам или чето не так?
в этом и есть смысл async/await
чтобы код выглядел линейно как и синхронный, так что все верно
Кстати этот самый SyncronizationContext и его связь с ExecutionContext - еще один косяк в дизайне языка.
И кто из джунов(или выше) об этом знает а?
Лечение - не использовать контекст как это сделали в асп.нет коре (вера в то, что не будет контекста так наивна - хотя для круд сайтиков это можно принять) или использовать везде ConfigureAwait(false), который по умолчанию true (это еще одна глупость в угоду пориджам формшлепам) - и мелкомягкие никак не хотят с этим бороться
ну что блин им стоило сделать
await
await!
или ладно к текущему сделать
await@
await?
и было бы лепо, а не уродское ConfigureAwait, которое нужно везде тыкать.
Кто там говорил про продуманный дизайн языка )
Ну, я почти в 30 начал. В 24 - на первую работу после магистратуры устроился.
За 20к работал. Заебись все. Деньги плотют вовремя, пишешь код. Что еще надо?
Говноед.
Чёт не понял, чел.
Как я верну результат круда если например мой вызов бд GetZalupaAsync будет без контекста? Он же просто улетит куда-то выполняться в другом месте, а круд продолжит выполнение в текущем.
Так-то ConfigureAwait(false) для UI нужен чтобы вызовы говна не висели в UI потоке и не тормозили его. В asp.core Ты обязан в текущем потоке работать, который тебе выдали на запрос, и если хочешь че-то запустить через FireAndForget использовать бэкграунд треды, иначе наплодишь говна.
В чем я не прав?
>Он же просто улетит куда-то выполняться в другом месте
Не понял о чем ты.
>В asp.core Ты обязан в текущем потоке работат
никому никто ничего не обязан. асп.кор всего лишь не определяет свой SyncronizationContext, что дает твбе возможность не писать ConfigureAwait(false), но никаких больше требований или правил. Если у тебя долгоиграющий сервис что-то делает на CPU, то выделить ему свой поток, (а то и несколько) вне пула - нормальное решение.
>Ты обязан в текущем потоке работать, который тебе выдали на запрос
нет такого. "поток/процесс на запрос" это в языках где нет асинков.
Где есть async-и то твой контроллер просто самый обычный асинхронный метод который вызывается на первом попавшемся из пула треде и в процессе выполнения метода контроллер может несколько раз поток сменить
Есть тредпул с потоками, есть async/await-ы которые дербанят твои асинхронные методы на куски. Далее планировщик запихивает нужный кусок в тредпул для выполнения. И так по кругу. Так все и работает если ничего не трогать.
Ну в GUI имеем еще сверху 1 выделенный поток для UI
Поток ставится на паузу и его выполнение уходит в очередь, а ядро в это время начинает исполнять другой поток из очереди.
МИМО JAVA БОГ ГОСПОДИН ХОЗЯИН
>Ведь с await основной поток приостанавливается
нет. с async/await потоки не приостанавливаются. в этом и есть смысл асинхронности.
await освобождает поток и ждет результата асинхронной операции.
А подскажите плиз какой пет проект сделать чтоб джуном взяли. Думаю сделать простую crm какую-то. Хочу болото 1с покинуть
Вкатуны испоганили слово пет проект, если изначально это был проект, которым ты занимаешься в свободное от работы время в свое удовольствие, теперь пет проект -- это бесполезный высер, которым ты пытаешься впечатлить Кабана, чтобы он взял тебя грести на галеру.
>теперь пет проект -- это бесполезный высер, которым ты пытаешься впечатлить Кабана, чтобы он взял тебя грести на галеру
А что в этом собственно плохого? На пет проекте ты освоишь основы работы с фрейморком, гитом, CI/CD мб. Полезная вещь на самом деле.
Разрешаю
Ну так я и планирую заниматься в свободное от работы время в свое удовольствие. Я всмысле чтоб опыт коммерческой разработки появился плюс минус
ничего плохого. учиться все равно нужно (а это нужно делать на реальном коде) и лучше показать что-то, чем ничего
все эти задачки "сумма квадратов" хрень.
Реальный проект пусть даже он детский, пусть даже "паттерны ради паттернов" (вообще рекомендую это на старте) правильно форматирует мозг видеть суть.
на самом деле это очень простая концепция, просто твой мозг не привык думать в этом стиле.
но стоит понять парадигму, то сразу сможешь так писать в любом другом языке
async - метка компилятору что в методе будут await и нужно его преобразовать в стейтмашину.
await - "мы тут ждем ответа от асинхронной операции, поток нам не нужен, но когда ответ будет, тогда попросим выполнить продолжение (код после await)" и он будет выполнен либо в контексте синхронизации (который по факту тупо выполнятор-планировщик) или в тредпуле.
В конце ожидания продолжение (код после await) будет запланировано (станет в очередь) на выполнение. Если есть свободный поток, то оно и будет сразу выполнено, иначе будет ждать пока не освободится поток.
Получив поток продолжение будет выполняться в нем, пока не встретится следующий await и поток будет освобожден и будет ожидание, потом результат ожидания и снова постановка очередного продложения на выполнение. И так пока цепочка не закончится
Цепочка await выполняется последовательно друг за другом и если у тебя тупо однозадачная херня, то разницы особой с синхронным кодом нет, разве что в моменты ожидания I/O твой поток не заблокирован, а просто ждет когда его снова позовут.
Но другое дело если параллельно выполняется много чего.
Если у тебя потоки, то 10000 параллельных запросов потребуют создать 10000 тредов, каждому из которых нужно выделить стек, потратить время на создание, да и еще и между ними переключаться "чтобы каждый поработал". При этом будет много лишних переключений контекста когда поток просто ждет ответа I/O и собственно ему делать нечего.
А вот с асинками у тебя пул потоков. И в каждом из 10000 запросов есит цепрчка await-ов, где каждый await, когда до него дойдет выполнение, возвращает поток в пул давая возможность поработать другим. Потом await получает результат и ставит продолжение в очередь на выполнение.
Если у тебя много I/O, где происходит тупо ожидание, то эти 20 потоков легко перемолотят твои 10к запросов.
Они являются наследниками PipeStream.
Так вот, в моем базовом классе используется PipeStream.
Затем я наследуюсь и делаю новый класс, где при помощи оверрайда пытаюсь PipeStream привести к типу NamedPipeServerStream. Но мне дают пизды.
"NamedPipeServerStream" не может переопределить "PipeStream", так как их возвращаемые типы различны.
Шарп лучший язык в мире.
А чё там с вакансиями по другим языкам? Ну и да, ты по з/п фильтровал?
По яве в Москве больше в два раза, а касаемо зарплаты я даже не решаюсь судить, цифры разнятся, как и требования к кандидату. Пока расчет только на начало карьеры. Кстати первую работу тяжело было найти?
> Кстати первую работу тяжело было найти?
Мне приглашение самому пришло. Я одной компании бесплатно помог данные восстановить, мой друг там был вторым человеком. И на следующий день от него "Ты работу случайно не ищешь?"
У меня в шараге на нём пишут
> В нем можно было бы возвращать саму коллекцию, если она поддерживает IReadOnlyCollection
Любая коллекция кастится в рид-онли коллекцию. Хоть список хоть массив. Не забывай, что это просто коллекция, у которой есть геттер, но нет сеттеров на добавление и изменение элеменнта
Что ты хотел этим сообщить?
Может я спутал апкаст с даункастом.
Но то, что ты предложил, приведет "mamku ebal" в типу свойства base. А мне нужно наоборот: был родительский, а стал дочерний.
Да? Тогда звиняйте и благодарствую.
>что это просто коллекция, у которой есть геттер, но нет сеттеров на добавление и изменение элеменнта
он как раз не забывает. собственно об этом и толкуем, что IList должен быть наследником IReadOnlyList
>Любая коллекция кастится
кастится. но явным кастом.
Вот я беру память из меморипулла. Парсю сообщение. Создаю объект сообщения. Дальше пускаю его по всяеким своим фильтрам, оно доходит до роутера, роутится к обработчику, обрабатывается, шлю ответ. Все, оно умирает. GC - берешь и жрет его.
Так вот. Если мой сервер работает в десктопном режиме, то он, блядь, постоянно стопит все, чтобы эти сообщения пожрать. С вообщении содержится только тип сообщения, какие-то данные о валидности, ну и может наличиствовать тело, если тип сообщения его содержит.
Я вот начинаю подумывать, что делать абстракцию над сообщением - было плохой затеей. Но чет как иначе сделать - не представляю.
Так вот. Как мне снизить нагрузку, чтобы GC не бесновался и постоянно не дергался? Просто в проффилировщике оно примерно так выглядит и меня это напрягает. Память правда так не утекает, держится на кровне 200МБ, но постоянно долбится GC.
А ты попробуй передай IList
Если у тебя дохуя строк, и дохуя с ними работы, то тут может быть проблема. Любая манипуляция со строками создает новые экземпляры строк, которые GC нужно чистить вилкой.
https://youtu.be/95AlosM6Ka0?t=280
Для этого юзают стрингбилдеры. Но я могу только догадываться что у тебя за пробелма.
Та не.
У меня примено прикриплейд.
Вот то что там что-то делает с сообщением - это статические методы, которые по логике приложения доставляют до нужного обработчика, на уровне обработчика.
Хотя я пока накидывал пример - понял, что а нахуя мне вообще эти вот "сообщения"? Типа почему все не хранить в контексте? Он-то живет пока живо соединение. А эти вот сообщения придумывать было тупой идеей.
Ну серьезно, чел. Я буду тебе сейчас для примера накидывать как у меня в реальности с пайпами вся хуйня, катанием по буфферу туды-сюды и прочей хуйней?
Ну блин.
1. Реальный проект я по понятным причинам показать не могу.
2. Проблема как раз в сообщениях, потому что судя по профилировщику - именно они постоянно удаляются-создаются.
640x360, 0:05
Сервис Authentication:
Нужен класс Account который содержит данные текущего пользователя и класс Account который содержит короткие публичные данные другого пользователя, которые возвращаются по запросу.
Сервис Game:
И аналогично классы Player. Один для текущего пользователя, который содержит полную информацию с инвентарем, кол-вом валюты и второй класс, который содержит короткую инфу о другом игроке, типа nickname и portrait.
Может так:
UserAccount | AccountInfo
UserPlayer | PlayerInfo
конечно они создаются. но это сколько нужно запросов чтобы они были проблемой. Как я понимаю по 1му объекту message на запрос...так это обычное дело.
для начала коментируется await Application.Handle чтобы понять что проблема именно тут, а не там.
А еще создается и контекст (хз че это) на каждый запрос. Хз насколько он тяжелый и кто его знает как работает его Parse
ну так убери юзать имлиситюсингс из *.csproj
https://pastebin.com/tu4Rmh5v
Одновременно на всех системах, а чо?
Нет, я всё таки хочу делать крутые программы для системы. Сейчас мало таким занимаются
Хочешь крутые программы для системы, а будешь легаси для учёта всякой хуйни на древнем проприетарном дотнет фреймворке. Лучше уж веб, чем такая участь.
А что мауи. Это ж бывший замарин
Вот mvu подход отличается
Но всё равно придется знать хамл подход
Не просто бывший замарин. Это замарин, из которого целенаправленно выпилили линукс.
Но книжки по замарину подходят
А mvu....не вижу в нем смысла пока
Сколько не ищу по этой теме - везде выглядит просто как разметка кодом
Ну так если я пройду старую книжку по wpf начну разбираться в нём? Или где-то есть специальные книги по замарину?
Частично начнешь
Разметка ведь только часть всего
Если знаешь впф и прочтешь курс стартандроид по диагонали то сможешь писать на замарине с гуглом
w[i-'0']=0;
'0' это 43 если мне память не изменяет. Ты пишешь в память мусор. Ты хотел w размера 10 сделать, наверное.
Вопросы по Objective C можно тоже здесь задавать, ну а чо, аж целая одна буква в названии языка совпадает!
Это по факту конечно. Ну у нас например фронт очень базовый - разор и пара либ с компонентами для него. Никаких версток и реактов ковырять не надо.
Пилить REST API для фронтендеров, например.
На оппике - Таприс Шугарбелл Тисаки, если кому интересно. Я не знаю нахуй я это гуглил и нахуя тебе (и мне) эта информация, Анон, но вот как-то так.
Анончики, как бросить страдать хуйней и начать работать.
Я сто лет по такой хуйне не байтоёбил, с первого курса таблицу ascii не помню.
dotnet pack собирает под AnyCPU, в доке от Майков нихуя нет
Я нихуя не понимаю, анон. Я уже отупел с эти нюгетом. Чтобы мне надо сделать, чтобы получить .nupkg с двумя dll внутри? Какие-то папки блядь, рантаймы нахуй, ебанутые. Ты вот ссылку скинул, там пишут пок кок, спите в .nuspec. В соседней статье другой индус пишет АЛЕРТ .НЮСПЕК БОЛЬШЕ НИНАДА, пользуйтесь тегами проекта для SDK. Какими нахуй тегами?
Почему я не могу написать dotnet pack p: Platform x64|arm64 и получить что хочу.
Анон помоги, я на работе сначала плакал а потом рыдал смехом когда понял что nupkg это zip архив
какие еще 2 dll
дотнет dll делятся на типы рантайма - ,net/core/mono и так далее. То есть одна длл будет работать и на винде х64 и на макоси арм м2
а разделение на платформы уже там папка runtimes с нативными либами
Можно ли считаться джуном после обучения по данному курсу? Если нет, то что еще следует выучить?
https://www.youtube.com/playlist?list=PLQOaTSbfxUtD6kMmAYc8Fooqya3pjLs1N
Индус писавший доку на мсдн, ты?
>То есть одна длл будет работать и на винде х64 и на макоси арм м2
В случае AnyCPU.
Пчел, у меня либа с классами с таргетом на .net6, в прожектфайле две платформы - x64;arm64, все.
В солюшене тоже самое.
Сделав dotnet pack, я увидел что msbuild просто собрал мой код под AnyCPU и пихнул в пакет. Я убил весь день, чтобы понять как собрать пакет под две платформы. И все ещё нихуя не понял.
ну обычных либ они лежат так
\lib\netcoreapp2.0\MyAssembly.dll
а в твоем случае тебе нужна конкретно подменить на целевой платформе
значит у тебя такие пути
runtimes/win-x64/lib/netcoreapp2.0/MyAssembly.dll
runtimes/win-arm64/lib/netcoreapp2.0/MyAssembly.dll
Окей, спасибо анон, я кажется уловил суть zip архива от корпорации добра.
А ты случаем не знаешь, как мне все это провернуть в csproj, без использования . nuspec?
хз. может AfterBuild тасками можно разложить чтобы потом упаковало оно. Я не знаю как оно собирает - не интересовался.
А так посмотри примен нюспека
https://docs.microsoft.com/ru-ru/nuget/guides/create-uwp-packages
>Можно ли считаться джуном
Я лично тебе разрешаю считаться кем хочешь, только не женщиной, геем можно но обычно джуном считают тех кто может самостоятельно закрывать относительно несложные таски, а знание языка тут дело обязательное, но его воообще недостаточно даже близко. Нужно знать фреймворки, ORM, SQL, предметную область, элементарную математику, git, скорее всего ещё уметь немного верстать, понимать как работает операционная система, HTTP, рантайм дуднета и кофемашина в офисе. Т.е. даже если ты осилишь этот или другой курс по языку ты будешь на один шаг ближе к заветному вкату, но идти до него будет ещё много километров идти. И даже если тебя возьмут на трейни-позицию, пока ты не начнёшь самостоятельно закрывать таски ты не будешь считаться джуном.
Если ты до этого носил пиццы, то лучше забей. Если учишься на программиста, лучше читай книги из шапки, курсы тебе не помогут если ты долбоёб.
Есть класс LocalStorage, который должен сохранять в файлы разные классы в json формате, типа SettingsData, LoginData, ShopData, TimersData.
Можно конечно тупа вот так сделать:
_localStorage.SettingsData { get; }
_localStorage.SaveSettingsData();
// ...
_localStorage.LoginData { get; }
_localStorage.SaveLoginData();
// etc
Но если я решу добавить ещё один класс, то мне придётся обновить интерфейс ILocalStorage, а затем и саму реализацию. Как-то не очень получается.
Это даже не близко к уровню стажера.
Джун это:
1. Хорошее знание C# (твой курс я по-быстрому проскроллил, не увидел там даже делегатов и ивентов, а также исключений и асинк-авейтов, немрого посмотрел, сам курс похоже не показывает как надо делать, а лишь показывает синтаксис каких-то частей языка). На metanit зайди и там по главам просто иди.
2. Базовое знание стека технологий какой-то определенной сферы. Ты чем хочешь заниматься? Бекенд? Мобильные приложения? Игры? Десктопные приложения? У всего этого свои фреймворки и библиотеки, ты должен знать что они делают и уметь с их помощью что-то сделать.
3. Базовое знание алгоритмов и структур данных. Нужно просто знать че такое массив, односвязный список, двусвязный список, хеш таблица, двоичное дерево, зачем они нужны. Сортировку пузырьком еще хотя бы напиши.
4. Базовое понимание основных концепций ооп(Solid и хотя бы штук 5 паттернов)
5. Опыт работы/наличие своих проектов соответствующих пункту 2. Без опыта работы скорее всего ток на стажера возьмут.
>metanit
Там, по-моему, еще более скупо чем в этом курсе. Чел из плейлиста берет какой-то кусок синтаксиса и в течении 15-20 минут объясняет шо це такэ на примерах. На метаните текста на пару минут чтения.
> Ты чем хочешь заниматься?
Бэкенд.
> Базовое понимание основных концепций ооп
Понимаю что такое инкапсуляция и наследование. Думаю, если дадут тест на собесе с ними, то смогу решить.
>Без опыта работы скорее всего ток на стажера возьмут
Да похуй, как это называется. Под джуном я имел ввиду человека, который собирается поступать на свою первую галеру.
> Там, по-моему, еще более скупо чем в этом курсе. Чел из плейлиста берет какой-то кусок синтаксиса и в течении 15-20 минут объясняет шо це такэ на примерах. На метаните текста на пару минут чтения.
Ну если ты эти видосы лучше воспринимаешь то смотри их, но повторюсь - я не увидел там нескольких очень важных тем.
> Бэкенд
Я не бекендер, так что пусть кто-то другой подробнее ответит, но по идее ты еще должен хоть на каком-то адекватном уровне знать asp net core, уметь писать самые простые запросы на sql, какой-нибудь маппер, любой фреймворк для dependency injection, ну и понимать как ваще интернет и сеть в общем работает примерно
> Понимаю что такое инкапсуляция и наследование. Думаю, если дадут тест на собесе с ними, то смогу решить.
Ну инкапсуляция и наследование это ладно, с этим разобраться легко.
Чем наследование может быть плохо понимаешь?
Зачем нужна инкапсуляуия понимаешь?
Ну и опять же - солид и немножко паттернов надо знать по хорошему.
> Да похуй, как это называется. Под джуном я имел ввиду человека, который собирается поступать на свою первую галеру.
Справедливо. А у тебя какой сейчас уовень? Ты только начинаешь вкатываться? Языки какие-то изучал до этого? Если у тебя вдруг уже есть опыт работы не на шарпе, то вкатиться намного проще будет
> который собирается поступать на свою первую галеру.
Ебать вкатуны теперь и сленга нахватались. Ты хоть знаешь что такое галера-то?
>Чем наследование может быть плохо понимаешь?
Еще нет. Чем? По-моему, очень удобная штука.
>Зачем нужна инкапсуляция понимаешь?
Да. Код писать буду не один. И чтобы другой программист не наебнул логику моего кода например, вписав в поле возраст -1000, определенным полям следует давать либо приват, либо протектед.
>Языки какие-то изучал до этого?
Плюсы. Но у меня что-то не получилось, психанул разочаровавшись в себе и бросил на полгода.
>Если у тебя вдруг уже есть опыт работы не на шарпе, то вкатиться намного проще будет
Нету. Кстати, а можно в резюме напиздеть, что работал без ТД у друга брата деда? Хотя бы пару месяцев. Сильно палиться буду?
> Сильно палиться буду?
Сам как думаешь? Сейчас вкатуны нахуй не нужны, между вашим братом устраивают "игру в кальмара" самую настоящую. Иди лучше в моряки сразу.
>Иди лучше в моряки сразу.
Меня как-то не привлекает идея жить и спать в одной комнате каюте с дюжиной вонючих мужиков.
Ну кто на что учился.
> Еще нет. Чем? По-моему, очень удобная штука.
Ну короче если слишком большая глубина наследования - то разобраться в структуре программы становится тяжело - придется всю цепочку наследования смотреть, плюс появляется зависимость между базовым классом и производным, и если случится какой-то сильный рефакторинг то всю цепочку наследования придется чинить.
Поэтому если ты пишешь прогу - старайся как можно меньше делать всяких абстрактных классов и длинных цепочек наследования(А наследуется от Б, Б наследуется от В, В наследуетсч от... - вот этого надо избегать, но если никак, то ладно), а пытайся как-бы в ширину растить программу - делай просто маленькие интерфейсы с понятным назначением и ответственностью, и какими надо классами их реализуй. Это в общем-то сразу два принципа солид(1й и вроде 4й)
Когда ты на реальный проект придешь, там везде будет работа чисто на интерфейсах, многое будет выглядеть примерно так:
interface IMochaProviderSevice
{
IMocha GetMocha();
}
> Да. Код писать буду не один. И чтобы другой программист не наебнул логику моего кода например, вписав в поле возраст -1000, определенным полям следует давать либо приват, либо протектед.
Малаца. Это кажется очевидным, но почему-то многие новички этого не осознают.
> Плюсы. Но у меня что-то не получилось, психанул разочаровавшись в себе и бросил на полгода.
И правильно, на шарпе писать в разы приятнее.
> Нету. Кстати, а можно в резюме напиздеть, что работал без ТД у друга брата деда? Хотя бы пару месяцев. Сильно палиться буду?
Лучше не надо, сразу поймут. В теории можно фриланс написать, но я так не делал, поэтому хз.
Лучше займись каким-то своим проектом и просто впиши в опыт, что вот работал над ним полгода. Все так делают, поэтому это норм - хотя бы хр фильтр пройдешь.
Ок, сделал LocalStorage универсальным. А работу с конкретными классами вынес в методы расширения. Вроде норм.
>я не увидел там нескольких очень важных тем
Кстати, забыл спросить - про какие темы ты говорил?
Делегаты, ивенты, лямбды, async/await, IEnumerable, using и IDisposable, исключения, Linq.
Еще бы многопоточность хоть чуть-чуть знать надо, чтобы ты знал как поток запустить и знал про тред пул.
Хорошо, понял. Еще по поводу:
>На metanit зайди и там по главам просто иди.
Скажи, до какой главы ориентировочно читать, чтобы претендовать на стажера/джуна? Просто для меня очень важно, иметь четкую цель, чувствовать прогресс к ней, а не просто "учится".
Ты скорее всего не встретишь 18 главу (но её полезно было бы прочитать), 20 глава не нужна, остальные все обязательно нужно понимать полностью.
Вот тут: https://metanit.com/sharp/tutorial/1.1.php
Главы 1-7 должен хорошо знать
В главе 8 определение операторов и методы расширения, остальное просто прочитай 1 раз
Главу 9 просто прочитай, особо учить не надо, просто прочитай й раз и будь в курсе что такое есть
Главу 10 хорошо надо знать
Главу 11 хорошо надо знать. Но регулярные выражения идеально заучивать не обязательно
Главу 12 просто почитай
Глава 13 джуну не нужна, прочитай 1 раз и забудь, запомни только если тебе там что-то понравится
Глава 14 это не на уровень джуна, пока не лезь, только первый пункт там прочитай, как поток стартануть и попробуй сам это сделать.
Многопоточность это очень объёмная тема, но ты просто должен знать что такое поток
Главы 15, 16, 17 нужны
Главы 21(про сборщик мусора на собеседовании будут спрашивать скорее всего), 22, 23 нужны
Все остальное нахуй, даже не читай
Дальше открываешь https://metanit.com/sharp/patterns/
И читаешь про SOLID, Singleton, Command, Observer, Abstract Factory, Iterator и еще парочку паттернов какие хочешь
Это конкретно по языку и паттернам, что там еще надо тебе уже бекендеры посоветуют
Вот тут: https://metanit.com/sharp/tutorial/1.1.php
Главы 1-7 должен хорошо знать
В главе 8 определение операторов и методы расширения, остальное просто прочитай 1 раз
Главу 9 просто прочитай, особо учить не надо, просто прочитай й раз и будь в курсе что такое есть
Главу 10 хорошо надо знать
Главу 11 хорошо надо знать. Но регулярные выражения идеально заучивать не обязательно
Главу 12 просто почитай
Глава 13 джуну не нужна, прочитай 1 раз и забудь, запомни только если тебе там что-то понравится
Глава 14 это не на уровень джуна, пока не лезь, только первый пункт там прочитай, как поток стартануть и попробуй сам это сделать.
Многопоточность это очень объёмная тема, но ты просто должен знать что такое поток
Главы 15, 16, 17 нужны
Главы 21(про сборщик мусора на собеседовании будут спрашивать скорее всего), 22, 23 нужны
Все остальное нахуй, даже не читай
Дальше открываешь https://metanit.com/sharp/patterns/
И читаешь про SOLID, Singleton, Command, Observer, Abstract Factory, Iterator и еще парочку паттернов какие хочешь
Это конкретно по языку и паттернам, что там еще надо тебе уже бекендеры посоветуют
Хорошо, понял, спасибо большое, анон!
> XML не нужен, даже не читай
Кул стори бро. Представил твоё ебало когда ты всё это для вкатуна расписывал.
Там "изучения" на полчаса.
Учить всю хуйню, которую он на стаковерфлоу нагуглит за 5 минут когда она ему понадобится - смысла мало
>Сортировку пузырьком еще хотя бы напиши.
Как же трудно сейчас айтишникам, они до сих пор ручками пишут базовые алгоритмы.
Почему не спрашиваете теорему Пифагора?
> Бэкенд
Общие вопросы:
Уровни модели OSI
Клиент-серверная архитектура, какие бывают еще
Работа операционной системы (что делает, какие бывают, что можно переложить на нее, чтобы не велосипедить)
Многопоточка, синхронизация доступа к разделяемым ресурсам, поиск консенсуса.
Асинхронщина. Чому говно, чому круто? В чем вообще прекол.
HTTP. Чому говно, чому не говно? Принцип работы.
Вебсокеты. Что, зачем? Какие подводные камни?
Сессии, куки, авторизация-аутентификация.
JWT. Что, почему пользуем? Почему говно? Как жить-то с ними?
Почему нужно возвращать всегда 200? Вопрос с подвохой.
Докеры-хуекеры, кубернетисы-шмубирнетисы. Что, зачем, почему, как поднять.
Что за зверь такой MVC? Почему оно так популярно?
API First.
Шарпы:
База - что-то из этого не знаешь - сразу идешь нахуй
Ссылочные и значимые типы. Чем они отличаются.
Вопрос со звездочкой - что такое record, как жили без него?
Передача аргументов, чем in от ref отличается?
String - с хуя этот зверь, являясь ссылочным ведет себя как сука?
Колекции шарпа, как какие работают, вообще - нах оно надо?
LINQ, что зачем и почему говно без задач, но почему - придется пользоваться?
Женерики - что, почему заебись, чем от темплейтов из C++ отличаются, почему жава опять соснула.
unsafe - надо ли вообще оно тебе, и почему - да.
GC - что за хуй такой, как работает, зачем нужен
Финализаторы и почему ты не должен их писать.
IDispoasble - воняет говной или не? Когда надо, когда - пошло оно нахуй.
Рефлексия. Что, зачем, почему говно без задач.
Чем Framework от Core отличается, а те в свою очередь от Mono?
Бекендер-щит - тут могут быть пробелы, джуну-то, но что-то спиздануть по каждой теме надо
Механизм обработки запрос. Что вообще происходи-то, после того до сервера добрался первый SYN?
ASP - стори, че вообще такое.
Какие были майками предприняты попытки завоевать бекенд-рынок? Почему соснули?
Какие веб-серверы у майков есть для хостинга твоего приложения? Почему ты должен использовать Kestrel?
Если Kestrel, то что там с хостингом сразу нескольких приложений?
Что есть для авторизации?
Что там по работе с БД? Почему использовать ADO в 2022 все еще норм?
Как-то так.
> Бэкенд
Общие вопросы:
Уровни модели OSI
Клиент-серверная архитектура, какие бывают еще
Работа операционной системы (что делает, какие бывают, что можно переложить на нее, чтобы не велосипедить)
Многопоточка, синхронизация доступа к разделяемым ресурсам, поиск консенсуса.
Асинхронщина. Чому говно, чому круто? В чем вообще прекол.
HTTP. Чому говно, чому не говно? Принцип работы.
Вебсокеты. Что, зачем? Какие подводные камни?
Сессии, куки, авторизация-аутентификация.
JWT. Что, почему пользуем? Почему говно? Как жить-то с ними?
Почему нужно возвращать всегда 200? Вопрос с подвохой.
Докеры-хуекеры, кубернетисы-шмубирнетисы. Что, зачем, почему, как поднять.
Что за зверь такой MVC? Почему оно так популярно?
API First.
Шарпы:
База - что-то из этого не знаешь - сразу идешь нахуй
Ссылочные и значимые типы. Чем они отличаются.
Вопрос со звездочкой - что такое record, как жили без него?
Передача аргументов, чем in от ref отличается?
String - с хуя этот зверь, являясь ссылочным ведет себя как сука?
Колекции шарпа, как какие работают, вообще - нах оно надо?
LINQ, что зачем и почему говно без задач, но почему - придется пользоваться?
Женерики - что, почему заебись, чем от темплейтов из C++ отличаются, почему жава опять соснула.
unsafe - надо ли вообще оно тебе, и почему - да.
GC - что за хуй такой, как работает, зачем нужен
Финализаторы и почему ты не должен их писать.
IDispoasble - воняет говной или не? Когда надо, когда - пошло оно нахуй.
Рефлексия. Что, зачем, почему говно без задач.
Чем Framework от Core отличается, а те в свою очередь от Mono?
Бекендер-щит - тут могут быть пробелы, джуну-то, но что-то спиздануть по каждой теме надо
Механизм обработки запрос. Что вообще происходи-то, после того до сервера добрался первый SYN?
ASP - стори, че вообще такое.
Какие были майками предприняты попытки завоевать бекенд-рынок? Почему соснули?
Какие веб-серверы у майков есть для хостинга твоего приложения? Почему ты должен использовать Kestrel?
Если Kestrel, то что там с хостингом сразу нескольких приложений?
Что есть для авторизации?
Что там по работе с БД? Почему использовать ADO в 2022 все еще норм?
Как-то так.
Да, про SOLID, паттерны я не стал включать исключительно из-за того что очередной бесноватый будет кричать, что это уже минимум мидл.
По факту - джуну тоже это знать надо и спросят. Так что лучше про них тоже почитай.
>Как же трудно сейчас айтишникам, они до сих пор ручками пишут базовые алгоритмы.
Художники прежде чем начать писать портреты барышень рисуют всякие кубы и фрукты, музыканты перед великими произведениями играют гаммы, а программисты реализуют простые алгоритмы. Не вижу причин твоего подрыва.
Ты инженер, а не художник. Тебе не нужно мастерить колесо, чтобы потом высчитать его площадь. Тебе не нужно доказывать пифагора, чтобы использовать полигоны. Мне от работника куда важнее знать насколько хорошо он умеет работать с базой
с SQL, чем то насколько он там Фибоначчи собирать умеет.
Знает что такой алгоритм есть, загуглит если нужно будет его писать руками. Так же и во всем остальном, что уже людьми открыто давно.
Такие художники как ты и тормозят прогресс.
> Ты инженер, а не художник
Инженер гораздо ближе к художнику чем ты думаешь. Ты просто не шаришь. Литкод-то медиум решить можешь хоть, инженер?
>Литкод-то медиум решить можешь хоть, инженер?
Гуманитарную макаку зацепило и все что он смог высрать, это писькомерство литкода. Ты жалок.
Скинь. Может подскажем в чём проблема.
Когда я скидывал код - мне даже не пришлось проходить собес
Да просто кандидатов было несколько, и кто-то справился чуть лучше тебя, а кто-то хуже, ну и выбрали лучшего кандидата, остальным отказ. Это нормально.
Сидел пол дня ковырялся в жопе, имитировал работу, пришла тестовая таска от джуна, скипнул сразу, потому что хотел посмотреть новую игру престолов (как раз времени на час).
>Почему нужно возвращать всегда 200? Вопрос с подвохо
нахер этот вопрос. за него морду нужно бить ибо холивар. возвращать всегда 200 не нужно, но "натянуть все ошибки логики на коды хттп" тоже дичь.
>String - с хуя этот зверь, являясь ссылочным ведет себя как сука?
ась? обычный иммутабельный тип. ведет себя как положено таким типам.
>Рефлексия. Что, зачем, почему говно без задач.
Без каких задач? наряду с кодогеном лютый вин. Как раз не жава же. Впрочем кодогенерация при компиляции вещь не хуже, чем все делать в рантайме.
>Какие были майками предприняты попытки завоевать бекенд-рынок? Почему соснули?
шта? это вообще о чем.
Проиграл
GetText() не помогает, я понял что надо копать в сторону microsoft.visualstudio.shell.interop , но я не понимаю, какой интерфейс сюда подходит?
Буду рад помощи
У меня он не открывается ни в 2022 студии, ни в 2012. Тем более тестовое 100% на гитхабе должно лежать.
Нашел, через DTE.ActiveDocument.Selection делается.
Два критичных, как мне кажется - папка Model для моделей. То есть объектов с минимум бизнес-логике. И возможно им не понравилось реализация событий, и они хотели что бы использовал INotifyChanged
>>456686
https://github.com/LegateZero/TestTask
>>456704
Спасибо за ответ.
> папка Model для моделей
А как надо?
В корне должна быть инструкция по сборке и тестированию в виде ReadMe.md
хз че делает код без самого задания. так что по диагонали
1 засилье region мешает чтению. Ну и переменные с большой буквы. Это придирки..но зачем злить экзаменатора
2 double.Parse входной темпы - никогда не доверяй входным данным, что они будут в нужном формате. КРИТИЧНО.
3 EngineIC Engine = new(10, M, V, 110, 0.01, 0.0001, 0.1);
вот то, на что я жаловался на шарп в прошлых тредах - поди разбери что это за параметры. Там еще предлагали юзать переменные чисто для описания (гыгы). Ладно перехожу на сигнатуру -
(int i, int[] M, int[] V, double overheatTemp, double hm, double hv, double c)
имена мне ни о чем не говорят. И собственно эти же имена в классе - хз что они означают.
КРИТИЧНО.
4 Engine.TemperatureChanged += OnEngineTemperatureChanged;
а отписка где? Напрашивается IDisposable КРИТИЧНО.
5 _TimeFromStart++; - имя говорит про время, но это ничуть не время, а больше смахивает на счетчик итераций. Да и вообще там речь идет про время везде, но где само время?? КРИТИЧНО.
6 if (time == -1) - про "время" я уже писал, а по факту как ответ "Ответ на главный вопрос жизни, вселенной и всего такого". Это число не говорит о результате. Лучше вернуть результат тестирования с четким пониманием что произошло и итог. КРИТИЧНО.
О, спасибо за подробный разбор.
> 5 _TimeFromStart++; - имя говорит про время, но это ничуть не время, а больше смахивает на счетчик итераций. Да и вообще там речь идет про время везде, но где само время?? КРИТИЧНО.
В задании нужно было упрощенно симулировать работу двигателя, при этом не используя реальное время, чтобы не дожидаться результата. +Программа должна быть легко расширяема (Подрузамевается простота добавления новых типов двигателей и тестов). Одна итерация в данном случае равна одной секунде.
> имена мне ни о чем не говорят. И собственно эти же имена в классе - хз что они означают.
Все переменные были даны в виде физических констант. Наверное стоило им всем присвоить понятные имена тут я оплошал, да.
>Подрузамевается простота добавления новых типов двигателей и тестов
ну последнего вроде нет
А вообще типичная проблема таких заданий - хз что подразумевает проверяющий. У него ж свое видение и если что не так - ты провалился.
Я так завалил свой первый собес (на другом языке), где мне сказали тупо по бырому "вычислить фибоначи но не использовать кеширование". И естественно я его провалил потому что "должен был использовать мемоизацию". До сих пор не знаю, какое такое кеширование имелось в виду, если это не мемоизация.
> поди разбери что это за параметры
Открой в студии с решарпером, все параметры неочевидные будут подписаны. По остальным пунктам согласен, не перезвонил бы
и получается забавный результат
1 решарпер считает нужным удалить все явные param: value если они совпадают с позиционными, что делает код менее читабельным
2 в итоге сам же и замусорит своими подсказками
и читать без IDE неудобно. Особенно если смотришь какой нибудь дифф, а там магия.
конечно решарпер можно настроить чтобы не удалял, но это уже мой костыль, а не общепринятый подход.
Проблема заключается в том, что при деактивации приложения, мое окно продолжает висеть и перекрывать собой экран. Есть ли какой способ сделать мое окно так сказать принадлежащим к определенному приложению? Обращаться к самому приложению я тоже не могу по техническим ограничениям.
Из первого, что пришло в голову, это постоянно сканировать процессы и проверять активность нужного. Есть ли что-то проще?
по хорошему у твоего окна должен быть Owner, но похоже это не подразумевается и у тебя его нет.
Значит ты должен сам следить за основным окном.
Если основное окно это WPF то ты можешь попытаться добраться до него с помощью
Application.Current.MainWindow
Application.Current.Windows
и подписаться на событие минимизации. (или тупо сделать Owner своему окну)
К сожалению это приложение не подчиняется мне. Ну как если бы я из браузера запустил свою приложуху. Вот как мне браузер сделать owner ссылаясь на его процесс?
Если приложение впф и ты в его процессе то ты можешь достать его окна. Тут правда еще фреймворк важен и как делается изоляция
В коре аппдомаины выпилены
А если ты в своем процессе то ты уже не аддон
Все, нашел. Действительно, можно owner присвоить процесс, но только owner не как свойство окна, а как WindowInteropHelper
Process[] processes = Process.GetProcessesByName("TargetApp");
WindowInteropHelper wih = new WindowInteropHelper(this);
wih.Owner = processes(0).MainWindowHandle;
Ну естественно я опустил момент, если процессов несколько или вообще нет.
Теперь если скрыть главное приложение, то скрывается и мое. Но вет если переключаться при помощи alt+tab к примеру, то мое окно висит поверх. Тут надо убирать topMost, но тогда основное приложение будет перекрывать мое окно.
>А если ты в своем процессе то ты уже не аддон
Да я хз как это назвать. Там на самом деле все через жопу.
По факту у меня работает отдельное приложение.
Скрипт, из приложения, для которого я пишу доп функционал запускает функцию из моей dll,
Эта функция при помощи именованных каналов передает данные в еще одно мое приложение.
Вот, собсно последнее мне надо как-то сделать причастным к первому. Как бцдто это часть приложения.
Корчое, ни закрытие не переключение на другой процесс не влияет на дочернее окно. Только скрытие работает.
При этом перемещение дочернего окна начало заметно подтормаживать.
TopMost отключил и на удивление окно основного приложения не перекрывает мое. Осталось решить проблему с детектом закрытия приложения.
Получается, что все телодвижения пока бессмысленны, если все равно все сводится к скану процессов.
Ссыль не найду. Там суть в том, что для некоторых методов (sum, min, max, avg, мб ещё что-то) теперь используются векторные инструкции, если есть такая возможность.
Ускорение примерно в 40 раз по сравнению с вычислением ручками.
ну это если ты его стартуешь
а если нет то тебе нужно смотреть в сторону мучений с SetWinEventHook и ловлей EVENT_OBJECT_DESTROY
угу. SetWinEventHook поможет. По быстрому попробовал это https://github.com/OpenByteDev/WinEventHook
с простым кодом (пик)
и работает
тебе же писать на чуть ниже уровнем чтобы убрать лишний оверхед в виде события
>ну это если ты его стартуешь
Да нет, сработало и так. Т.е. я получал уже активный процесс по имени и подписка нормально работала.
Но теперь у меня загадка всех загадок. Если мы вернемся обратно к коду,
то на самом деле у меня в третей строчке был вписан тестовый месседжбокс
Process[] processes = Process.GetProcessesByName("TargetApp");
WindowInteropHelper wih = new WindowInteropHelper(this);
MsgBox($"processes.Length: {processes.Length}");
wih.Owner = processes(0).MainWindowHandle;
И как-то он удачно встал, что у меня все работало как я хочу.
Но стоит мне его убрать, как мое окно при запуске проваливалось за окно главной приложухи
и эффекта TopMost только относительно приложения уже не наблюдалось.
Как только окно загружается, то сразу идет на задний план.
Что делал месседжбокс?
да причем тут сторонняя. это просто враппер для того чтобы не пердолится самому в реализацию всех эти структур
никто не запрещает и самому это делать
>>457085
Что делал месседжбокс?
активировал окно. то есть выносил на передний план
а вообще такое нужно без студии. меня запарило с 19 и 22 студии фигня что месседжбокс при запуске из под студии невидим. Приходится с трудом до него добираться
то есть работа под студией и в релизе разная.
>активировал окно.
Попробовал Activate заюзать, но без толку.
Вот даже когда я скрываю основное приложение, то мое не скрывается автоматически.
С месседжбоксом скрывается.
Попытался вместо месседжбокса запустить кастомное окно в режиме Showdialog
Запускается оно в момент Loading моего окна
Так вот, когда я самолично тыкаю по окну и закрываю, то мое окно работает так как нужно.
Но если я диалоговое окно закрываю автоматически через какое-то время, то эффекта ноль.
Эффекта добился если сделать задержку закрытия диалогового окна на секунду. Меньше не дает эффекта.
Что это за дерьмо?
потренируйся на жирафах до просветления
я хз че у тебя происходит. тот кусок кода что я дал на пике - при минимизации основного минимизируется и окно из пика
а при закрытии закрывается
EFCore заменить на даппер
Postgres на sqlite
Serilog на стандартный лог
железку на 128 ядерный комп с террабайтом оперативы
тогда можно будет запустить пару приложений точно
Ну, это был бы вариант, если бы у меня в распоряжении было ~100 человек, которых можно было бы посадить поддерживать эти форки. Но у меня я и
>>457220
Ну, EFCore и так заменили на прямую работу с базой(дергаем нативные функции SQLite), логер - тоже свой написали. Все равно одно - еще как-то влезает, а вот несколько - уже не лезет. Если отказаться от ASP и реализовывать свою работу с HTTP - то в принципе 3+-1 влезет, но можно ли такое в прод пускать? Только разве что как пруф оф концепт оно может так существовать.
Это не я выбрал. Моя б воля - на плюсах писали...
https://docs.simpleinjector.org/en/latest/quickstart.html
Хорошее ioc решение?
Содомит
Попробовал простой пример. При вызове GetInstance для типа с уровнем жизни Transient, он создаётся два раза. Вопрос - А КАКОГО ХРЕНА??? Это или баг, или я неправильно понимаю Transient.
Итак, зачем ему понадобилось два раза создавать объект в GetInstace? В чём логика?
патамушта могет
https://docs.simpleinjector.org/en/latest/using.html
Verifying the container’s configuration
выключи
container.Options.EnableAutoVerification = false;
Понял. Спасибо. У него в примерах показано, что нужно самому вызывать 'Verify()'. Я сначала на этот метод подумал, поэтому убрал проверку и ничего не изменилось. А она по дефолту включена, лол....
Понятно на что
На майковое после того как асп стал иметь свой дефолтный
И я просто запарился поддерживать в своих либах несколько контейнеров
Попробуй
a) Пошаманить с настройками Kestrel'а https://github.com/dotnet/AspNetCore.Docs/blob/main/aspnetcore/fundamentals/servers/kestrel.md
b) На использовать подсистему контроллеров. И возможно, роутинга. (Юзай app.MapGet и т.д.) Оставь по сути только Kestrel.
Если не помогает, копай в сторону легковесных http-серверов типа https://github.com/unosquare/embedio
Есть некая апиха, которая на принимает пост запрос типа:
{
“id”:[14, 88]
}
И отвечает:
{
“status”: “success”,
“data”: {
“14”:{
“id”: 14,
“info”: “foo”
},
“88”:{
“id”: 88,
“info”: “bar”
}
}
}
И есть мое приложение асп которому нужно вот то инфо из даты считывать. А собственно как? Это ж нельзя строго типизировать - айдишники и соответственно названия полей в дата каждый раз разные. Есть способ это нормально прочитать шарпом? Инбифо пиши парсер жиссонов
Ставь Newtonsoft.JSON и юзай JsonConvert.DeserializeObject()
ну в минимуме он памяти жрет больше чем EF
но ближе к SQL ным запросам чем более абстрактный EF
И получаем как EF без трекинга и контекста с перекосом в чистые запросы (пусть даже написаны на Linq)
Это и есть подводный камень - перекос в чистые запросы хоть и на Linq - из-за этого нет примитивного partial update
Больше чем linq2db но меньше чем ef core - SqlSugar, но там своеобразное именование и рукожопы не разделили зависимости от баз данных, поэтому тупо ставятся все зависимости и место занимают.
>ли не очень удобный Dapper
Есть путь использовать Dapper, но облегчить себе жизнь через составление запросов с помощью Linq, хотя всякие Include все ручками ибо навигацию не учитывают. Но легковесность.
>Это ж нельзя строго типизировать
Ну если структура неизвестна во время ответа, то полуручной разбор
поддерживается и в System.Text.Json через JsonDocument.Parse и в Newtonsoft.JSON через JObject.Parse - и плата за это некоторый оверхед. Ну а без него - ручной разбор
Не, ну она известна и даже управляема, количество и названия объектов в data зависят от айдишек в запросе, сами эти объекты тоже известны и стабильны
Ну блин, получается что динамическим является количество и названия филдов у объекта дата (определяется в момент запроса, количество равно количеству айдишек в запросе (в моем случае вообще одна будет), а названия сами айдишки текстом) их тип и все остальное стабильно. Получается что известно заранее, но хрен типизируешь
ерунда, а не проблема. Структура проста, можно десериализовать в словари и потом перегнать в классы. Все равно лучше чем жсон разбирать.
Я чёт уже заколебался настраивать JVM, это какая-то сран и отдельная наука, такого, чтобы просто пнул и оно полетело практически не встречается на +- серьезных проектах, чуть ли не отдельных людей приходится заводить, чтобы они всё тюнили.
Это только наши приколы или у вас какая-то похожая ситуация? Как вообще у вас обстоят дела с GC? С блокировками во время этого дела? Затратами на проц и оперативку? Необходимостью тюнинга?
Статьи в интернете я читал, но интересует именно практический опыт от реальных людей, вот насколько вас приходится сталкиваться с этим в реальной жизни и насколько удобно такие задачи решать?
Ну на самом деле структура чуть сложнее вот эти классы, которые называются как айдишка текстом, могут содержать в себе и массивы и другие классы.
Что насчёт такого варианта:
var response = JsonSerializer.Deserialize<Dictionary<string, JsonElement>>(responseBody);
var data = JsonSerializer.Deserialize<Dictionary<string, JsonElement>>(response[“data”].ToString());
var obj = JsonSerializer.Deserialize<SomeClass>(data[$”{id}”].ToString());
Вот так более-менее эффективно будет?
> у вас какая
> ситуация?
Обесняю нашу ситуацию:
1. Скачиваешь СДК.
2. Далее, далее, далее, готово.
3. Открываешь консолечку.
4. Пишешь dotnet new console.
5. Пишешь dotnet run.
Конпелируется хеллоуворлд запускается и выводит в консоль Hello world.
Вот такие у нас дела. Завидуй.
сложные структуры где черт знает что может лежать это JsonDocument.Parse и ручным выдиранием или ручной разбор через ридер.
Ну, с GC по ощущениям сильно проще.
Так как язык и рантайм поддерживают значимые типы данных (ака структурам), и они широко применяются в стандартной библиотеке, то нагрузка на менеджер памяти и GC выходит заметно ниже, так как порождается меньше объектов, особенно маложивущих.
GC два. Десктопный с упором на минимизацию задержек на STW, и серверный, с упором на скорость выделения памяти. Тюнить их не приходилось. Не знаю, как себя поведет GC на огромных хипах, которые, слышал, в джавовских монолитах могут встречаться. Везде, где работал, пилят микросервисы и стараются особо много памяти им не наваливать
Обычно, когда появляются какие-то проблемы с использованием памяти, то это значит, что пора бы попробовать переписать код на allocation free. Благо инструменты, типо пулов памяти/массивов, span-ов, всяких разных ref (в том числе readonly) структур и stackalloc'а есть. Центили-байтоебы могут даже попробовать unsafe и пдрочить указатели.
Спасибо за такой подробный ответ.
А как у вас с линуксом, я слышал про всякие mono, насколько реализации отличаются и насколько это вообще жизнеспособно?
После выхода истинно кроссплатформенного коре моно стал не нужен
Сейчас у нас основной рантайм - опенсорсный кроссплатформенный .Net Core. .Net Framework и Mono остались в прошлом и уже не развиваются. Рантайм активно развивают, в первую очередь в сторону производительности.
С запуском под линухом проблем нет. Для популярных дистров есть пакеты с рантаймом. Есть оф. образы для докера, которыми все активно пользуются.
На трёх местах, где я работал и работаю сервисы деплоятся под линухом в кубере или Open Shift.
Единственная проблема, нет нормального кросплатформенного UI. WinForms, WPF и UWP прибиты к Винде. Майки разрабатывают кросплатформенный (винда + мобилки) MAUI, но линух официально поддерживать не хотят и оставляют это на откуп сообществу. Вроде как ещё есть трули кроссплатформенная Avalonia, но я ее не трогал, потому мне сказать нечего.
что это за синглтон такой что рождается и умирает (ну допустим ладно в рамках IoC такое есть)
хотя зачем ему умирать и деструктор??? финализатор что ли?
не гуд. Отписываться нужно в Dispose (но опять же что это за синглтон такой)
самый продвинутый уровень это lifetime, но это для тех, кто постиг дзен (и это не веб где достаточно IoC контейнера из-за специфики)
Немножко неправильно объяснил. У меня есть сервисы. Они не знают о своём времени жизни. Но по факту они будут жить до закрытия программы, как синглтоны, внутри контейнера. Некоторые из этих сервисов должны подписываться на события других сервисов.
Не знаю как бы это грамотно реализовать. Или добавить может им interface с методами, которые будут дёргаться извне. Типа AddListeners / Remove Listeners.
Подписываются и пусть подписываются. Для этого события и нужны.
Если же время жизни может быть меньше того, на что подписываются то компонент должен знать, когда ему нужно очистить ресурсы
1 Stop(Async) если это что то типа HostedService
2 Dispose()
3 lifetime - токен
собственно все это одно и то же с небольшими отличиями.
а капча не охерела буквы заставлять вводить?????
Все упирается как и везде в возможность найти где будут наваливать и мало требовать
Я не хочу получать бабло и не работать. Хотелось бы выполнять интересную более менее работу и не недополучать в деньгах, как повелось в каком нибудь эмбенде на си. Думаю C# лучший варант для этого
>Какие есть подводные?
В целом, никаких. Юзаем его на кровавом энтерпрайзе с ебанутейшими запросами к базе MSSQL/Oracle.
linq2db - это относительно lightweight ORM библиотека, как раз между фреймфорком EF и низкoуровневыми Dapper/ADO.
Представь себе два экстремума, вот liqn2db - это золотая середина, а на каждом конце находятся армии фанатиков.
>ак разные orm могут иметь разную скорость работы, если они просто переводят запросы с синтаксиса языка в sql
А как разные языки программирования могут иметь разную скорость работы, если они просто переводят запросы пользователя с синтаксиса языка в команды процессора?
Вот наверное по той же самой причине.
Да, вполне норм тема, но нужен опыт. В шарпе сейчас интересно в основном на новых проектах, где .net6 и т.д. Но туда берут либо по знакомству, либо за очень хорошие скилы.
Они сложно переводят запросы с синтаксиса языка в sql. Обычный джойн может превратиться в цикл из селектов.
> Обычный джойн может превратиться в цикл из селектов.
То есть авторы orm считают, что могут лучше оптимизировать запросы, чем это сделает сама бд?
EF например не только в запросы переводит и Марии таблички на объекты, но и отслеживает объекты - можно писать типа
var selectedUser = _db.Users.First();
selectedUser.Name = "pidor";
_db.SaveChanges();
Не считают, просто не всегда корректно срабатывает генератор запросов. Чтобы самому не проебаться при использовании ORM, надо либо отказаться от их использования, либо очень хорошо знать кишки ORM, быть нахуй сеньором DBA и иметь лет 15 опыта, а каждый сгенерированный запрос перепроверять вручную.
> Не нашел у msbuild встроенных переменных.
Пять секунд гугла https://docs.microsoft.com/ru-ru/visualstudio/msbuild/how-to-use-environment-variables-in-a-build?view=vs-2022
и мы узнаём, что мсбилд умеет читать переменные среды, соответственно, никаких встроенных переменных там и не нужно.
…но сам факт показателен: зумер считает, что нет нужды изучать сраное легаси плесневелых дидов, и не знает о существовании переменных среды, и соответственно, будет велосипедить очередное мокрописечное говно.
Бля, msbuild же может выполнять шарповый код в пропертях, я даун...
Да не трясись ты, джавист. Можешь попробовать подучить язык и перекатиться к нам, вдруг проблема с нервами решится.
А чё злой тогда такой? Опять Кабаныч наорал?
byte jej = 7;
происходит неявное преобразование.
и даже в
byte jej = 7 + 3;
оно произойдет, когда оператор + вернет инт.
но здесь
byte yey = jej + 3;
все сломается? почему jej просто неявно не перейдет в int, оператор + не отдаст результат в int и как было до этого и этот результат также неявно не перейдет в byte, как и 7, и 7+3 до этого?
Потому что компилятор видит, что в первых двух случаях значение влезает в byte. (Константные выражения он на этапе компиляции сворачивает). А вот когда появляется переменная, то гарантий что влезет уже нет. Так что кастуй явно, чтобы ты так сказать, расписался, что понимаешь что запихиваешь значения более широкого типа в переменную менее широкого и готов к тому, что значение может урезаться.
Создаю проект - запускаю и вылазит эта ошибка.
Если вручную запускать .ехе - работает
Спасибо большое
Попробуй переустанови Visual Studio.
>Зачем микрософт упорно поддерживает Visual Basic?
1) Обратная совместимость.
2) Тебе не похуй?
Они его даже не развивают уже, а просто не выкидывают, чтобы легаси у других организаций не сломалось. Легаси начали писать ещё у нулевых, смигрировав его с более старых проектов на не-дотнетовском бейсике. Ну и есть некоторое количество дебилов-старпёров, которые знали старый бейсик и начали писать новые проекты не на шарпе, а на vb.net, якобы сложно переучиваться, хотя хуй знает, как вообще можно не осилить фигурные скобочки.
> Какого это вообще работать в микрософт, получать жирную котлету и закрывать тасочки по разработке языка, но котором не пишет никто?
Его пишут те же разрабы, что пишут шарп, просто парсер языка другой, его и дорабатывать не нужно почти. А кишки всё те же, дотнетовские.
>Преимущество перед такими же вкатунами даст парочка интересных пет-проектов где вы делаете всё максимально правильно и точно следуя архитектуре.
Например каких?
На самом деле эчарам похуй на твои проекты в 99% случаев.
Открываешь вакансию на вкатуна в пятницу, в понедельник там 400 откликов. Если у каждого гитхаб 5 минут смотреть, это займет 33 часа.
Так я в курсе. Мой гитхаб вообще не смотрели, даже тестовое попросили зипкой скинуть.
Мой знакомый месяц ловил отказ за отказом, потом переработал резюме на покрасивше, поставил фотку красивую, после этого пригласили на 3 собеса, где он получил по офферу.
>Мой знакомый месяц ловил отказ за отказом, потом переработал резюме на покрасивше, поставил фотку красивую
Всё так, к сожалению вычислением нормальных кадидатов занимается хрюша которая ничего не понимает в айти и ей только остается ориентироваться на ключевые слова в резюме и фоточку
Конечно лучше, читаешь и понимаешь, что это консоле и что оно врайтит лайне. А когда читаешь путс, предполагаешь ле пута муэрте.
когда читаешь
puts
echo
то понимаешь что выпхлоп пойдет в stdout
Console.WriteLine тоже выводит в stdout, что не консоль как бы. Консоль - только один из многих кто может читать stdout
sbyte num = (sbyte)-31;
Console.WriteLine("Convert: " + Convert.ToString(num, 2) + "\n");
Выведет
1111111111100001, а не
11100001
В мсдн ведь byte и sbyte 8-разрядное целое число
Зумеры не знают таких тонкостей. Чорное текстовое - это консолечка, которой пердолятся красноглазые. Этого достаточно, чтобы вкатиться на галеру джуном.
Наследование запрещено. Ищи другие способы
>, а я хотел добавить своё.
именно поэтому и запрещено наследование чтобы не было вот таких ситуаций
Проблема, что на сервере (консоль 1) бд походу не создается и падает с "No such table", а на моей машине (консоль 2) все запускается идеально и создается бд.
Команды запуска идентичны, при локальном запуске тоже всё работает.
1) ASP.Net Core in action
2) NET Microservices Architecture for Containerized NET Applications
Я ХЗ, в зависимости от того, что конкретно тебе надо. Если надо выебнуться, сделай каждый стейт отдельным классом, с методами EnterState и ExitState, В которых будет делаться то, что на пикче. А ещё лучше сделать интерфейс и один класс-реализатор с методами-делегатами и сразу лямбдой при создании программировать эти действия.
По первому доёбу: почему бы не юзать вместо енума класс? Понятное дело, всахара не будет, ты будешь видеть свой енум как класс/структ, но все фишки типа методов и реализации интерфейса будут:
> public static class TokenType {
> public const int IDENTIFIER = 0;
> public const int NUMBER = 1;
> public const int ASSIGN = 2;
>}
Читаем дальше.
Дочитал до экземпляров интерфейсов и дропнул. Нельзя так вольно трактовать ООП. У интерфейса не может быть экземпляров.
ну функциональные интерфейсы и анонимные реализации вещи годные.
просто ведь шарп вырос из жава клона, то как бы много не накопаешь фич
а вот если котлин пригласить в тему, то набросить можно много
>>461235
>У интерфейса не может быть экземпляров.
Их и нет.
это такой же класс, который требует реализацию, просто описывается на месте и потому без имени.
Абсолютно идентично как метод принимает делегат, а ты ему пропихиваешь анонимную реализацию этого делегата, то бишь ламбду
Только лямбда это один метод, а анонимная реализация интерфейса это можно более одного метода.
В итоге ты волен выбирать - нужен один метод, можешь лямбду, нужно несколько, можешь анонимную реализацию
Удобная штука так то
>всахара не будет
поэтому и не юзать
енумы нужны чтобы в параметрах не писать int, а нормальные имена
и твой TokenType это возврат к тому с чего начали.
енумы в шарпе хреновые.
Как найти через linq объект с id1, в котором все значения из массива есть в id2, то есть
id| id1 | id2
1 | 1 | 1
2 | 1 | 2
3 | 1 | 3
4 | 2 | 4
5 | 2 | 1
и массив {1, 2, 3}
Надо вернуть id1 = 1. Или надо свою реализацию писать?
i
Intersect
Последняя хуйня была бы оооооооооооооооооч полезна. Особенно в случае LINQ, потому что это буквально бесит, то ты не можешь нормально интерфейс оттуда вернуть, особенно если LINQ у тебя в другом методе.
>>461230
Вот я делал парсер простенький для нужд.
Нужны условия в духе: если до меня был такой-то знак, а после - такой-то я должен создать такую-то лексему.
Ты просто не представляешь какая это боль в контексте шарпов.
У тебя будет что-то в духе:
public class Token {
public readonly int? Line;
public readonly int? Col;
public readonly string Symbol;
public Token(string symbol) : this(symbol, null, null){}
public Token(string symbol, int? line, int? col) => (Symbol, Line, Col) = (symbol, line, col);
public static readonly Token Space = new (" ");
public static readonly Token SingleQuotes = new ("'");
public static readonly Token DoubleQuotes = new ("\"");
public static readonly Token Slash = new ("/");
public static readonly Token BackSlash = new ("\\");
public static readonly Token Space = new (" ");
public static readonly Token Comma = new (",");
public static readonly Token OpenCurly= new ("{");
public static readonly Token CloseCurly = new("}");
public static readonly Token OpenRound= new ("(");
public static readonly Token CloseRound= new ("(");
public static readonly Token OpenSquare = new("[");
public static readonly Token CloseSquare = new("]");
public static readonly Token BEGIN = new("BEGIN");
public static readonly Token END = new("END");
public static readonly Token ASSIGN = new("::=");
public static readonly Token EOL = new("\n");
}
И это уже пиздец. А тут еще логику нужно вопхнуть и это будет пиздецки больно. А еще ходить туда-сюда, в поисках нужного. И много еще чего веселого.
Я в итоге когда это делал - забил на ООП и попытки делать "красиво" и хуйнул как деды хуярили свичем и за один проход, ибо нехуй.
Последняя хуйня была бы оооооооооооооооооч полезна. Особенно в случае LINQ, потому что это буквально бесит, то ты не можешь нормально интерфейс оттуда вернуть, особенно если LINQ у тебя в другом методе.
>>461230
Вот я делал парсер простенький для нужд.
Нужны условия в духе: если до меня был такой-то знак, а после - такой-то я должен создать такую-то лексему.
Ты просто не представляешь какая это боль в контексте шарпов.
У тебя будет что-то в духе:
public class Token {
public readonly int? Line;
public readonly int? Col;
public readonly string Symbol;
public Token(string symbol) : this(symbol, null, null){}
public Token(string symbol, int? line, int? col) => (Symbol, Line, Col) = (symbol, line, col);
public static readonly Token Space = new (" ");
public static readonly Token SingleQuotes = new ("'");
public static readonly Token DoubleQuotes = new ("\"");
public static readonly Token Slash = new ("/");
public static readonly Token BackSlash = new ("\\");
public static readonly Token Space = new (" ");
public static readonly Token Comma = new (",");
public static readonly Token OpenCurly= new ("{");
public static readonly Token CloseCurly = new("}");
public static readonly Token OpenRound= new ("(");
public static readonly Token CloseRound= new ("(");
public static readonly Token OpenSquare = new("[");
public static readonly Token CloseSquare = new("]");
public static readonly Token BEGIN = new("BEGIN");
public static readonly Token END = new("END");
public static readonly Token ASSIGN = new("::=");
public static readonly Token EOL = new("\n");
}
И это уже пиздец. А тут еще логику нужно вопхнуть и это будет пиздецки больно. А еще ходить туда-сюда, в поисках нужного. И много еще чего веселого.
Я в итоге когда это делал - забил на ООП и попытки делать "красиво" и хуйнул как деды хуярили свичем и за один проход, ибо нехуй.
Просто я чет был занят своими делами, а остальным - так-то похуй. Но сегодня разгреб свои, решил посмотреть что там у других и, блядь. 0, сук. Я даже от автосгенерированного кода такой хуйни не видел. Посмотрел - там пиздец, метод 2,5к строк, который хуй пойми как работает. Работает при этом до пиздеца медленно. Чел - просто по фану решил создавать словари, пихать в них свойства, которые рефлексей достает, потом в цикле проходится по словорям и смотрит с каким свойтсом другого обхъекта имена совпадают, потом... Ну вы поняли, там пиздец, который во первых - нечитаем, во вторых - нахуй не нужен, в третьих - еще и жутко медленный со сложностью O^4. Я просто чет охуел с такой жизни. Не хочется показываться токсом, но я уже раз 5 в других местах ему подсказывал, по сути - писал половину кода, ему только дополнить свою часть нужно было, но когда чел береться сам - вот такая хуета выходит. Что делать-то? Опять же - не хочется быть токсом, но кроме матерных слов - других нет.
У меня он без аддона вообще не работал
Я хочу, чтобы ивент Changed передавал что-то со значениями до изменения.
Если Action<int, string>, то вне класса не совсем непонятно, что это такое, и нет ссылки на сам объект. Последнее можно решить через Action<Yoba, int, string>, но мне кажется так даже хуже.
Запилить YobaChangeEventArgs : EventArgs со свойствами типа OldNumber и OldText, и сделать ивент через EventHandler<YobaChangeEventArgs>? Или лучше свой собственный делегат с параметрами (Yoba sender, YobaChangeEventArgs e)?
Или есть ещё какие-то варианты?
это правило для публичных контрактов.
>Или есть ещё какие-то варианты
Принять, что event стандартны, но убоги и перейти на свою реализацию подписок с lifetime-ами
> Как мягко намекнуть джуну, что 0 в индексе удобства поддержки в коде, который пишется руками - это нихуя не норма?
Вот это предложение что значит?
Не удивительно, что он ничего не понял, лол
Смысл в том, чтобы эти небольшие деньги кидать на ипотеку оставшейся в РФ квартиры.
Или лучше искать зарубежных заказчиков на большие суммы и переводить в РФ.
Долбоёб, причем тут event если автор фреймворка реализовал свои события не так как тебе хочется?
Ебатьдебил, ты откуда такой вылез? Теперь в РФ 30-40к это только за полный рабочий день.
Звони в банк и договаривайся. Нас-то ты нахуя спрашиваешь?
>Ебатьдебил, ты откуда такой вылез? Теперь в РФ 30-40к это только за полный рабочий день.
Ты ебобо? Полный рабочий день как минимум 200к.
>C точки зрения малолетнего долбоёба - безусловно.
Мой российский доход за полный рабочий день - 230К чистыми.
Кто из нас с тобой - малолетний долбоёб?
Я 180к чистыми, практикант.
сам долбоеб, раз уж начал
какого еще фреймворка
у него типичный вопрос вида - я пилю свое событие, нужно ли мне обязательно делать его EventHandler<EventArgs>
(вдруг у меня 10 событий и КАЖДОМУ сделай класс аргументов "патаму шта...марамушта")
или тупо можно Action<T> благо они появились в шарпе и "нахера мне вся эта портянка с EventHandler<EventArgs>"
Лол, нищенка думает что его копейкам кто-то завидует.
Понимаю, твоя сифозная мамаша устроила тебе трудное дество, но держи его при себе, никто кроме твоей блядской семейки в этом не виноват. :)
Ебанашка, ты передел в лужу якобы механизм языка event убог, хотя по факту убог только твоей мелкий мозг.
Cобытие вообще не проблема сделать как угодно и запилить свои аргументы вообще не проблема, проблема бывает только тогда когда автор фреймворка не предусмотрел а тебе это нужно позарез, такое в винформсах иногда встречается например.
>якобы механизм языка event убог
Дебилушка, все именно так
Для отписки нужно дать делегат, причем именно тот же.
Попробуй реализуй подиску и отписку в обработчике события и сам увидишь насколько это коряво.
Легко вообще можно забыть отписаться.
Сравни это хотя бы с подходом, где можно получить токен и просто диспознуть его, тем самым отписавшись. С lifetime еще удобнее - там просто невозможно забыть отписаться.
Про события и многопоточность там вообще нет нормального решения - есть только "нуу вроде бы это получше других будет"
Нашел версию 2021 года, но там пятый дотнет, который с шестым вообще не клеится, все нахуй поменяли. Ставить пятый или искать что-то другое? К моменту моего устройства многие уже скорее всего будут сидеть на 6 версии, ибо лтс.
>Вот это предложение что значит?
Ты студию открывать пробовал, няша?
Это конечно не 100% критерий, но 0 тут - это уже страшновато смотрится, я такого никогда не видел от кода людьми написанного, худшее что я от людей видел до этого джуна - 40.
>>461656
Я пришел с работы в 11 вечера. В конце дня как раз кодом джуна занялся. Писал на эмоциях.
>>461593
Я же не хочу быть токсичным. Хочу как-то мягко намекнуть, что код в духе второго прикриплейд НЕ ОЧЕНЬ. И когда такой метод 2,5к строк - разобраться в нем СЛОЖНОВАТО.
А че почитать чтобы писать поддерживаемый код?
признавайся. ты сам написал код со второго пика чтобы нас потроллить. Потому что не может программист в здравом уме такое делать.
Я воспроизвел. Код с работы, внезапно, на работе, и показывать его в интернетах - незя. Под страхом выебут.
И да. Я в душе не ебу зачем чел это сделал. Я долго пытался вникнуть. Так и не понял. Завтра спрошу.
> И когда такой метод 2,5к строк - разобраться в нем СЛОЖНОВАТО.
Хуя, у меня в дипломе столько строк, а тут один метод.
Ну вот разве что в админке, да. А в основном нужно уметь грамотно делать апи.
Не пизди, я в госпараше, старший помощник младшего соискателя на джуна, 265К в наносекунду.
>Лол, нищенка думает что его копейкам кто-то завидует.
>Понимаю, твоя сифозная мамаша устроила тебе трудное дество, но держи его при себе, никто кроме твоей блядской семейки в этом не виноват. :)
Какой-то токсичный инцел порвался. Тут у вас такое часто?
Мимокрок
Я если что - шутил. Воть. Ну, типа что в ООП и жава-подобных языках - принято же нахуячить миллион абстракций, фабрик и т.д. Как же я люблю свои шуточки объяснять...
Да вроде не часто. Ещё иногда джависты набегают.
Запускает он его на маке а там какую то ебанину пишет в консоли. Даже разбирается не стал что за хуета.
Установил он виртмашину корочи.
На виртуальной машине не работает var context = await httpListener.GetContextAsync();
И это блять кроссплатформенность?
как будто под виндой проблем нет.
Создаем httpListener, биндим его на ip машины на кастомный порт и получаем "идинах" при попытке запустить его без прав админа (решается добавлением правил в брэндмауер)
потому что...???
>, все нахуй поменяли. Ставить пятый или искать что-то другое? К моменту моего устройства многие уже скорее всего будут сидеть на 6 версии
Я х.з. в чем проблема. Я вообще особо не заметил перехода с 3.1 на 6.
>>462358
Я этим вопросом не интересовался и верил только на слова >Совместима с такими операционными системами как Windows, Linux и macOS. Была выпущена компанией Microsoft.
А на деле залупа выходит.
Есть ли вообще гарантия что приложение заработает на win10 первой версии и win10 с последними обновлениями?
это все пустые слова.
запускаю и на убунту и на маке. Проблемы только с самой авалонией, но что поделать - оно сделано энтузиастами. Даже мелкие ниасилили поддерживать столько сколько они.
Ну а если дело уходит в натив, то причем тут шарп
Без текста ошибки это пустой разговор
Про то что нельзя так просто открывать порты даже на винде
я уже сказал
>А на деле залупа выходит.
Ты так говоришь будто бы с любым другим приложением/языком/фреймворком нет залупы при попытках разработки/сборки/запуска на разных платформах.
Вот что это может значить?
С джава такая же хуйня?
Просто миокрокодилы заходят в тред и постоянно пиздят что кроссплатформенности нет, их постоянно шлют нахуй и говорят что есть.
Вот я подумал что это пидоры просто завидуют вот и пиздят всякую хуйню.
А как столкнулся дак чет начал задумываться мб они и правы.
>Мало кто остаётся инцелом когда твоя мамаша на гастролях :)
Ты главное не волнуйся так сильно, Скуф, в твоём возрасте это вредно. А то не доживёшь до аванса в 20К.
Инфа от твоей мамаши заразившей сифилисом половину казанского вокзала? Такой себе источник информации.
Какой сейчас положняк между систем.текст.жиссон и ньютонсофт.жиссон? Что лучше и почему? Для аппа на коре 3.1 Вроде как общепринятым стандартом является ньютон, но чому?
>Инфа от твоей мамаши заразившей сифилисом половину казанского вокзала? Такой себе источник информации.
Ты зря разнервничался так.
У меня российский проект на 230 тысяч российских и американский заказчик на 3К$. Это в сумме под 7К$. Что в принципе уже может позволить комфортно жить и в Западной Европе, например. Когда через год продам трёхкомнатную квартиру в Москве, чтобы не платить налог, буду перебираться как минимум в Португалию.
У тебя зарплата примерно 600-700$ по нынешнему курсу (правда ты получаешь в фантиках, на которые можешь купить всё меньше и меньше товаров с учётом отсутствия импорта и инфляции в 20%; если валютное регулирование отпустят, твой доход упадёт по 150-200$).
Ради этих денег ты должен работать 5/2 8 часов, появляясь в офисе ровно в 9 утра. Твоё резюме не котируется на линкеде и даже на hh. За годы твоего стажа ты бы мог стать хорошим специалистом, но остался бюджетной макакой.
Вот по этому ты и злишься. А я не злюсь, мне тебя жалко.
Где удобнее там и пиши. Под Винду есть студия и райдер, под прошивку для роутера есть только райдер.
>через год продам трёхкомнатную квартиру в Москве
Не продашь, т.к. твоей маме негде будет принимать клиентов кавказской национальности.
>Не продашь, т.к. твоей маме негде будет принимать клиентов кавказской национальности.
Почему ты проецируешь? Ты не любишь СВОЮ маму?
Почему твой папа газнюх? Он любит нюхать газ?
>Не стоит ожидать, что Microsoft когда-либо будет использовать MAUI внутри компании. Я даже готов поспорить, что они никогда не создадут серьезный продукт на Blazor. Выбор технологического стека, особенно фронтенда, делается не так, как в Dogfooding. Насколько я знаю, это полностью зависит от команды разработчиков, и, как и все в этой индустрии, большинство разработчиков больше знакомы с JS/TS, чем с чем-либо еще. Это не заговор и не алая буква на MAUI/Xamarin, это просто та же история о том, что JS/TS съедает все.
>В MSFT я наблюдал, как они взяли внутренний инструмент ML, который изначально был создан на C# для windows, полностью переписали с электронным фронт-эндом, чтобы сделать его кросс-платформенным. Я так и не увидел его релиза, который в итоге работал бы без тонны сбоев, но это не важно. Когда я спросил, почему команда не создала фронт-энд на Xamarin поверх существующей базы кода, они просто не имели понятия, о чем я говорю.
>Реальность такова, что если вы не докажете вышестоящему руководству, что расширение внутреннего использования или дальнейшее развитие фреймворка (созданного MSFT или иным образом) каким-то образом принесет больше расходов на Azure (это не так), у них нет стимула отдавать предпочтение этому стеку перед любым другим. И без реальных усилий по продвижению на рынок и продвижению этих фронтенд-фреймворков на фоне доминирования JS/TS, они будут продолжаться так же, как они продолжались годами - просто еще одна абстракция пользовательского интерфейса, увядающая на лозе, поддерживаемая все более скелетными командами компаний, которые исторически использовали C#. И как бы унизительно это ни было для тех из нас, кто потратил значительную часть своей карьеры на веру в них, в краткосрочной перспективе это имеет смысл для бизнеса. Я, честно говоря, не уверен, имеет ли это смысл в долгосрочной перспективе, хотя, как ни больно, вероятно, имеет, но это выходит за рамки данной темы.
>Но если ваш случай использования соответствует идеальному (непотребительские LOB-приложения в существующем магазине C#, имо), сантехника для MAUI существует уже давно и, вероятно, будет в порядке. Если вам нужно, чтобы MSFT использовала его прежде, чем вы сможете, вам следует двигаться дальше.
>Не стоит ожидать, что Microsoft когда-либо будет использовать MAUI внутри компании. Я даже готов поспорить, что они никогда не создадут серьезный продукт на Blazor. Выбор технологического стека, особенно фронтенда, делается не так, как в Dogfooding. Насколько я знаю, это полностью зависит от команды разработчиков, и, как и все в этой индустрии, большинство разработчиков больше знакомы с JS/TS, чем с чем-либо еще. Это не заговор и не алая буква на MAUI/Xamarin, это просто та же история о том, что JS/TS съедает все.
>В MSFT я наблюдал, как они взяли внутренний инструмент ML, который изначально был создан на C# для windows, полностью переписали с электронным фронт-эндом, чтобы сделать его кросс-платформенным. Я так и не увидел его релиза, который в итоге работал бы без тонны сбоев, но это не важно. Когда я спросил, почему команда не создала фронт-энд на Xamarin поверх существующей базы кода, они просто не имели понятия, о чем я говорю.
>Реальность такова, что если вы не докажете вышестоящему руководству, что расширение внутреннего использования или дальнейшее развитие фреймворка (созданного MSFT или иным образом) каким-то образом принесет больше расходов на Azure (это не так), у них нет стимула отдавать предпочтение этому стеку перед любым другим. И без реальных усилий по продвижению на рынок и продвижению этих фронтенд-фреймворков на фоне доминирования JS/TS, они будут продолжаться так же, как они продолжались годами - просто еще одна абстракция пользовательского интерфейса, увядающая на лозе, поддерживаемая все более скелетными командами компаний, которые исторически использовали C#. И как бы унизительно это ни было для тех из нас, кто потратил значительную часть своей карьеры на веру в них, в краткосрочной перспективе это имеет смысл для бизнеса. Я, честно говоря, не уверен, имеет ли это смысл в долгосрочной перспективе, хотя, как ни больно, вероятно, имеет, но это выходит за рамки данной темы.
>Но если ваш случай использования соответствует идеальному (непотребительские LOB-приложения в существующем магазине C#, имо), сантехника для MAUI существует уже давно и, вероятно, будет в порядке. Если вам нужно, чтобы MSFT использовала его прежде, чем вы сможете, вам следует двигаться дальше.
Всё равно много конкретики которую надо знать, какая-никакая кривая обучения будет.
Хотел проект на него перевести, единственное что сдерживало это отсутствие датагрида.
Вот я с помощью одного приложения запускаю другое и оно норм уходит под кат первого. Но затем я во втором запускаю окно и теперь втрое приложение полностью становится отдельным процессом в глазах диспетчера задач.
Я знаю что окна работают в отдельных процессах, типа [STAThread], но ведь когда я в рамках одного приложения запускаю несколько окон, они считаются частью одной группы.
Я пытался установить owner окну и все норм, кроме отображения в диспетчере задач.
сейчас я делаю пикрелейтед(сравниваю версию длл) и это вроде работает, но проблема в том что есть пачка длл с одинаковыми .Name
как их различать?
можно ли попробовать через Type.GetType? если, допустим, есть определенный Type, то значит длл точно есть?
ну как минимум неудобно, что для компиляции под макось нужна сама макось. Что разительно отличается от подхода с авалонией
> (s, e) => { if (s is Button b) if (b.Parent is MyForm f) f.Close(ModalResult.OK); };
> Почему майки не могут придти к единому стандарту?
Давай сделаем наш уи-тулкит, который объединит их все!
...спустя полгода:
> Wpf, uwp, win ui3, maui, НашОхуетьКакойТулкит, сука блять, что это за зоопарк?
Ну просто реально цирк же. Особенно uwp говно без задач, которое оказалось никому не нужно. Почему нельзя было просто обновить wpf?
Замени if на &&, и тебе должна выскочит подсказка о новом синтаксисе, забыл название, увы.
Макось не нужна, лучше бы линкс запилили. Пока он на уровне любительского проекта с туманными перспективами.
wpf только десктоп, uwp не взлетел из-за уёбищности платформы, maui это мобилки продолжение xamarin.
Я думал, что надо называть по разному и простарнства имен делать по возможности разынми, чтобы не было конфликтов.
Если ты долбоёб подписался лямбдой и спрашиваешь почему тебе не дают отписаться АНОНИМНЫМ методом (если не понял, он по определеню одноразовый), медицина тут бессильна...
Токент тебе тоже надо где-то хранить, так что если нужна отписка делай именной метод.
>...спустя полгода:
> Wpf, uwp, win ui3, maui, НашОхуетьКакойТулкит, сука блять, что это за зоопарк?
Потому что желание противоречит реальному положению дел.
Любой, кто пытался запилить "универсальную функцию" понимает о чем я пишу. Это просто не реально. Вся эта универсальность приводит к утяжелению и малой производительности.
Задумывают всё это "эффективные менеджеры", а исполнители практикой доказывают, что это в общем-то невозможно. Имеем что имеем.
А что это за кнопка Б такая и где она находится?
> Вся эта универсальность приводит к утяжелению и малой производительности.
Кроме МВВМ, МВВМ - это исключение из правила. Она совсем чуть чуть снижает производительность, зато ты всегда можешь сменить фронт. Тебе нужно только новые вьюшки на новом фронтенде написать, а всё остальное у тебя уже есть. Начал на ВПФ, понадобился линукс - дописал вьюшки на авалонии, собрал, раздал красноглазым.
Бамп вопросом
Что эт за хрень-то? Поясните.
дебилушка опять выходит на связь?
> почему тебе не дают отписаться АНОНИМНЫМ методом
где я сказал что не дает?
Я сказал, что если тебе нужно отписаться сразу после получения события (одноразовое получение), то тебе нужно городить огород.
>так что если нужна отписка делай именной метод
покажи мне мастер класс как с помощью ИМЕННОГО МЕТОДА делается отписка в обработчике события.
то есть подписываешься (обычно на локальный объект) и после первого получения события отписываешься. А мы посмотреть.
>Токент тебе тоже надо где-то хранить
Достоинства одного подхода - недостатки другого. Такова жизнь.
Единственное удобство делегатной отписки - можно не хранить ничего и вызвать потом из Dispose (правда это является и недостатком). Да и не не относится к локальным объектам подписки
Ну а неудобства перекрывают удобства.
Нужно постоянно писать код с оглядкой на "не забыть отписаться", ведь можно ("сделали 10 подписок - сделали 10 отписок", а потом "ой одну забыли".)
Даже вот WPF написали с оглядкой на weak events ибо не нашли нормального способа дать возможность кодеру нормально отписываться.
И все MVVM фреймворки основаны на weak events
чет как то решили они проблему отписок путем "не будем вообще использовать обычные event где нужно подписываться" )))
Польза токенов - ну их можно, ДА, куда то сложить и потом разом все диспознуть. Решение проблемы "сделали 10 подписок - сделали 10 отписок". Конечно и токен можно забыть сохранить для диспоза, но тут на сцену выходит lifetime - там не забудешь и токены собственно не нужны. Но даже токены лучше того что есть.
Про многопоток разумеется обсуждать не будем - там все плохо, но можно сказать, что "у меня формсы какой еще многопоток". так что только про подписки.
блин очепятался во многих местах
>обычные event где нужно подписываться
читать как "обычные event где нужно отписываться"
lock (balanceLock)
{
}
Зачем нужен locker ?
Пишут что
>При синхронизации доступа потоков к общему ресурсу блокируйте выделенный экземпляр объекта (например, private readonly object balanceLock = new object();) или другой экземпляр, который, скорее всего, не будет использоваться как объект блокировки другими частями кода.
1лок-1обжкт.
Но почему не сделать бы lock () так?
Что еще можно класть и делать с lock ()?
>(s, e) => { if (s is Button b) if (b.Parent is MyForm f) f.Close(ModalResult.OK); };
(s, e) => ((s as Button)?.Parent as MyForm)?.Close(ModalResult.Ok)
В теории конечно
конструкция lock это синтаксический сахар над монитором. Зачем нужен объект и что ещё можно делать можешь тут почитать https://docs.microsoft.com/ru-ru/dotnet/api/system.threading.monitor?view=net-6.0
Спасиб, не сильно красивше, канешн, но хотя бы чуток короче.
очевидно потому что "оно было раньше"
ньютон был до пришествия текст.жсона. перегружен фичами.
Кому нужна была скорость - было на выбор куча вариантов (некоторые из которых по скорость/потребление памяти дают пососать и текст.жсону)
Потом вышел текст.жсон но
а) он поддерживает только часть фич и переводить неудобно
б) также слепили свое JsonPropertyName вместо родных аттрутов из компонент модел. Причана вроде бы - не хотим тянуть за собой сборку с этим аттрибутом чтобы всякие блазоры
не перегружать весом)
так что щас текст.жсон он находится в середине крайностей "фичи" и "скорость/память"
та же ситуация и с sqlite
class A{
int id
string name
int? money (нуллабл окда)
}
У мня есть два списка:
List<A> spisok1 и List<A> spisok 2
Я делаю
var leftOuterJoin =
from s1 in spisok1
join s2 in spisok2 on s1.Id equals s2.Id into temp
from s2in temp.DefaultIfEmpty()
select new
{
Id = s1.Id,
Name = s1.name,
Money = ???????
};
Так вот- в этом Money = ??????? я хочу получить меньшее из s1.Money и s2.Money. А идеально получить - меньшее, либо то которое не нулл, либо нулл если оба нулл
Ничего умнее чем сделать метод который это все чекает, не придумал.
Мб помидоры придут подскажут че.
Money = (s1.Money.HasValue, s2.Money.HasValue) switch {
(true, true) => Math.Min(s1.Money.Value, s2.Money.Value),
(true, false) => s1.Money,
(false, true) => s2.Money,
(false, false) => null
}
Поставил бы лайк если бы смог.
нее у человека который те дллки написал все в этом плане типтоп, это я макака сбоку.
вот такое вымучил.
используется только один раз за всю жизнь программы, если type найден его же и использую, если нет то логика другая будет. вроде бы работает.
за такое не бьют палками?
Потому что мы заняты работой а ты сидишь срёшь на двачах
С тем, что руби - говно, согласны и шарперы, и жабисты, и петухонщики, и жопаскриптеры.
Как об этом узнать, не заглядывая в код метода? Можно это как-то задокументировать?
Не-не, что-то вроде пикрелейтейда. Если не смотреть в код Class.Check, то как узнать, что он вернул не CheckResult, а NegativeResult?
Понятно, что можно сделать .GetType(), можно через is и as, а как-то иначе? Задокументировать это как-то можно? Я смотрел xml документирование, но, если я правильно понял, <returns>description</returns> предлагает просто описать смысл возвращаемого и всё, тэгов для типов нет.
Кроссплатформенного ГУИ на шарпе никогда не будет.
Нужен кроссплатформенный ГУИ - бери Qt, electron, awt/swing + flatlaf, compose multiplatform.
А вообще десктоп гуи сейчас очень мало кому нужен (а тем более кроссплатформенный). Если он вам нужен, то лучше подумать еще несколько раз, так как веб хуйню в разы проще запилить.
Почему, технически вроде не сложно. Остальные фреймворки слишком маргинальные, нецелесообразно тратить ресурсы на их освоение если будет поддержка от гиганта вроде МС, я надеялся что так будет в случае МАУИ.
>А вообще десктоп гуи сейчас очень мало кому нужен (а тем более кроссплатформенный)
Что за привычка всё мерять потребностями быдла которому кроме инсты в телефончике ничего не надо?
>десктоп гуи сейчас очень мало кому нужен
внезапно он нужен конечному пользователю.
но кто спрашивает конечного пользователя )
>>463369
сравнивать руби с шарпом нельзя - они вообще из разных миров.
Лично я когда то любил руби. НО задолбало писать как в блокноте - никогда не знаешь что в текущем классе у тебя есть. И высматривать глазами чужой код бесполезно - хер знает где и как расширен класс. Понятно, что если пишешь постоянно на руби, то проблемы нет, но если это не основной язык и просто не помнишь. Даже писал свой модуль, чтобы по бряку можно было видеть что через миксины напихали в объект.
В итоге свалил на питон - возможности магии приличны, но при этом сильный тайпхинтинг, да и генераторы мне ближе чем фиберы. Ну а количество готовых решений на все случаи жизни делает питон лидером в практичности. У руби же ниша - ROR
Ну а сейчас есть котлин, где тебе и статическая типизация (жаль что по жавовски конечно) и богатая поддержка возможностей лепить DSL
Всё збс, но вот здесь
> Math.Min(s1.Money.Value, s2.Money.Value)
выдаёт предупреждения, что значения могут быть нулль. Я умом-то понимаю, что конкретно в этом месте шаблона - не могут, но как это конпелятору обеснить?
Впрочем разобрался, книга передается по ссылке. Честно говоря до сих пор не могу к этому привыкнуть. В крестах тех же всё явно обозначается.
После руби жрать жабью инфраструктуру (даже через котлин), это как после торта есть недельный черствый хлеб.
А так из тебя сыпятся шаблонные мантры из ютуба, что ставит твое мнение не выше плинтуса. питон то еще костыльное говно
Пасиб. Вот теперь заебись.
ты чет попутал дядя
я руби заменил питоном.
А также дополнительно упомянул что "выражаться затейливо" и "плодить нативные DSL" могут и языки со стат типизацией - например котлин.
>питон то еще костыльное говно
ясно все с тобой. но тред не про питон и не про руби, поэтому раскрывать твое дурацкое заявление не попрошу
(null-forgiving) operator
Почему я все время слышу, какой шарп охуенный, быстрый, удобный, фичастый, но на нем ничего из сильно крупного не пишется?
Только сами майкрасофты и пихают свое поделие в какой-нибудь бинг. Остальным крупным игрокам похуй. Будут держать код на джаве, будут начинать новые проекты, будут делать высоконагруженные сервисы, писать инфраструктуру на го, на джаве, но не на шарпе.
Почему так? Или я не прав?
Слит.
Мелкомягкие тащемта просто долбоебы, разгадка проста
Раньше: зачем нужен сырой аналог жабы только под шиндовс, когда есть проверенный кроссплатформенный обратносовместимый инструмент?
Теперь: нахуй нам вообще задумываться об использовании мелкомягкого кала, когда есть ГОвно или проверенная жаба
Вот и все, вы успешно проебали рынок
в ГОвно больше пиара нежели мощи. Всякую мелочь писать сойдет, но серьезное замахаешься.
Крупные игроки не хотят зависеть от вендора. Почему С++ может быть в гугле, а шарп не будет там никогда. С++ имеет комитет и стандарт, ты не зависишь не от кого (свой компилятор налапатишь если надо). Так же, когда гугл высрет свой карбон, кроме гугла никто не будет его юзать (из крупных игроков). Потому что никто не хочет завязнуть на чужом продукте, особенно когда могут сделать сами свой.
В тоже время мягкие показывают, что они делают именно продукт. Например студия частично написана на шарпе, что как бы показывает - мы используем шарп во флагманском продукте и тем самым показывая какие-то гарантии. А вот если взять котлин, то мы видим что за 6 лет не один флагманский проект не был переписан на него и тут сразу ловишь себя на мысли, если они не рискуют, то почему я должен рисковать своим продуктом?
Что касается джавы, то саны, перед тем как слохнупнуться, сделали жабу попенсорс и чем спасли бизнес, который в жабу вляпался. Поэтому до сих пор все идет по инерции, но сама жаба не развивается и протухает. Лишь благодаря мобильниками и натянутым на глобус конференциям ты еще не проводишь параллель между джавой и коболом. Забавно, котлин топит в мобильниках джаву, джава топит котлин за собой весь JVM
Говно не вывозит многолетние проекты. Фанатики, конечно, могут писать на чем угодно и сколько угодно, но все что кроме круда в го вызывает анальный зуд (это просто какой-то перманентный бойлерплейт).
У жабы настолько протухшая тырпрайзная экосистема, которая вообще никак не оптимизированная, что надо быть немного странным чтобы стартовать на этом новые проекты. Собственном на этом го скорее всего и выстрелил, сойдет даже говно, лишь бы снова на жабе не писать сама жаба проста и быстра, но не слоенный, не оптимизированный тырпрайз
>но на нем ничего из сильно крупного не пишется?
Что именно ты подразумеваешь под "сильно крупно"?
> котлин
> котлин
> жаба
> го
Вы чо охуели блять? Создайте тред котлина и сидите там.
Что такое котлин? Котлин это
> function GoFuckYourSelf(HowFuck: TObject) : TFuckStyle;
> var
> TempFuck : TObject
> begin
> TempFuck := HowFuck;
> result := CreateFuckStyle(TempFuck);
> end;
Нравится?
В реальности если у него нет детей ничего не вылезает, а в тестах оно выскакивает с визгами что "nullable oobject must have a value"
ПОЧЕМУ??????
>Говно не вывозит многолетние проекты
Понимаешь ли, затс джаст лайк, юр опинион, мэн. А крупные игроки просто берут и используют говно, в бэке, в многолетних проектах.
Кроме самих гуглов, говно используют те же майки, нетфликс, пэйпал, клаудфлейр, убер и т. д., а шарп - нет, кроме самих же создателей.
Тебе и сказали что это круд микросервисы, которые переписать дешевле чем новую команду собрать.
Сегодня там микра на го, завтра на жопоскрипте. Тут как раз бизнесу и насрать, лишь бы гребцы были.
Шарп второй язык в вебе, как среди общего числа, так и среди миллионников, естественно его используют многие, кроме твоим манямирков, конечно.
Linq будет транслироваться в sql, если мы, конечно, не о linq to objects говорим. Нужно уметь читать запросы, в которые он транслируется, понимать как они будут исполняться, как работает база и т.д. Как можно их оптимизировать. Частенько для части запросов приходится выкидывать нахер тот же EF, и ебашить запросы ручками (ну или Dapper'ом), иначе с производительностью все печально будет.
>это круд микросервисы, которые переписать дешевле чем новую команду собрать
>Сегодня там микра на го, завтра на жопоскрипте
Очередная мантра про "ряя тока микросервисы!!" Мань, там на оф. сайте го есть кейс стадиз, компании рассказывают о том, как используют го. Посмотри на их круды и микросервисы, лол. Ну не позорься ты так, не рвись, твой манямирок же можно разбить одной ссылочкой на сайт го.
>Шарп второй язык в вебе, как среди общего числа, так и среди миллионников, естественно его используют многие
Многие-то многие, только мы про крупных игроков уровня фаанга говорим. Перечитай пост, с которого обуждение началось. И иди проспись.
Щито поделать, никогда шарпа (за пределами мелкомягких) уже не будет в крупнейших передовых компаниях, лидерах в своей отрасли. Ява - есть, го - есть и его будет еще больше, шарп - нет.
Зато лавочка ашота на 900.000 месте написана на шарпе, это да, этого не отнять. Но не нетфликсы и клаудфлейры, увы и ах.
>Шарп второй язык в вебе,
>как среди общего числа (количества),
>так и среди сайтов миллиоников (качества)
Но жопочтец продолжает писать
>Кококо кроме мягких негде используется
>Шарп второй язык в вебе,
>как среди общего числа (количества),
>так и среди сайтов миллиоников (качества)
Но жопочтец продолжает писать
>Кококо кроме мягких негде используется
в том что ReadOnly не имеет методов для изменения, но не гарантирует, что кто-то другой не имеет у себя возможность менять объект.
То есть еслиу тебя IReadOnlyList, то нельзя думать, что список неизменен - у кого то этот же список может быть как IList и он его будет менять.
Immutable же гарантирует неизменность.
>Говно не вывозит многолетние проекты
Тащем-то на го я вижу кучу популярного опенсорса вроде докера, кубера, опеншифта, терраформа, консула, кокроача, которому уже немало лет.
На шарпе так нихуя опенсорсного и не написали, кстати, ну или написали, но оно умерло(.
а ты задай себе вопрос - почему твой список не написали на жаве например? ладно шарп, он как бы ничто
жаву почему не взяли?
Не, в крупные конторы аля фаанги шарп не завезли, от того и инфры на шарпе нет, как нет и экспертизы в дотнете. Пока крупняк не начнет массово использовать шарп, то шарп так и останется технологией для небольшого бекенда в маленьких аутсорс конторках, либо в госсекторе с формочками.
>>463979
>котлин, то мы видим что за 6 лет не один флагманский проект не был переписан на него
Часть кода IDEA написана на котлине, так что флагманский проект jb вполне использует свой же язык.
За пруфами вот сюда https://github.com/JetBrains/intellij-community
Тебя укусил делфист и ты уже языков не различаешь
зеленка тебе поможет.
>>464613
>Часть кода IDEA написана на котлине
я мимокрок но это не аргумент. Переписана с жавы на котлин.
Это ДАЛЕКО НЕ ТО ЖЕ САМОЕ как переписать с любого постороннего языка
Даже студия, в которой я пишу на котлин при вставке кода на жаве тупо конвертит ее в котлин, а дальше только причесать
Инвалид, ты опять выходишь на связь?
Нет бы устроится разработчиком, и стать полезным, ты как аутист лазаешь по всеи этим тредам? Зачем?
Иди лучше бампай тухлый тред раста.
В целях безопасности в асп выпилили идентифицирующие хедеры, и новые проекты перестали попадать в список. Рост жабы, тут как раз из-за падения пхп и шарпа.
>почему твой список не написали на жаве например
Наверное жаба для других задач больше подходит, и вообще причем тут она?
Ну а вообще докер изначально был написан на питоне, только спустя время его на гоху переписали. Кубер изначально создавался в гугле, где его изначально на го начали писать, что в целом ожидаемо.
Вообще всякие задачи контейнеризации-виртуализации было бы странно решать используя жабу.
Потому что ORM не нужны, когда можно писать сразу на нативном SQL.
>я мимокрок но это не аргумент
Ну там выше шизик рассказывал, что студию частично переписали на шарп, я привел как аргумент, что идею тоже частично переписали на котлин. Да, переход C++ -> C# и Java -> Kotlin намного различается по сложности, но мы же не про сложность перехода говорим?
А так на котлине сейчас весь андроид держится, там уж точно много чего было переписано.
Еще один жопочтец, тебе не сказали нельзя, а сказали что оверхедно.
Можно написать и на С++ это все, но тебе мальчику выращенному ютубом сражу покажется это накладным, так же и здесь можно рогом упереться и написать на бойлерплейтах, но ну его нафиг.
>Наверное жаба для других задач больше подходит,
>и вообще причем тут она?
а причем тут тогда шарп? жава находится даже в более выгодной позиции, ведь за ней не тянется предание "не умеет в кроссплатформенность да и вообще злой мелкософт может сделать кусь. апасна"
> задачи контейнеризации-виртуализации было бы странно решать используя жабу.
С шарпом та же история, но тебя это чет не смутило.
>>464632
>мы же не про сложность перехода говорим?
нет. мы именно про нее и говорим. Берем сложный проект и переписываем его на го допустим. Можем переписать? да даже на батниках можно писать и на синклер бейсике. Вопрос в том сколько это времени займет.
А переход жава - котлин занимает....нисколько.
Ну жаба так-то раньше еще стала популярна, ну и развитие в ней тоже было, 7 и 8 жаба при оракле вышла так-то.
>тебя это чет не смутило
А почему должно было смутить? Изначально речь шла о том, что го кроме как для крудов, бесполезен, однако это не так и на нем много долгоживущих проектов написано, в отличие от шарпа, где опенсорса не видно и не слышно.
Про контейнеризацию, вирутализацию и жабу уже другой разговор.
Второй по популярности язык в вебе, но жаба макака все еще маневрирует фразами "а вот этой компании его нет, значит его нет вообще нигде".
Иди уже.
>Часть кода IDEA написана на котлине
Показывает нам бесплатный продукт и тот только частично на котлине. Вот когда идею на котлин перепишут, тогда на твой котлин и начнем смотреть как на продукт слишком гладо про интероп стилили. Сами не рискуют переписывают свои продукты, а мы должны.
>тебе не сказали нельзя, а сказали что оверхедно
Оверхедно это анальный зуд при написании проектов-долгожителей на го или ты про оверхед в шарпе? Нихуя не понял.
>>464638
Жаба не имеет никакого отношения к тому, что существуют крупный популярный опенсорс на го.
>>464638
>мы именно про нее и говорим
Ты говорил про переписывание флагманского продукта на свой язык. Jb переписали часть идеи на котлин, и новые фичи тоже в основном на котлине пишутся, так что флагманский продукт вполне успешно использует язык компании.
изначально (и всегда) речь шла о том, что go это бойлерплейт язык. И чем больше проект, тем больше кодирования.
Поэтому для мелочи оно удобно ведь пока начинает бесить это - уже все написал.
>>464646
>Жаба не имеет никакого отношения к тому
верно. как и шарп не имеет отношения
ты привел список из которого негласно следует вопрос
"а где ТАКОЕ ЖЕ на шарпе". А где ТАКОЕ ЖЕ на жаве?
у шарпа своя ниша - почему вдруг продукт должен оперсонсным и вообще орать на каждом углу что он шарп?
Типичная "ошибка выжившего"
ps: да (цензура) форма поста. какой макака ее разрабатывал, пишешь текст вслепую
>жаба макака
Я вообще никак с жабой не связан.
>>464645
>Показывает нам бесплатный продукт и тот только частично на котлине. Вот когда идею на котлин перепишут
????
Я тебе скинул репозиторий идеи, которая действительно частично на котлине написана, как и студия частично на сишарпе. В чем причина подрыва?
>А где ТАКОЕ ЖЕ на жаве
Почему на жаве должен быть написан докер? Но если тебе интересно, то как минимум на жаве есть другие крупные опенсорс проекты - кафка, эластик, хадуп, зукипер + написаны бд вроде кассандры и H2.
А разговор шел про то, что на го все-таки есть крупный опенсорс, который долго живет. А на шарпе его не видно. Вот и все. На жабе опенсорс как видишь тоже есть.
>Почему на жаве должен быть написан докер?
не должен
только вот зачем забывать про применимость языка и ставить в пример проекты где "какой то язык применим"
У кого то есть время! и желание! (и необходимость) писать на бойлерплейт языке, да еще делать это опенсорс
но не у всех же такая необходимость
Возьмем для примера gitlab. Вот есть gitea - там "православный go" но чет не отправляет на свалку истории она гитлаб написанный на "ужасном богомерзком руби" с дикими тормозам и потреблением памяи. Как так? ведь go же
жаба и опенсорс это нечесна учитывая что шарп как кроссплатформа очень молодой
А по поводу "не видать" так
1 а зачем оно должно быть видно. вот у нас шарп - снаружи не видать. На антиплагиате шарп - снаружи не видать. На стекоферфлоу шарп - снаружи не видать. Знаешь об этом только потому разрабы не поленились опубликовать эту инфу
2 триггер "фатальный недостаток" действует не на всех. И чем больше приложение, тем меньше действует.
>жаба и опенсорс это нечесна
А кто говорит о честности? Выше был пост, где было явно сказано, что MS просрали свое время и очухались слишком поздно. Как бы сами разработчики платформы и их хозяева проебались.
>>464665
>антиплагиате шарп - снаружи не видать. На стекоферфлоу шарп - снаружи не видать
Это не опенсорсные проекты. И другие разработчики по всему миру не пользуются трудом инженеров стаковерфлоу или антиплагиата. А докером и кубером пользуются. Кафкой и эластиком пользуются.
>А докером и кубером пользуются.
>Кафкой и эластиком пользуются.
фатальный недостаток
фатальный недостаток
фатальный недостаток
))))
>Как так? ведь go же
Наверное потому что гитлаб на руби нормально справляется со своими задачами?
но ведь go быстрее
собственно поэому и gitea стали писать
делов то - дописать до уровня гитлаба и перейти. какая проблема? ведь go же - на нем можно писать такой объемности вещи (бойлерплейтно,а потому дольше, но ведь можно же)))
тут кто то распинался что сменить язык изи и вообще go это ня ибо вон на нем есть. Так почему бы gitea который пишется на супер языке просто не вырасти и не выбросить гитлаб. что мешает? (вопрос риторический)
>фатальный недостаток
>>464676
>фатальный недостаток
Не понял нихуя, что ты имеешь в виду.
>>464679
>просто не вырасти и не выбросить гитлаб. что мешает?
Потому что гитлаб первым (а точнее вторым) захватил рынок, а gitea мало чего нового предлагает? Точно так же как и жабой-шарпом. Вроде бы шарп охуенный язык, но из новшеств только сахар, поэтому люди дальше на жабе сидят и не хотят с нее переходить на шарп.
фатальный недостаток это когда пишешь свой велосипед потому что не хочешь платить за то что есть или "написано не тобой" (с) мелкие
>докером и кубером пользуются
>Кафкой и эластиком пользуются.
вот они есть и работают. зачем их переписывать? незачем.
Можно родить другой продукт. но какой? Ну придумай такое - раз, запрограммируй опенсорс, то есть за свой счет - два и чтобы это было всем нужное (то есть не было альтернатив и оно захватило место (как гитлаб ниже)).
>Потому что гитлаб первым (а точнее вторым) захватил рынок
как и упомянутые тобой продукты. Шарп очень молодой в своей новой форме, чтобы от него ожидать что будет много чего то, чего раньше не было и всем нужно.
До сих пор тянется плохая слава прошлых лет.
к тому же опенсорс не требующий доп рантаймов как бы в более выигрышной позиции.
>gitea мало чего нового предлагает?
наглядный пример "мощи" go - получаешь быстрый код, но кодишь дольше, намного дольше (если сравнивать с руби)
(я на питоне пишу на порядок быстрее, чем на шарпе)
>поэтому люди дальше на жабе сидят
ну жависты особый народ. они закостенелые. их все устраивает. А кого не устраивает - ну те изучают котлин. А шарп то им зачем.
Тебе сказали, что бесплатная приблуда не годиться в противовес продукта аля студия, где она полностью, почти на шарпе.
Нахера ты продолжаешь натягивать манямир? У них был полный интероп и время, чтобы показать котлин как продукт, ценой рисков своего продукта. давай, задай этот же вопрос в третий раз
>крупные опенсорс проекты - кафка, эластик, хадуп, зукипер + написаны бд вроде кассандры и H2.
Какое-то тырпрайзное говно вы жрете, месье, я лично ожидаю от го или котлина продуктов в виде таркова, раста или геншина импакт.
Я уверен что все эти базворды пишутся максимум за месяц, как и все тырпрайзное, оверпразное, не оптимизированное говно (не алгоритмами славится тырпрайз, а умением наслоить тонну говна поверх говна, программистами студентами из индии).
Тебя какой-то инвалид так сильно проткнул, что ты теперь его везде детектишь? Зашивайся, братик)
Go: докер, кубер, опеншифт, терраформ, консул, таракан и т. д. Инфраструктура, высоконагруженный многолетний бэкэнд в крупнейших компаниях мира.
C#: Эээ... Ну..... Инфра-.. Эм-м.. Ну, это.. Майкрасофт, да.. Студия.. Да не успели просто, а крупные компании специально в штаны насрали, бойкотируют.... Зато мы по популярности в мелком бэкэнде с крудами и формочками на втором месте, после такого гиганта бэкэнда, как ПХП. Да-а...
)
Думаю и так понятно что это. Но суть - да. Помечать сервисы атрибутом и потом просто что-то в духе services.AddServicesFromAssembly();
Какие могут быть подводные камни?
Просто вот лично меня уже долюбило, что я тупо забываю добавить какой-то сервис. Бесит. Как аутист - проверяешь в рантайме, что не упадет когда до нужного сервиса дело дойдет.
Типа я понимаю, что вооот, ты это привязал к магическому атрибуту, вооот. да. На что у меня ответ - не нужно не пользуйся. Но вот мне с забывчивостью - оно бы оч пригодилось.
Ну и да, я понимаю что всратенько оно смотрится. Но это опять же не суть.
Но я могу чего-то не знать. Типа возможно майки по каким-то рациональным причинам такую штуку сами не запилили.
не в тему, но я один считаю синтаксис голанга крайне уебанским? я его увидел случайно и подумал что никогда бы не смог писать чисто из-за синтаксиса. так у меня и с C++, и с питоном, и с пхп. Вот у C# супер-приятный синтаксис, писать на нем одно удовольствие. А у вас какое мнение?
Если у тебя несколько сервисов, которые реализуют один интерфейс, то при необходимости замены в DI одной его реализации на другую при таком подходе ты будешь страдать.
Плюс, ты банально по всей кодовой базе размазывает конфигурацию DI.
Мне нравится синтаксис щарпа. Приятный. Во многом - лучший в плане код-экспириенса.
Но с другой стороны - некоторых моментов с жавы не хватает. Плюс - у жавы вариативность всяких решений. Типа вот нужно мне байтоебить и пилить какой-то там сервер на HTTP'шный - я могу взять Netty, могу Mina. И то и другое - охуенно.
В шарпе - я хочу побайтоебить сервер. Ну, кхм, ну вот тебе TCPListener и NetworkStream - развлекайся.
Типа я к чему. Язык - охуенный. Но то что большая часть всего завязана на майков - удручает. А оно будет завязано, потому что майки - владельнцы и завтра они решат все сломать - и проект который ты на шарпе для комунити делал - придется переписывать или оставаться на текущей версии. Короче, такое себе. В жаве оно хотя бы если ломаем, то ломаем предупредив и дав время на переход.
> Если у тебя несколько сервисов, которые реализуют один интерфейс, то при необходимости замены в DI одной его реализации на другую при таком подходе ты будешь страдать.
Это кстати да, хороший аргумент.
Другое дело, что за всю мою недолгую карьеру, я крайне мало видел реальных случаев имплементации одного интерфейса несколькими сервисами не в целях тестирования.
Тип даже звучит странно, вот я делаю две реализации одного интерфейса-сервиса.
Разве что этот сервис - это некая инфраструктурная хренотень, типо эвентбассов и подобного и мы условно хотим от кролика абстрагироваться. Но их-то и не обязательно таким макаром внедрять.
>Плюс, ты банально по всей кодовой базе размазывает конфигурацию DI.
Ну не знаю. Вот конфигурирование роутов - тоже мы размазываем по всей кодовой базе. Чет я мало видел ИРЛ примеров, чтобы кто-то в одном месте все прописал руками, какие методы дергать.
То есть у жавы можно брать сторонние либы, а в шарпе нельзя? ну ну.
не завязано. Наоборот даже - ориентированность "что нужно бери стороннюю либу с нюгета" и отличает шарп
Мне жависты постоянно тыкают мол у вас того и этого нет из коробки.
И тут приходишь ты и все перевернул )
Ну, роуты штука жёстко привязанная к контроллерам. Контроллеры у тебя обычно лежат в одной папке и где их искать ты всегда знаешь. Сервисы же у тебя могут по куче мест быть раскиданы, и в случае чего, тебе придется использование этих аттрибутов по всему проекту искать.
Плюс, не знаю как у вас, а мы обычно очень жёстко пилим приложение по слоям на проекты (отдельно Domain, отдельно ApplicationServices, отдельно Infrastructure, отдельно непосредственно сам Web/Grpc Api) и стараемся, банально, чтобы инфраструктура не протекала в бизнес логику. Это же лютая завязка всех компонентов приложения на конкретную деталь реслизации, такую как DI контейнер. Банально, если ты захочешь написать консольную утилиту, которая использует сервисы из проекта с ApplicationServices, то придется и в нее так или иначе тянуть DI.
>Плюс - у жавы вариативность всяких решений
В шарпе все выходит на уровень стандартов и это круто, не нужно знать 100500 ORM или http серверов.
На самом деле это все восприятие от евангелистов с ютуба, реальность жабы куда страшнее. Тебе кажется что кругом разнообразие, но как только сделаешь шаг в сторону от топ либ (того же магического тормозного спринга), сразу такую кучу говна хлебнешь. Ты не поверишь, но даже в пхп дела куда лучше обстоят (я сам говна навернул, когда с пхп на жабу ливнул), попенсорс та еще обманка, куда лучше когда софт тебе пишет и сопровождает такая софтерная компания как майкрософт (ну или гугл или еще кто), чем кустари на коленке, делают то что надо их спонсору, или куда страшнее от скуки.
Жаба реально вывозит на своем звездеже, но на деле она уже близка к судьбе кобола. Хз покорит ли шарп мир, но блин точно сейчас не нужно лесть в jvm мир. Да и все равно сейчас проще нанять за твою зп пятерых индусов, чем держать такого мидла как ты.
>я могу взять Netty, могу Mina
Потому что тупо ненужно. Ну вот серьезно, ты слезаешь с протокола хттп и с разу попадаешь на tcp/ip, что тебе еще нужно кроме как ручками этот TCP поюзать?? Ну дал тебе нетти пайплайн и что? За то теперь любой затык и ты часами сидишь куришь сорцы/маны на тему как это там работает, хотя этот пайплайн, если надо, написал сам бы за час.
Это очередная прмблуда, которую можно "продать" в тырпрайзном мире, но решает она куда меньше чем на самом деле нужно. да и вроде в шарпах клонировали этот твой нетти и как видишь не прижился
В общем, хватит жрать жырную и вредную пищу джавы, переходи на здоровое практичное программирование.
> фатальный недостаток
https://neolurk.org/wiki/Фатальный_недостаток
> Не понял нихуя
https://ru.wikipedia.org/wiki/Синдром_неприятия_чужой_разработки
Ты про репозиторий со скриптами миграции? Что там сложного, кладёшь их под Git, и всё.
Как убедиться или как проверить, что я нигде не забыл вернуть в все взятые напрокат массивы, и утечек памяти нет?
Где взять побырому IEqualityComparer<char> для такого случая?
Никак наверное. Всегда можно забыть.
Ну можешь анализатор написать проверяющий что если взяли в методе то в методе и вернули (и вернули без условий)
Можешь взять за правило использовать MemoryPool<T> и using
(и проверять анализатором его)
Есть ли такой готовый анализатор - хз
Обернуть этот арейпулл в IDisposable хуйнюшку и в диспозе - возвращать. Тебе студия будет подсвечивать, что ты забыл задиспозить что-то.
> IDisposable хуйнюшку и в диспозе - возвращать
это уже есть. MemoryPool
>Тебе студия будет подсвечивать, что ты забыл задиспозить что-то
С чего ей это делать? Откуда ей то знать где именно нужно вызывать Dispose и нужно ли. Это даже кодер не знает
Есть ли хоть какой-нибудь вариант их в функцию передать или специальный контейнер закинуть, чтобы можно было в одну строчку потом от всех отписаться в нужном мне объекте? Вариант с двумя лямбдами в которых будет делатьсч подписка и отписка мне не подходит.
Или это ток кастомными реализациями обсервер паттерна делают?
Просто бля странно, что вроде бы это целая фича языка, а на практике не очень юзабельна...
Если у тебя создается IDisposable в скоупе - студия подсвечивает, что ты его не диспознул.
Если у тебя передается IDisposable в конструкторе - анализатор - дает предупреждение, что нужно диспозить.
ну покажи где студия это делает.
Моя студия с решарпером ничего подобного не делает
>в конструкторе - анализатор - дает предупреждение, что нужно диспозить.
это бредовый варнинг был бы. Впрочем не вижу варнингов. Студии абсолютно плевать, хоть все IDisposable утыкай
именно так. Только кастомная реализация может дать требование передать ей lifetime и тем самым не дать возможность забыть.
В остальном же 2 ламбды. Ну а как иначе, если уже есть event и ничего ты с этим не сделаешь. Собственно и 2х ламбдовость не даст забыть сделать вторую ламбду. Но выглядит это коряво.
Использование ArrayPool часто подразумевает критичные к производительности места, когда нужен какой-то буфер промежуточный, и если он нужен маленький, то делается stackallock, а если большой - ArrayPool.Rent(). Эта логика либо оборачивается в ref struct'ы, либо в подобном контексте используется, поэтому явный IDisposable тут не применим. Хотя для шарпа IDisposable можно по утиному реализовать даже в ref struct'ах, и затем использовать using.
>>465578
Можно создать метод
int func(int a) {...}
и тогда то, что мы передадим, скопируется в локальную переменную a.
Можно создать метод
int func(ref int a) {...}
и тогда то, что мы передадим, просто получит другое имя
Если int func(in int a) {...}
то будет как в прошлом случае, но без возможности менять "a".
как сделать это, но с 1 случаем? Тоесть просто убрать возможность менять, но передать копированием?
> Можно передать в метод параметр с in, тогда это будет неизменяемая ссылка, а как сделать так, чтобы при передаче копированием тот параметр, куда я передал, был константным? Тоетсь как с in, но без передачи с ссылкой, а копированием?
Если я тебя правильно понял, то ты хочешь передать по ссылке что-то в метод, при этом быть уверенным, что переданное по ссылке - не изменится внутри метода.
Что-то типа плюсового void foo(const int* const some){}
Ну так вот. Такой фичи из коробки в шарпах нету. Для этого тебе нужно иммутабельность реализоваывать в случае использования классов. Можешь - использовать readonly struct и readonly record, если у тебя там нет особой логики.
Не забываем про базу https://isdotnetopen.com/
Если вам нравится быть шлюхой под хозяином и терпеть все его выходки и ожидать что в один момент у эффективных манагеров что-то переклюнит в башке и они обговномидаснят ваш проект то ожидайте и в страхе
НУ НЕ МОГУТ ЖЕ ОНИ!!1!1 ЭТО ЖЕ РАЗОЗЛИТ ВСЕ КОМУНИТИ!
могут, вы для них халявные рабы, произошла бизнес оптимизация
>хотрелоад
Кто-то пользуется этой парашей? Она же в 9 из 10 кейсов не работает, и требует пересборки и перезапуска.
https://youtu.be/3p9XUwIlhJg
Иди нахуй.
С дебагером сложно работать
Вон oz-code так и не пофиксили проблемы их расширения
А родной дебаг примитивный
Спасибо. Удивительно, что этого нет. Я думал это фишка шарпов постоянно что-то пилить новое, а тут такой базы не оказалось. Ты меня немного не понял, я спрашивал более экзотическую вещь, чисто ради интереса, а тут такое
Твоя хотелка лишена смысла
Запрещать менять копию - какой в этом смысл?
Понятно почему этого нет
Ведь смысла в этом нет
Вот тут интересно, маркетологи хотели прогнуть, но прогнули их. А вот в случае какого-нибудь Го, где комьюнити имели как хотели, никто даже не вспоминает. Какие же вы лицемерные, шизики.
Ну я и написал, что это экзотический вопрос, чисто ради интереса. А то что нельзя передать ссылочный объект в функцию и быть уверенным что инфа самого объекта из кучи не изменится это странно.
Смотрите чего придумал!
https://github.com/khellang/Scrutor
Или три строчки без с выгребанием по нейм конвеншену
Походу step - 1 преобразуется в инт, а в сигнатуре указано, что вторым параметром обязан быть байт
return pov(num, (byte) (step - 1) ); Можно без else
Я так делал уже: всё равно ломается. Вообще с else кажется более логичным, если ветвление if предполагает покрытые всех случаев алгоритма, а без него кажется более логичным, если if выполняет функцию опционального ответвления от алгоритма. Как то красивее так и логичней
> devexpress
Удивительно, как эта контора не наебнулась вслед за эмбаркадеро? Это какой-то привет из нулевых. Шли их нахуй. Юзай Авалонию!
> вам нравится быть шлюхой под хозяином и терпеть все его выходки
Не нравится, но блять, покажи мне другую платформу, в которой я смогу:
1. Одной командой в консолечке скачать и установить платформу, без ошибок, остановок или вываливающихся километров стектрейса.
2. Второй командой в консолечке создать новый проект.
3. Третьей командой в консолечке скомпилировать и запустить проект. Без. Ошибок. Остановок. И прочей хуйни.
4. Открываю проект в ИДЕ и без задней мысли пишу код. It just works.
Я тебе отвечу, нет, ни одного решения с таким простым порогом входа. Поэтому тебе встречный вопрос, почему твой хозяин не сделал тебе такую простую систему?
как это портировать на шарпы?
Так учи unreal и не используй unity.
>Если вам нравится быть шлюхой под хозяином и терпеть все его выходки
Будешь так кучеряво базарить, то анон сделает один звоночек дяде Биллу и тот купит твою маму, сдаст её в гарем по цене цветмета за кг. и станет на миллиард богаче.
>>466498
>если ветвление if предполагает покрытые всех случаев алгоритма
Если не if то это дефакто else тем более если ты в обоих случаях возвращаешь значение.
Какие нахуй хозяины, вы ебанулись?
Ряяя хазяен нам платформу диктует ((((
Ряяя хазяен на фичи языка диктует ((((
Ряяя хазяен процесорные инструкции нам диктует ((((
Ряяя клятые транзисторы хазяен диктует (((
Ряяя а че там только електроны бегают хачу на частицах кала вычислять ((((
Во время арифметических операций все приводится к инту (от меньшего к инту).
Выражение "byte - 1" возвращает int
(number, (byte)(step - 1))
Да не трясись ты. Анон заговорил о хозяевах, мы поддержим его перверсии. У меня проблем с этим нет. А ты чёго триггернулся?
Аноны, молю, дайте годный туториал по взаимодействию EF с Postgres'ом. Желательно чтоб был и code first и database first, и чтоб CRUD был по-человечески объяснен и как хранимые процедуры юзать.
Вот с Dapper'om вообще все просто и понятно, но глядя на вакансии, везде требуют EF.
А что толку от курса на торрентах? Нет живой связи с преподавателем. Ты сделал ДЗ, а его никто не проверил. Ты саму суть обучения упускаешь.
>Ты сделал ДЗ, а его никто не проверил.
Там обычно дз вообще не имеют ничего общего с реальным миром, ценность их нулевая, так как не откладывается ассоциация в голове.
Никогда их не делал, вкатился норм в айти.
Лучший ментор - это ковыряние в исходниках, а курсы это попил бобла ибо сфера слишком сложная чтобы уместить в один курс. Это равносильно пойти на курс хирурга, или зубного врача, где тебе расскажут про инструменты и дадут потыкать в лягушку.
А вот и ментор, у которого спиздили курс.
Ты заставил меня задуматься, но какая альтернатива для языка общего назначения? Жаба тухнет и там только веб, у го тоже веб, раст там на дне копашится. Какие альтернативы шарпу, если я хочу и веб писать и игры делать?
А вот и я! Вкатываюсь в тред, засранцы!
Бля, вот это действительно охуенно.
Если там еще и производительность 2Д рендера в нормальный вид привели (батчинг), то я даже сдую пыль со своих двух-годовалых проектов, чтобы поразвлекаться на досуге.
https://pastebin.com/dfnxbBjw
С ним всё нормально, но теперь мне нужен реверс, чтобы из нормального формата конвертило опять в этот всратый и у меня почему-то не получается, не то число выходит. Пробовал вот так
int.Parse(Color.Trim('#'), System.Globalization.NumberStyles.HexNumber)
И ещё более всратыми способами. Жопой чую, что это должно элементарно делаться, но туплю
Нет таких альтернатив, к сожалению. Как нет и технологий без проприетарщины. Даже иде все проприетарные.
Ясненько, я щас хочу подучить PostgreSQL и написать анолог магазина DNS. Спасибо
Бамп.
Нахуя мне сайт какого-то индуса с вредоносным по, когда есть божественный мсдн?
>обычная
this
>что запросы к SQL базе данных медленные
Всё не так страшно как кажется главное не использовать по 50 join'ов в запросе и для этого майки рекомендуют использовать для работы с БД\Файлами async await как я помню.
>запросы к SQL базе данных медленные, вот решил спросить
Запрос к нормализованным данным может быть медленным. Все зависит от того как это все нужно собрать в кучу
Для этого и используются индексы, а в некоторых случаях некоторая денормализация базы
Со всякими же JSON расширениями приходят и фишки NoSQL
редакторы с подсветками не любят длинные строки.
Хотя, нет. Спиздел.
Это aBGR.
Тебе по факту нужно просто нужно у полученной строки поменять местами символы отвечающие за R и B компоненты местами и потом полученную строку распарсить обратно в int через TryParse используя перегрузку с NumberStyles.HexNumber.
Правда alfa компоненту ты уже не получишь, т.к. она будет утеряна.
У меня вот испытательный срок в тырпрайз конторе, там этих сущностей таблиц миллион (первая работа) и я чёт пока так тяжело в них ориентируюсь. В коде вроде норм, а вот в связях этих всех пиздец
Челики просто не осилили разрешения конфликтов и дропнули?
Архитектурно, я повторяюсь, разные. Семантически, если убрать из имён интерфейсов букву И, наш страдалец получит то же самое, чего он там хотел:
> class Dvacher : Mammal, Male, Human, BurgerEater, ChairSitter, LifeDropper {}
семантически это тоже разные
то что дают интерфейсы можно трактовать как миксины не более
но поскольку лично я сторонник делегирования, то не страдаю.
Либо я тебя не понимаю, либо ты меня.
Я говорю, что если у объекта есть нужные атрибуты, ты берёшь их и пользуешься. И они возвращают нужные тебе значения, или производят нужные тебе действия. И именно на этом уровне нет разницы, унаследован ли атрибут, имплементирован, или подмешан. Он есть. Он просто работает. Разницы нет.
Тоже самое касаемо коллекций. Ты объявил коллекцию типа ArtCreator creators; и добавляешь в неё всех, у кого есть интерфейс IArtCreator, вне зависимости от того, каким образом в добавляемые объекты пришли те атрибуты, которые реализуют этот интерфейс в конечном объекте. Эти арт-креаторы могут быть людьми, ИИ-нейросетями, разумными грибами, пришельцами с Плеяд, кем угодно. И иерархию этого "как угодно" можно сделать сотней разных архитектур. Но на поверхности мы увидим только набор атрибутов, который нас интересует, нас устраивает.
Все просто
У тебя есть абстрактный родительский класс. Он может иметь состояние - то есть приватные переменные что то хранят, приватные методы для удобства, то есть ведет себя как самый обычный класс
Интерфейс же эквивалентен как если бы мы extension методы написали - то есть ничего хранить не можем, все что есть в this ( и оно публичное обязательно должно быть) - с тем и можем работать. И даже приватные методы для удобства не можем.
Во множественном наследовании второй (и вообще все) родительский класс имеет те же возможности как и обычный родительский класс без множественного
Снаружи это выглядит одинаково, но внутри небо и земля.
и желающему множественное наследование нужны возможности внутри, а не снаружи. Снаружи всегда будет одинаково - что при множественном, что без (с интерфейсами)
> Все просто
> У тебя есть абстрактный родительский класс.
Да ты блять угашенный штоле?
Я тебе в третий раз повторяю, на уровне использования готового объекта я не знаю и мне не интересно, кто у него там родитель. У него есть атрибуты, я беру их и пользую. Всё.
это ты угашенный видимо.
тебе в очередной раз повторяю
интересует не возможность описать контракт - что могут интерфейсы
проблем "контракт снаружи" не стоит - в обоих случаях ОДИНАКОВО!!!!!!!!!!!!!!!!!!
А возможности РЕАЛИЗАЦИИ внутри этого контракта с полным состоянием
Ну вообще не особо нужно. Все зависит от привычек. Я вот пишу на шарпе много и мне привычно делегировать, потому что сразу заложились привычки в силу того что есть в языке.
В питоне использую множественное ибо у такого наследования есть реально плюшки.
В котлине вовсю юзаю методы расширения, ведь в котлине упор на DSL-ость. (а вот в шарпе их избегаю ибо они не могут быть описаны в контракте)
Нет, я байтоёб упрощённый, из мира .NET. Еще и zero-allocation сериализацию можно сделать если забайтоёбить unmanaged типы. В C# 7 майки еще и забайтоёбили Linq, он теперь при возможности на Vector<T> переходит. А пиздежа-то было про байтоёбство, а ведь это единственно верный путь к настоящему программированию
нихуя ты с джунглей вылез
Прикольно! Охуели всем тредом!
Если там нормальный код без крестоебства, то почему всем крупным компаниям до сих пор похуй на шарп?
>почему всем крупным компаниям
А ты во многих крупных компаниях был, чтобы такие выводы делать?
Я тебе даже больше скажу, даже работая в такой компании - хуй ты сходу скажешь какой у нее стек преобладает, т.к. знать ты будешь только то на чем пишет твоя команда и пара смежных. А что в соседнем отделе, хуй ты узнаешь.
Брат, ну давай без коупинга по этому поводу. Выше уже был срач про использование шарпа, го и жабы во всяких гуглах, и шарп очевидно проебывает. Стартапы тоже - даже котлин с обоссанным жвм берут, но на шарп как-то всем пох.
Мне больше интересно - производительность-то какая будет в реальных условиях, без ансейф байтоебли? Есть бенчмарки?
Как примерно чувствуете, шарп с кором выстрелит еще сильнее со временем и вообще заменит жабомир, или так и останется на подсосе у жаб и го?
Глянул одним глазком
https://github.com/TechEmpower/FrameworkBenchmarks/tree/master/frameworks/CSharp/aspnetcore-corert/PlatformBenchmarks
таких извращений как выше нету. Ансейф только для UnsafePreferInlineScheduling
Но в целом такой код ты на прод не увидишь, его пишут авторы Нет рантайма и довольно жестко оптимизируют.
аватарки бейля - пидорасы
Не дохлая жава - уже хорошо
>В целях безопасности в асп выпилили идентифицирующие хедеры
а можно ссылку какую-нибудь на это? а то меня как вкатыша напугала эта статистика...
В связи с чем сам вопрос — каким грязным хаком я могу заставить свой грязный хак работать нормально? Вечный цикл после открытия всех окон? Какая-то пауза? Где-то есть настройка вечной работы с окнами? При этом вся информация с окон стекается в один обработчик, по сути
Доходит до конца main и заканчивается, что ожидаемо. Но мне этого не надо
Доходит до конца main и заканчивается, что ожидаемо. Но мне этого не надо
какой еще маин. переопределяй метод OnStartup
(ну и из хамла App.xam не забудь убрать вызов)
и в этом методе запускай окна как хочешь
Срач был в твоем маня-мирке, а так тебя там обоссали и объяснили, что шарп второй язык в интернете (как по количеству, так и по миллионникам, даже при условия того что хедеры asp убрали тонну лет назад).
Все тесты там настоящие, единственное где-то есть без mvc, то есть вариант для API, никакого байтоебства нет. Но радует, что если надо, можно навернуть максимум железный код (который обычно нужен в 1 случае из 100).
Но ванильный го, необрезанный, не вывозит даже противостояние с mvc
Где-то еще в 2009 началось безумие и все, даже в пхп начали удалять хедеры с ответом. Что ты именно хочешь узнать и что тебя напугало? Запусти сервер и посмотри x-powered-by.
>что тебя напугало?
что шарп теряет популярность судя по голой статистике
>Запусти сервер и посмотри x-powered-by.
я вкатышек который проходил только паскаль и си в школе и на первом курсе, шарп пока не трогал даже, собственно этого не умею.. можешь показать немощному?
и подсказать что выбрать для бэкэнда, без фанатизма? выбор сейчас между джавой и шарпом, в го я так понимаю вкатышам без опыта дорога закрыта
>что шарп теряет популярность судя по голой статистике
Оно стало размазываться из-за того что стали прятать хедеры.
С нет-кором популярность шарпа только стала расти, так как нет больше потребности нюхать старую жабу или топорный бойлерплейтный го.
>подсказать что выбрать для бэкэнда
Смотри работу в своем мухосранске или куда будешь релокейтиться. Вкатышам везде трудно, в ИТ сейчас нехватка спецов и переизбыток джунов или крудеров.
Сейчас еще создадут какие-нибудь самооптимизирующие модели, которые будут на декларативном диалекте генерировать круды и айтишечка вообще схлопнется, останутся только тру-инженера.
>стали прятать хедеры
то есть по умолчанию нет хедеров с какого-то года? тогда понятно почему статистика такая. или ты хочешь сказать что хедеры вручную убирают?
>мухосранске
я в дефолт городе. в общем с точки зрения перспектив технологии лучше шарп выбрать? (вакансий то вроде везде много)
>то есть по умолчанию нет хедеров с какого-то года? тогда понятно почему статистика такая. или ты хочешь сказать что хедеры вручную убирают?
Тут я возможно ошибся или перепутал, не могу сейчас поднять дефолтный сервер. Но на работающих приложениях у меня хедеров этих нет (но и новость не нашел, поэтому засомневался).
>дефолт городе. в общем с точки зрения перспектив технологии лучше шарп выбрать? (вакансий то вроде везде много)
Считаю шарп/дотнет перспективной технологией, потому что жаба не стоит тех денег с чем приходится там работать в бэкенде, как бы там не натягивали жабу, но это чистой воды COBOL Серьезно, считаю, что даже пхп будет лучше, чем жаба
Очередное подтверждение, что C# - это детский игрушечный язык. И как следствие, программисты-макакингеры упускают из виду решения, которые давно известны.
В языках для взрослых, типа С и С++, такие проблемы умели решать ещё 40 лет назад.
Все Rent и все Return нужно обернуть в конструкцию #if DEBUG / #else / #endif.
И в дебаг-режиме вместо прямого использования ArrayPool<T>.Shared, использовать обертку с подсчётом одалживаний и возвратов.
>переизбыток джунов
Подмена понятий.
Переизбыток претендентов на джунов. Реальных джунов - дефицит.
Вопросы какие? инбифо: хуи сосал?
Анон, смотри.
Иногда флешка тупо сыпется случается пикрилы.
Первое, чо пришло в голову, при такой хуйне - сделать raid-1 массив, из двух флешек.
Но хуй знает как, для этого нужны какие-то железяки, и короче raid-1 контроллеры, там.
Поэтому, пришла в голову другая мысль.
Очевидно, что если флешка сыпется, то несколько копий не поможет, однако очевидно, что несколько копий на флешке - нужно иметь.
Ну так вот, мысль состоит в следующем.
Пусть есть две посыпавшиеся копии одного и того же файла, или даже копии раздела, тома с файлами.
Пусть эти файлы/тома, читаются прогой в два потока.
Если ячейки битые, и контрольные суммы секторов - невалидные, то - заполнение сектора - нулевыми байтами.
Если в одном потоке - нулевые байты, а в другом потоке - какие-то данные - данные, то XOR секторов.
В реультате, с двух, посыпавшихся копий, а лучше из трёх-четырех, вероятностно-предопределённо получится изначальный файл,
который можно записать снова в две-три копии, если было задетекчено, что предыдущие копии посыпались, и содержат битые сектора.
Вопрос. Как реализовать сие на шарпе, и стоит ли использовать шарп?
Первое что приходит в голову- это работать с байтами, внутри filestream.
А вообще, хотелось бы заебенить это на уровне драйвера какого-нить, чтобы тупо разделить флешку на два-четыре раздела, заебенить raid-1 на этой флешке, и подмонтировать всю хуйню, как один раздел поменьше, с регулярной перезаписью данных в нормальные, не битые сектора.
Ну а как ещё с такими? Или хочь сказать, что щас бы самое время всё посливать нахуй - за обоссанные эти копейки ёбанные?
Да. В .editorconfig прописываешь следующее:
dotnet_diagnostic.CS8509.severity = error
Теперь если если в switch-e с enum-ом будет какой-то недостижимый вариант, то будет ошибка. Чтобы ее не было, нужно либо чтобы были расписаны все варианты енамов, либо был default.
Еще можешь добавить вот такую команду:
dotnet_diagnostic.CS8524.severity = none
Это отключит предупреждение если у тебя расписаны все варианты, но нет дефолтного.
Винформы точно нет.
Про Asp.Net нужно уточнять. Если это обычный, .Net-фреймворковый Асп - то нахуй. Если Asp.Net Core то - актуально.
Но в нормальных конторах обычно знают разницу и везде указывают приставку Core.
> Про Asp.Net нужно уточнять. Если это обычный, .Net-фреймворковый Асп - то нахуй. Если Asp.Net Core то - актуально.
А между ними такая большая разница?
Написано без Кор, просто асп.нет. Поэтому стремаюсь немного. Как бы там скуфидронов небыло, которые затянут меня в бесперспективный кал мамонта свой.
Вот желательно было бы в виде истории типо начали разрабатывать интернет магазин сделали, а потом начали допиливать и вот такие косяки вылезли.
Везде пишут как правильно но ни кто не пишет как не правильно(
Я уже второй раз пытаюсь написать свой сервис и блять через неделю получается такая ебань что я не могу вообще разобрать как и почему это работает.
>Винформы точно нет.
И какие же альтернативы для написания легковесных приложений для ПК с виндой?
Для разраба в принципе не особо. Есть некоторые запарки и ньюансы, но не критично.
Вопрос в работодателе, если у него там до сих пор .net framework и он не собирается переходить на core, то делать там нехуй.
>Как бы там скуфидронов небыло, которые затянут меня в бесперспективный кал мамонта свой.
Скорее всего ты будешь там один и будешь тянуть на себе весь этот 'кал мамонта'
>И какие же альтернативы для написания легковесных приложений для ПК с виндой?
Да пиши пожалуйста, только это не та область (десктоп) где сейчас хоть как-то нормально заработать можно. Вопрос, то про вакансию изначально был, а не про хобби.
Назови её images.
Я сейчас работаю в финтехе, пишу под мобилке на кросс платформе(Flutter). Вакансий по стране(не снг) не так много, штук 15. Возвращаться в Андроид натив не хочу, так как не хочу работать в узком направлении и запирать себя на определенной платформе.
Я думал перейти в бекенд. Думал о Java либо C#, так как nodejs, golang это не то. Посмотрел как изменился сишарп за последние годы, очень впечатляюще да и вакансии есть
Стоит тратить время и переходить в С#?
Можно теоретически если подтяну знания попробовать податься на мидла или нужно с джуна начинать?
Короче всё, без впн доступа к серверам майков больше нет.
>Стоит тратить время и переходить в С#?
Если ты уже в финтехе, то стоит. Там сейчас много где шарп используется. И даже старые предпочитают на .net6 перетаскивать, а новые сразу на нем делают.
>Можно теоретически если подтяну знания попробовать податься на мидла или нужно с джуна начинать?
Скорее на мидл++, т.к. в финансах сейчас только опытных набирают. В некоторых банках уже ниже ведущего разраба и нет никого. Джунам там точно ничего не светит.
А не будет смущать работодателя, что опыта в беке нет? Либо стоит немного приукрасить резюме?
Но никого же нет, он один там "ведущий". Причём тут твой гейский штурвал?
Правильно ли я понимаю, что благодаря последним изменениям и переходу к кросплатформе, нет смысла использовать джаву в новых проектах?
Насколько это верно? Стоит ли ожидать увеличение вакансий в будущем?
Отмотай время на три года назад и сравни сколько вакансий было в 2020-м и сколько в 2021-м. Вот и ответ на твой вопрос. 2022-й год по понятным причинам в обзор не берем.
Но брать 22 нужно. Фиг уже знает что будет дальше. Мелкософт не показал себя непредвзятым.
>Но брать 22 нужно. Фиг уже знает что будет дальше.
Все это так же применимо и к другим платформам/языкам. Даже на опенсорс не стоит надеятся, как показал предыдущий год - там тоже дохуя ебанутых крыс, говтовых подкинуть говна.
Поэтому тут все в равных условиях.
>>477013
>Мелкософт не показал себя непредвзятым.
Да и похуй совершенно. Core сейчас позволяет полностью вести разработку совсем не касаясь майковской инфраструкту.
Я тебе даже немного инсайдов подкину. В тех же банках, которые подпали под санкции, спокойно продолжают наяривать на дотнете и переводить старые/разрабатывать новые проекты на .net6 и даже, сюрприз, корпоративные лицензии на студию 2022-ю покупают. Сервера только с винды, на линуксы потихоньку переводят, там где еще не перевели, но и то, в основном, из соображений экономии.
>спокойно продолжают наяривать на дотнете
речь не о говне, а об ожиданиях говна
им то незачем менять, вон как с коболом
а другой, которому только выбирать - подумает
да и что банки
и в те банки, что уже есть, не попадешь (а новых не будет)
Мне и многим другим приходилось есть жабу, так как альтернатив не было (выше скрипты, ниже кресты). Потом высрали го, но даже после топорной жабы на нем было больно что-то делать, но этот "вентиль" был открыт и часть комьюнити все же хлынуло туда под напором и у нас появилась хоть какая-то альтернатива этому болоту на жабе. А теперь появился нормальный современный и развивающийся язык, с похожим на джава синтаксисом и стало легче.
Не все еще вышли из криокамер и думают о шарпах как языке для винды, но интерес растет и понятно почему. Так же шарп открывает окно в гейм-дев, особенно для инди-разработчиков, что весьма вкусно, даже просто поковыряться на досуге для себя.
PS Была какая-то надежда на котлин, но он почти полностью тянет джава инфраструктуру, от чего воняет той тем же болотным тырпрайзом.
не прав
Второй очевиднее и проще в поддержке.
Может есть какие настройки в ЕФ для этого? Я чет не могу нагуглить пока
А зачем тебе is null в первой пикче? Знак вопроса уже делает сравнение. Напиши:
> return _canExecute ? true : _canExecute(parameter);
Посмотрим, что скажет студия на это.
Конфигурация это в моделбилдере же? А если у меня классов как говна, каждое поле всех классов так ставить? Я вот нашел такое - modelBuilder.Properties().Where(p => p.Name != "Id").Configure(p => p.IsOptional());
Тулинг в целом все еще ощутимо хуже, чем в жабе. Куча либ и инструментов работают только на винде, что-то навсегда осталось в старом дотнете.
>нет смысла использовать джаву в новых проектах
Все еще есть, и ее используют, особенно там, где уже есть команды с экспертизой в жабе.
>>476874
>Стоит ли ожидать увеличение вакансий в будущем
В РФ точно нет, в ЕС вряд ли, может быть в США, но не уверен. Про Азию ничего говорить не буду.
Так если все удалили свои хедеры еще 10 лет назад, то почему популярность только падает?
А разгадка проста: народ переезжает на go, либо стартует новые проекты на go/js/python
>так и останется на подсосе у жаб и го
this.
Нет киллер фич, ради которых нужно переехать с условной жабы на шарп, если у тебя есть команды с экспертизой в жабе. Проще переехать на новую жабу.
Даже с го нет смысла перебираться на дотнет, потому как в дотнете нет тех фишек, ради которых берут гошку (виртуальные треды, прозрачный код без магии и orm, отсутствие монструозного ООП, компилируемость в бинарник)
>производительность-то какая будет в реальных условиях, без ансейф байтоебли
Обычная, стандартная, обыкновенная для бекенда. Все будет упираться в базу данных.
>>471727
>почему всем крупным компаниям до сих пор похуй на шарп
А зачем переходить, когда вся высокопроизводительная хуета уже написана на С++, круды на жабе и инфра на го? Смысл перепиливать все с нуля?
Когда кодил 14 лет назад на пхп, во многих решениях старались как-то переживать за оптимизацию, даже следили за количеством запросов в базу, оптимизировали каждый, нередко CMS выводили даже об этом инфу в футере сайтов/форумов (еще с инфой времени исполнения кода).
Мы даже писали в процедурном стиле, ибо классы в 5.2 имели некоторые ощутимые проблемы с производительностью, в отличие от массивов.
Когда перешел на жабу, увидел что всем насрать вообще на производительность. Полухолостое приложение, слоившиеся годами от рук около-студентов (по возрасту или мозгам), которое жрало планками память и тормозило, делая при этом - нехера. И это не только к внутренним продуктам, по большей части весь стек такой в джаве.
>Так если все удалили свои хедеры еще 10 лет назад, то почему популярность только падает?
Ты не очень умный, да? Инет за 10 лет вырос хер знает как, цифры размазываются, там пхп хоть и терял позиции по процентам, но сайтов многократно навернул.
>go/js/python
С появлением нет кора жрать говном можно уже перестать.
Го начинает сосать болт когда сталкивается с хипом 10-100-1000Гб. И шедулер не бесплатная вещь, именно поэтому го сосет во многих тестах.
Асинхронность не панацея.
Покоромлю зумера
>отсутствие монструозного ООП
Выросло поколение для которых ООП - это сложна! Помню 6 лет назад гоферы с пеной у рта затирали, что ООП у них есть.
>компилируемость в бинарник
Офигеть фича, ты руками деплоешь? В NET 7 теперь тоже можно в бинарь c AOT (вероятно для додиков которые по ftp руками заливают), правда в случае шарпа AOT дает прирост почти в два раза (и по памяти тоже).
>прозрачный код без магии
Кодогенирация, касты с рефлексией, свитчи из-за полустатичной типизации. Возможность пропуска ошибки если возврат одного значения (зато проверяются используемость переменных и не компилится, лол), и банально можно забить на обработку ошибки (для чего исключения и были придумали, где надо явно заигнорить ошибку). Ну и вишенка - утиная типизация интерфейсов, открывающая просто кладезь плавающих ошибок.
Дальше писать лень, ибо некрасиво издеваться над гоферами.
С виртуализацией там спец контейнеры. Например VirtualizingStackPanel
А потому можно взять любую реализацию VirtualizingWrapPanel и использовать ее как
> ООП - это сложна!
Он не о сложности говорит, а о монструозности. Если я правильно понимаю, речь тут вот о чём. ООП может быть простым:
> class animal {}
> class mammal : animal {}
> class human : mammal {}
> human uasia = new();
Это простой и элегантный ООП, в котором всё ясно и логично.
Но можно и выебнуться, например:
> list(list(list(list)))
> hui(pizda(koncha(kharcha())))
> hurr = durr(derp)
И ты такой сидишь, смотришь на это. А что на нём пишут? Бэк? Фронт? Бизнес-логику? - Да неее... Задачки у себя в универе решают.
Монструозное ООП это про интерпрайз решения, когда просто специфика работы заставляет пилить так, чтобы сегодня лодка, завтра - самолет.
Условные абстрактные фабрики абстрактных билдеров абстрактных фабрик, мемные бин-фактории и прочие медиаторы, врапперы, контексты и т.д.
Ну а по факту. В реальности - все зависит от проектов и того что делается. Когда задача простая и понятная - никто в реальности вот этой вот мурой не занимается, кроме мидлов. Когда у тебя много неизвестных - ты пилишь так, чтобы как уже сказано выше - сегодня у тебя туду-лист, а завтра - облачное приложение с билингом, сотней интеграций со сторонними сервисами, дашборды, совместная рисовалка, чатик, видоконференции и диаграмма Ганта, потому что эту ебучую диаграмму каждый хуй просит впихнуть в абсолютно любую хуйню, чтобы была, блядь, и похуй что на деле оно ничего не дает и нихуя не помогает.
А то что ты привел в пример - это нарушение закона Деметры, к ооп оно относится слабо, просто говнокод обыкновенный.
Ну и да. Я не тот чел что про это говорил. Может быть он тоже видел только плохой код под соусом ООП или вообще ИРЛ его не видел, а только слышал что оно монструозное, я не знаю. Говорю просто про особенности работы с интерпрайзом на личном опыте работы.
Шиззо, ты привел пример наследования и композиции, это как раз инструменты борьбы со сложностью и используются совместно а не противопоставляются.
У тебя каша в голове, иди читай букварь.
640x268, 0:12
Освоил клитор твоей мамаши.
Лучше в блокчейн зашить ключи в зашифрованном виде. Так и сделаю, впрочем, гы.
Дык а что по теме? Что если на харде/флешке лежит пиздатый 640ГБ-йтный dd-образ, который может посыпаться нах, из-за парочки бед-секторов/битых ячеек.
Покоромлю зумера
Хотел тебя обоссать, а тебя уже обоссали.
ООП не панацея, но лучше когда оно есть, чем когда его нет.
Ничто не мешает писать ООП в около процедурном стиле (в жаба тырпрайзе это давно уже мейнстрим, это называется анемичная модель данных https://www.martinfowler.com/bliki/AnemicDomainModel.html )
Но ООП даже в анемичной модели позволяет лучше декомпозировать сложность и предметную область, чем процедуршина и это было доказано императивно еще когда твои родители ходили в пеленки, или даже не родились.
То есть, ооп позволяет писать в процедурном стиле (такой процедурный++ стиль) и процедурный позволяет писать в ооп, но уже ценой бойлерплейта (дроча композицию).
В общем, хорошо когда у тебя язык мультипарадигменный, у тебя есть выбор.
И да, языки в который по стекам надо пробрасывать ошибки и нет возможности в этих ошибках развернуть стектрейс - не являются промышленными языками. Стектрейс в 100-200 функций это сейчас почти минимум для продвинутого приложения разрабатываемого в команде. Если всякие Си просто устарели для промышленного кодинга, то го и расты просто примитивные игрушечные перделки, не отвечающие потребностям современности.
Ключём может быть хэш парольной фразы, а её - в башке уже несложно запомнить.
Ну или застеганографировать в какой-нибудь фотке,
с помощью алгоритма f5 steganography https://username1565.github.io/js-jpeg-steg/
А фотку уже на карты памяти раскидать и на харды, в тел засунуть, в камеру, на флешку, на магнитную плёнку стримера вхуярить, в стекле вписать там, ну хуй знает.
Но опять же, фотка может посыпатся, а вот нейроны в башке по 150 лет могут жить, какбэ.
Я даже помню нашли какую-то акулу, которой 512 лет.
Кстати, в этом контексте, а чо бы уж сразу, в нейронах не писать инфо?
Были уже опыты по сохранению бекапов внутрь нейросетей?
Уже представил себе нейросетку, выращенную в чашке Петри, помещённую в бункер, и USB/SATA-разъём, из неё выходящий. Гы.
Хотя не, вечный диск из кварцевого стикла, всё-же пижже:
>Накопитель вмещает до 360 ТБ данных и при обычной комнатной температуре работоспособен в течение 13,8 миллиардов лет.
https://invict.info/lifehacks/sozdan-5d-disk-kotoryj-smozhet-hranit-360-terabajt-informatsii-milliardy-let
Ты же ебнутый
Спасибо. Понял. Принял. Извинился.
> То есть, ооп позволяет писать в процедурном стиле (такой процедурный++ стиль) и процедурный позволяет писать в ооп, но уже ценой бойлерплейта (дроча композицию).
То есть, лучше когда я в ООП-языке объявляю статик метод, чем когда я в процедурном языке объявляю процедуру Объект.Метод()? Об этом речь?
Возьми шрифт, которым пользуешься, возьми редактор шрифтов. Замени скобачки на пробелы. Установи шрифт в студию. Профит!
Есть.
>То есть, лучше когда я в ООП-языке объявляю статик метод, чем когда я в процедурном языке объявляю процедуру Объект.Метод()? Об этом речь?
Там больше плюшек, но если по твоему случаю, то да. Ты так и так будешь группировать функции в файле, почему бы не сгруппировать их статик классом, чтобы не иметь импорта по звезде как в котлине (или в противном случае портянке импортов), ну и в последующем видеть откуда вызов по типу "Class.method()", чтобы видеть что это вызов из импорта, а ее внутренний метод текущего объекта.
>по большей части в уме держал не котлин,
Просто картинка по котлину была и пример, что не всегда функции это прям круто, хотя иногда и удобно, пока не пишешь что-то большое.
На самом деле и статик классы плохо, на практике делают обычные классы без состояний (называют их в анемичной модели - сервисы). Это дает там некоторые плюшки в плане работы с интерфейсами, DI (IoC), возможности моков в тестах и еще чего-то, но не помню уже.
>То есть, лучше когда я в ООП-языке
Лучше если дебилы вроде тебя съябут нахуй из профессии, а не то что в ООП-языке. Т.е. дебилов вроде тебя даже в процедурных языках быть не должно.
Любитель поесть говна?
Вообще то то, что на скрине, и есть "как в неймспейсах"
А не такой пипец в шарпе не потому что неймспейсы
а потому что нельзя методы и переменные держать вне класса, поэтому вынужден писать имя класса в коде, что чуть более информативно (для блокнота конечно) откуда оно.
>что не всегда функции это прям круто, хотя иногда и удобно
Вообще то вполне нормально, если язык заточен под DSL и при этом DSL является легальным кодом. Оно как раз читается лучше
И пример на скрине превосходно читается, то какой то школьник не знает основ языка.
На практике, без доки, эти DSL понятно как писать только авторам самого этого DSL. Код без IDE выглядит как чистая магия. Лесенка из лямбд вложенная в лямбды, нехера это не круто, у тебя вместо вертикального последовательного кода получается какой-то горизонтальный звездец и тебе приходиться читать весь этот каскад кишков.
Единственное, наверное, будет круто гуишки описывать так, но опять же тебе придется доку писать и проверять валидность значений, обязательные и необязательные параметры, в общем все то, что ты бы делал и с псевдоязыком. Котлин DSL для DSL слишком кастрированный и ничего кроме каскадной вложенности не дает.
>у тебя вместо вертикального последовательного кода
Какого еще последовательного кода. На пике декларативное описание конфигурации.
Кстати в asp.net core точно такой же
Только в асп что то типа services.AddFeature() вместо install(Feature)
но это просто семантика так выбрана - фактически в обоих случаях используется метод расширение + метод билдер.
Просто в котлин лямбда блок переданный как последний параметр можно писать так и this в этой лямбде можно не писать.
поэтому выглядит магически. Но это самые обычные лямбды.
Я и в шарпе могу так сделать, просто из-за необходимости явно использовать в лямбде объект (не могу его сделать как this) будет больше шума (плюс или минус это - спорно)
>горизонтальный звездец и тебе приходиться читать весь этот каскад кишков.
Вообще проблем нет. Кто выбирает декларативный подход - у него и в шарпе будет примерно так же, только более зашумлено всякими ()=> ведь не каждая лабда является семантически калбэком.
>проверять валидность значений, обязательные и необязательные параметры
хз о чем ты. это не псевдоязык, который во что-то транслируется, а самый обычный код и поэтому проверяется компилятором.
в шарпе выглядело бы точно так же, но с () =>
>но опять же тебе придется доку писать
Ничем не отличается от шарпа. В том же асп.нет коре в самом его рождении когда видел всякие куски кода типа
services.AddFeature() на гитхабе, то копировал, а оно красным горит - потому что нужно подкинуть пакет какой-то, в котором нужный метод расширение AddFeature
а поди узнай какой. Даже знание неймспейса не дает знание где оно.
Позже стабилизировалось, потому что все это распихали в метапакет или же НАПИСАЛИ ДОКИ, но кошмар "я тут скопировал кусок кода и он не компилится" - такой же и причины те же.
>Котлин DSL для DSL слишком кастрированный и ничего кроме каскадной вложенности не дает.
как раз он наполнен фичастостью на эту тему - скоупы у функций, расширения статиков, скоупные extension методы, делегирования свойств, настоящие инлайны, встроенные функции let/run/apply...
А каскадная вложенность вообще не фича - это обычные лямбды.
>будет круто гуишки описывать так
О да. jetpack compose охеренно крут именно из-за того что язык заточен под DSL
Шарп такое увы не сможет - всего вышеописанного добра в нем просто нет.
Впрочем, поскольку мауи это наследник замарина, то они этим путем и не пошли даже, но если бы пошли, то получилось бы сильно не так изящно.
>у тебя вместо вертикального последовательного кода
Какого еще последовательного кода. На пике декларативное описание конфигурации.
Кстати в asp.net core точно такой же
Только в асп что то типа services.AddFeature() вместо install(Feature)
но это просто семантика так выбрана - фактически в обоих случаях используется метод расширение + метод билдер.
Просто в котлин лямбда блок переданный как последний параметр можно писать так и this в этой лямбде можно не писать.
поэтому выглядит магически. Но это самые обычные лямбды.
Я и в шарпе могу так сделать, просто из-за необходимости явно использовать в лямбде объект (не могу его сделать как this) будет больше шума (плюс или минус это - спорно)
>горизонтальный звездец и тебе приходиться читать весь этот каскад кишков.
Вообще проблем нет. Кто выбирает декларативный подход - у него и в шарпе будет примерно так же, только более зашумлено всякими ()=> ведь не каждая лабда является семантически калбэком.
>проверять валидность значений, обязательные и необязательные параметры
хз о чем ты. это не псевдоязык, который во что-то транслируется, а самый обычный код и поэтому проверяется компилятором.
в шарпе выглядело бы точно так же, но с () =>
>но опять же тебе придется доку писать
Ничем не отличается от шарпа. В том же асп.нет коре в самом его рождении когда видел всякие куски кода типа
services.AddFeature() на гитхабе, то копировал, а оно красным горит - потому что нужно подкинуть пакет какой-то, в котором нужный метод расширение AddFeature
а поди узнай какой. Даже знание неймспейса не дает знание где оно.
Позже стабилизировалось, потому что все это распихали в метапакет или же НАПИСАЛИ ДОКИ, но кошмар "я тут скопировал кусок кода и он не компилится" - такой же и причины те же.
>Котлин DSL для DSL слишком кастрированный и ничего кроме каскадной вложенности не дает.
как раз он наполнен фичастостью на эту тему - скоупы у функций, расширения статиков, скоупные extension методы, делегирования свойств, настоящие инлайны, встроенные функции let/run/apply...
А каскадная вложенность вообще не фича - это обычные лямбды.
>будет круто гуишки описывать так
О да. jetpack compose охеренно крут именно из-за того что язык заточен под DSL
Шарп такое увы не сможет - всего вышеописанного добра в нем просто нет.
Впрочем, поскольку мауи это наследник замарина, то они этим путем и не пошли даже, но если бы пошли, то получилось бы сильно не так изящно.
> На пике декларативное описание конфигурации.
Тем временем на пике:
> установи установи установи, получи, вызови
Нам-то это зачем обесняешь? Сотруднику - халявщику это обесняй:
> Для нужд организации юзается инфраструктура организации. Для нужд твоей бляди ты мне подгоняешь инфраструктуру и я на ней тебе бота поставлю. Вопросы оплаты инфраструктуры (сервака) ты решаешь сам со своей блядью.
признаю.
просто я под влиянием jetpack compose, который хоть и выглядит как императивный код, но является декларативным по сути.
но все же не все однозначно - install может сам выполнять конкретную работу (то есть быть императивным), так и быть просто контейнером описания конфигурации
Алсо https://learn.microsoft.com норм для старта? я посмотрел дотнет из шапки, там вроде все то же
4 день изучения btw
цель задания - реверснуть буквы в словах, но слова оставить в том же порядке
в каком смысле? Пока что просто выдает еще ошибок. Надо как-то по-другому задавать?
надо на котлин переходить. ну или на го.
внутри блока убери обьявление новой переменной, тоесть БЕЗ слова string
Так хули там учится?
как до замыканий дойдет - там и заинтересуется скопами
Если на такой хуйне страдать, то перегоришь и пойдешь в шлюхи
если перегоришь, то значит в программисты лучше и не идти.
Несчастливы те, для кого это "айтишнике норм зарабатывать я тож хочу"
Правда несчастливы и те, кому это в радость
Разобрался
>Несчастливы те, для кого это "айтишнике норм зарабатывать я тож хочу"
>Правда несчастливы и те, кому это в радость
Соснули все
640x360, 0:36
Нету перспектив - все сдохло. Забудь про шарп.
Майкрософт уже все заблокировал, а в дальнейшем вообще будет закладки делать, так что все российские компы просто взрываться будут если на них хоть один их продукт будет установлен.
Пиздуй 1С учи.
Алсо, если ты такие тупые вопросы задаешь, то программирование, это скорее всего не твое.
Я си шарп начал учить из-за того, что у него логотип прикольный.
Сильно ли сложные тут фреймворки?
Нужно ли знать англюсик?
Правда ли, что надо будет учить ещё фронт? Я не хочу на фронт, а хочу заниматься бэком.
Почему нельзя самому писать sql-запросы, а обязательно надо наворачивать тонну автосгенерированного кала?
>За сколько месяцев можно вкатиться в шарп, если знаю джава кор?
Полгода-год. Если сразу выкинешь джавовские привычки, то может и меньше.
>Сильно ли сложные тут фреймворки?
Не сложнее джавовских.
>Нужно ли знать англюсик?
Лучше знать чем, не знать.
>Правда ли, что надо будет учить ещё фронт? Я не хочу на фронт, а хочу заниматься бэком.
Да. Сразу клади хуй на все что связано с десктопом (WPF, Winforms) и на все где есть слово MVC. Учишь ASP.Net строго до уровня WebApi и идешь в бэкэндеры. Хотя подучить фронт не помешает на уровне HTML, CSS и что-нибудь вроде React-а, просто, чтобы быть в курсе как там все работает, ну и при отладке больше возможностей иметь.
Во первых можно.
Во вторых ты долбоеб не понимающий сути механизма миграций. И то, что они вообще не имеют отношения к тому используешь ты ORM или нет.
Дак никто про них не пишет. Фримен говорит, что делайте миграции, а зачем они - не поясняет.
Из ORM, а по дефолту для асп.нет это EF
вот к нему и относится.
А так пиши миграции как хочешь. Многие вон (то есть я 1 и еще несколько во всем мире) вообще не юзают EF
А почему React, а не Angular? Я слышал, что как раз последний совместим с ASP.NET.
Да х.з. просто я за всю карьеру только с реактовым фронтом связывался. Ну и насколько я понимаю Angular уже вроде как приближается к статусу "говно мамонта", чтобы начинать его учить. А vue используется меньше чем react.
>>480825
>Я слышал, что как раз последний совместим с ASP.NET.
Я х.з. что ты под этим подразумеваешь, т.к. фронт по факту с бэком общается через API и им должно быть строго похуй, что по другую сторону находится.
>Как вы изучали юнит-тестирование?
Что-то почитал, что-то посмотрел. В основном чужой код изучал.
>Действительно ли, что сам программист на сишарп должен писать юнит-тесты, а не специальный юнит-тестировщик?
Чтобы писать юнит тесты нужно как минимум быть разрабом, а садить целого разраба только на юнит тесты дохуя дорого будет.
Просто не стоит переоценивать юнит тесты, а четко понимать, что и как ими тестировать. Где-то они будут просто бесполезны, а где-то прямо в самую писечку подойдут. Например для каких-нибудь кастомных мапперов это вообще маст хэв.
Почему EF не включили в состав дотнете, а приходится его закачивать как левую библиотеку от каких-то васянов?
Блин, ещё реакт учить...
Нужна физическая винда обязательно, ни на какой виртуалке шарп не заработает.
Он даже виртуалку роняет?
Настраиваешь .editorconfig и IDE сама все расставляет.
Алсо джавовский стиль, когда скобка оставляется на предыдущей строке (он же K&R) очень уебищен. Говорю как работающий сейчас и с ним и со стандартным шарповым стилем (Олман)
Олман в сто раз лучше.
Потому что EF может быть слишком медленный и нужен будет Dapper. Потому что может быть no-sql БД. Или БД не будет вообще. Так нахуя подгружать в проект ненужную библиотеку, которая будет только нагружать процесс?
Ну чем джавовский плох, а шарповский хорош?
Вот я вижу, что теряется лишняя строка и код становится объемнее. Учитывая, что ещё и методы с большой буквы, то кажется, что у тебя просто куча кода. Хотя то же самое в джаве куда компактнее.
>Из EF.
>>480806
>Из ORM, а по дефолту для асп.нет это EF
Да с хуя ли это из ORM, это один из паттернов при работе с реляционными БД связанный с версионированием. Ты можешь вообще с чистым sql работать и все равно использовать механизм миграций. ORM просто позволяют этот процесс автоматизировать. Те же EF или даппер можно использовать в режиме pure sql, отдавая ему на откуп только версионирование базы в соответствии с моделями данных. Т.к. писать эти миграции руками та еще ебанистика.
Здесь не знают, что это такое.
Ну кстати соглашусь с Фленовым, что все эти прослойки не нужны. SQL сам по себе норм язык, дак нафига заменять его на всякие ORM-ки.
> а шарповский хорош?
Тем что четко отделяет тело метода/цикла/блока и т.д. от их сигнатуры/определения/базы. Особенно заметно когда например в сигнатуре метода несколько параметров и их приходится врапить, чтобы они за экран не вылезали. Тогда вообще хуй поймешь, где кончаются параметры, а гду уже тело метода началось. Особенно на конструкторах заметно.
Во вторых более удобно когда нужно отельный блок скопировать и перенести куда-то. Не приходится искать где эта ебучая открывающая скобка притаилась. В олмане просто копируешь все нужные строки и все.
>>480965
>Вот я вижу, что теряется лишняя строка и код становится объемнее.
Во первых нехуй байты и строки экономить. Во вторых если тебе прямо так жмет, то можешь в студии экстеншен вроде Shrink Empty Lines, который уменьшает пустые строки и строки со скобками/знаками и т.д. (вобщем без кода) по вертикали и они намного меньше места занимают.
>>480965
>Хотя то же самое в джаве куда компактнее.
В пизду компактность если она мешает читаемости. Потом в любой момент можно все ненужные блоки свернуть по хоткею и разворачивать только то, что нужно.
Да-да, только дебажить его заебешься. Ну и на большом проекте при изменении чего-нибудь одного может все пиздой накрыться, т.к. хер ты узнаешь, что какая-то стопитсотая хранимка не соответствует новой модели.
ну он уходит в другую крайность
и вообще все в кучу свалил. репозиторий вообще перпендикулярен и так же используется с даппером - это просто класс "где будут методы для такой то сущности, а внутри даппер или что угодно"
Мои претензии
- много жрет памяти
- медленно стартует
- танцы с бубном если нужно выбрать без трекинга, а потом обновить одно поле в базе
- он орм, а значит "мы не можем использовать фишки такой то базы, а вдруг будем переезжать" (на деле никогда)
- он орм, а значит над "думаем как написать на SQL" добавляется "теперь нужно придумать, как написать в терминах орм, чтобы в итоге все транслировалось во что нужно"
Вот последнее просто бесит
А так даппер как легковесный маппер, но по возможности генерация sql с помощью LINQ, только тут не цель абстрагироваться от SQL максимально, а всего лишь использование Expression как спецификаций.
Чистый SQL...чист, но морока править если имя колонки изменилось и вообще собирать эту строку. Тут можно взять примитивный билдер, а потом добавить в него expression и получим LINQ )))
Есть еще подход как вот FastCRUD, но он как то вырвиглазно получается.
>>480963
>Потому что EF может быть слишком медленный и нужен будет Dapper
по наносекундам если будет, то ты перепишешь на SQL и будет равно дапперу, так что даппер ты брать не станешь (это я про последний и будущие EF кор говорю). Оно проиграет по памяти
>>480968
>Ты можешь вообще с чистым sql
ты можешь делать что угодно, но первоначальный вопрос был "что за миграции такие в асп.нет вон в книжках о них пишут". А это как раз EF и его миграции
Потому что смысл нет кора в модульности.
Оба так себе.
https://vk.com/doc44301783_642335682?hash=1nd5KWRQpsUfh34Irid69aTHPiR2CKbhL7i35r1WFDc
https://vk.com/doc44301783_642335685?hash=SVzlP3aCYXa2j9cjqeQHHWZcIGP3gzqsTUkqkVEvkdk
Биологическая винда.
А я напоминалку пооставлю в тилибоне, чтобы нейрончики будоражить в ячейках ассоциативной памяти с адресацией по содержанию и короче какбэ чтобы память себе освежать. Пусть тилибонькает раз в месяц, хуйле.
Я в универе с удовольствием программировал на ассемблере и вообще люблю такое ковыряние в байтиках.
В шарпе похуй. Т.е. имя класса может не совпадать с именем файла. Но, крайне рекомендуется, чтобы оно совпадало. По крайней мере на реальных проектах тебе точно предъявят если они будут различаться и попросят обосновать.
Если в файле несколько классов, то обычно файл называют по первому классу.
С именами каталогов/проектов та же фигня.
Ну если только для удовольствия и ради познавательного интереса.
Я сам старый байтоеб и до сих пор иногда на ассемблере пишу в качестве хобби. IL я потрогал ровно в той степени, чтобы понимать при случае что это и как с ним работать. Ну и просто посмотреть во что в итоге высокоуровневый код превращается. Но в реальной работе это ни разу не понадобилось.
Не говори об этом больше некому.
https://youtu.be/cT65oHRPckw
И как его правильно обработать?
При этом многие новые книги зарубежных авторов стали ориентироваться больше на вс код и консольные команды.
> При этом многие новые книги зарубежных авторов стали ориентироваться больше на вс код и консольные команды.
В новом издании Прайса наоборот автор выкинул vs code и перешёл на студию.
Ещё бы Фримена новую книгу перевели
Хохол, спок.
Как вы учили ASP.NET?
ASP.Net вообще один из самых легких фреймворков для освоения. Он хорош тем, что с ним можно начать работать не зная и половины его возможностей.
>конфигурации, миграции,
Это не часть ASP.NET
>сервисы.
А это вообще просто способ/шаблон проектирования.
Ты можешь на ASP написать приложение вообще без единого сервиса запихнув всю логику в контроллеры. Это правда совсем говнокодисто будет, но сделать так можно.
https://stackoverflow.com/questions/28543293/entity-framework-async-operation-takes-ten-times-as-long-to-complete
Вопрос, что лучше использовать - просто убрать async с контролера или завернуть его в TaskCompletionSource? Или может итт знают какой-то лучше вариант?
первый фичастее, второй экономнее в плане алоков и быстрее (но не самый быстрый), но менее фичастый.
Нет. Голанг как раз хорош тем, что не делит функции на синхронные и асинхронные.
>классы в 5.2 имели некоторые ощутимые проблемы с производительностью, в отличие от массивов
Странно слышать про сравнение производительности классов и массивов, когда это соврешенно разные вещи.
>увидел что всем насрать вообще на производительность
В чем это конкретно проявлялось?
>С появлением нет кора жрать говном можно уже перестать.
Нет кор появился несколько лет назад, но народ до сих пор жрет говно в виде go и js. В чем причина?
Так ORM используют не потому что хотят облегчить миграцию между бд.
Дотнет кор опоздал везде. Да и до сих пор нет нормальной кроссплатформенности как в джаве.
Тяжелое наследие маркетинга по майкрософтовски. Народ до сих пор им не верит и думает, что еще чуть-чуть и они опять включат свой агрессивный ЕЕЕ и всех повяжут.
Примерно так же как и с гуглом. Т.е. все конечно пользуются потихоньку go, стартапчики там всякие и т.д. Но в уме упорно держат, то что это гугл и завтра он с ненулевой вероятностью скажет "Нам надоело, нахуй го, мы его закрываем"
Отговорки.
>EntityFramework
>2k22
>не юзать божественный linq2db
>а пачиму EF не в стандартной библиотеки
>да я вообще голый SQL пишу
Суть треда.
Можно подумать у большинства тут есть хоть какое-то право выбора чем пользоваться. Выбирать стек удел архитекторов, а макаки уже будут жрать, что дают и писать как им скажут.
С таким мышлением ты никогда не станешь архитектором.
var isSubset = !collection2.Except(collection1).Any();
var isSubset = collection2.All(a=> collection1.Contains(a));
Не знаю, что у тебя за задача, но поиграйся с linq
Я уже избавился от необходимости проверки, но всё равно спасибо
Теперь есть другой вопрос. Есть возможность собрать шарповое приложение так, чтобы оно не зависело от наличия .NET рантайма в винде? Чтобы у меня был абсолютно топорный бинарник, без зависимостей и бла-бла
Продолжай накачивать мозги сишарпом и понимание однажды придёт.
Хотя на самом деле мозг лишь выходит на нужную частоту, а знания подгружаются из космоса.
>Продолжай накачивать мозги сишарпом и понимание однажды придёт.
Я бы с удовольствием. Только наследование - основополагающая тема, и если я пойду дальше, нормально не разобравшись с ней, ничего хорошего из этого не выйдет.
Ну ты открой троелсена, там всё написано.
Вот то, что тебе нужно понять, чтобы понять код выше:
1. explicit и implicit приведение типов
2. upcast и downcast
3. boxing/unboxing (ты можешь посмотреть на то что это на сайте sharplab.io, справа надо будет выбрать "IL" и вникать в инструкции IL кода в нужном тебе методе)
Отбой, я понял. Оно хочет либу с собой потянуть. Как мне встроить либу в экзешник без ебли?
self-contained надо указывать во время публикации, либо вместе с экзешником dll-ку тащить
В гробу я видал таскать с прогой ещё и либы. Я ж поэтому и спрашиваю, как мне влинковать всё в экзешник, как в тех же плюсах?
И где я его публиковать буду, не подскажешь?
На самом деле я нихуя не понимаю, где это выставлять, и как это повлияет на экзешник
На 2 пике надо везде жать "далее" и "финиш"
>>482857
Еще это можно сделать через командную строку если у тебя не VS:
https://learn.microsoft.com/en-us/dotnet/core/deploying/
Тебе надо self-contained executable
https://learn.microsoft.com/en-us/dotnet/core/tools/dotnet-publish
Вобщем поебись с тем что на скринах, я давно не тестил, но это 100% рабочий способ, я им пользовался в 22 студии
Уже поебался, спасибо. Завелось
Гугли AOT компиляцию.
Хотя я думаю там тоже будут ограничения, вроде использования рефлексии и т.д.
>GC в рамках какого-то региона в коде, но не в целом.
вжух и считаем весь код одним большим регионом. Кто тут в сеньоры крайний?
>вжух и считаем весь код одним большим регионом.
Ебало своё имаджинировал когда у тебя в проекте будет 500 файлов?
На, почитай, это не #region какой-нибудь, это метод который вызывается в других методах. В каждом будешь ставить вызов этого говна?
https://learn.microsoft.com/en-us/dotnet/api/system.gc.trystartnogcregion?view=net-6.0
> Объясните, пожалуйста, понятным русским языком
> нахуй оно нужоно?
Конкретно мне это нужно, чтобы создавать списки. Допустим у тебя есть классы: мужчина, женщина, человек, бот, нейросеть. Все они наследуются от разных классов, а некоторые и друг от друга, но все они реализуют интерфейс "двачер". Вот это-то мне и нужно. Мне нужен список двачеров. Я пишу:
> List<IDvacher> dvachersList = new();
> while (Watch.IsWatching(OnDvach)) {
> dvachersList.Add(AbstractTaschMayorFactory.GetMimokrock());
> }
Как-то так. Понел?
Юзать фрипаскаль, генерирующий экзешники по полкилобайта, плюс твой контент, и не зависящие ни от чего, кроме системных библиотек целевой платформы. Если делаешь оконное приложение, подтянет еще 15 кило графониума в экзешник, в винде зависимостей не притянет, а в линуксах притянет в зависимость ГТК или КТ.
Если ты пришёл в шарп и вообще в дотнет за компактными однофайловыми приложениями, то это ты ошибочно пришёл. Здесь другие ребята. Мы собираем ПРОЕКТЫ, ПРОЕКТИЩА, с кучей либ, которые запаковываем в инсталлеры, которые после загрузки и запуска пользователем чекают пререквизиты и предлагают юзеру докачать при их отсутствии.
Это если не знать про strip и флаги оптимизации.
https://github.com/dotnet/coreclr/tree/775003a4c72f0acc37eab84628fcef541533ba4e/Documentation
Мало того, что депрекейтед все уехало в другую репу, так еще и куча невнятных статей из нулевых и 10-х годов. Зачем ты это притащил сюда?
Через System.Environment.OSVersion можешь определить, какая у пользователя винда, а дальше через if/else.
походить там около опции
<PublishTrimmed>true</PublishTrimmed>
и доки почитать, а то оно натримает )
https://learn.microsoft.com/en-us/dotnet/core/deploying/trimming/trimming-options
Тупой вопрос. Ровно затем же зачем вообще появились языки программирования. Чтобы человек мог объяснить машине, что он хочет от нее на более понятном для себя языке и с наименьшим числом смысловых единиц.
Апофеозом всего этого будет один единственный метод DoPizdato()
Потому что читай в оригинале.
Весь сахар в C# - ахуенен, я не могу привести ни одного примера сахара который бы выглядел хуёво или непонятно. Лямбды понятны интуитивно если у тебя больше 9 классов образования или хотя бы ПТУ где давался матан. Авто-свойства тоже понятны: генерятся backing field и 2 метода get set. Различные *=, +=, -=, /= пришли вообще из других языков которым по сто лет и так же являются интуитивно понятными. Сахар над событиями точно такой же как и над свойствами. Сахар с проверкой на null: myDelegate?.Invoke() - тоже понятен если его один раз увидеть. Оператор ?? тоже понятный с первого раза: если слева Null - делаем то что справа, иначе слева. Хуй его знает, что тебе непонятно.
опять же
понятно != изящно
>генерятся backing field и 2 метода get set
и нет доступа к этому backing field. хочешь в геттер сеттер что то свое - пиши полную портянку
сахар event работает с делегатами. из-за этого неудобна отписка (выше много об этом писал), да еще по этой же причине полная жопа с многопоточностью
await ура ура, но нет чтобы сделать await и await! допустим. нет. пиши ConfigureAwait() в каждом вызове.
изящно уровня "да нихера не изящно. дичь"
конструктор обязан иметь имя класса. Пошло с жавы, но увы это не изящно.
лямбды с его обязательными ()=>
(Class) vs var as Class - часто вижу как народ использует as ВЕЗДЕ
Раз уж так лучше было бы as?
хватит пожалуй
Ну що тут сказати?
В связи с недавними событиями (Z-событиями) количество легаси вангую поубавится.
Потому что поддержки нет. Фирмы ушли. Они конечно вернутся, но будут ли их ждать? И будут ли на них полагаться?
Это же, выражаясь языком инфобезопасности, компрометация. Все ушедшие с рынка фирмы на многие годы скомпрометировали себя, как ненадёжная хуйня, которая может отказать в обслуживании клиентам по независящим от клиентов причинам.
Однако это может не помочь и шарпу. Сейчас-то он как бы опенсорц, но все мы прекрасно понимаем, какой "опенсорц" у майков. Кто-нибудь вообще собирал из исходников дотнет с мсбилдом?
А опенорсный опенсорс.
Так исторически сложилось, а на переписывание кодовой базы на шарп с джавы мало кто согласится выделить бабла. Проще со старой жабы то есть восьмой мигрировать на 11/17 либо сразу на котлин, это в десятки раз дешевле будет.
Ну под эльбрусы дотнет сделали, значит как минимум они собирали. Будем пользоваться нашим православным мцст.нет если что
делаю свой стартапчик
стек с++ (функционал) питон (бек+функционал) +nginx
с ui на авалонии(c#) какие есть тулкиты под неe
Думаешь шарп столько проживет?
Калипта Анны, которая считается самой быстрой птицей в мире относительно своего размера, может развивать скорость до 80 км в час.
Задача
Напишите программу, чтобы вывести, сколько километров она будет преодолевать каждый час за 5 часов полета.
Выходные данные
80
160
240
320
400
Подсказка
Просто умножьте 80 на счетчик для каждой итерации.
Используйте цикл for для итеративного выполнения умножения.
Я вот сейчас час думал над тем, что требуется, даже заснул от того, что сложно понять. Что она. По условию задачки. Летит на максимальной скорости и надо просто количество км с нуля каждый час выводить. ПРИ УСЛОВИИ, ЧТО НЕПРЕРЫВНО ЛЕТИТ ПО ПРЯМОЙ!!!
Пиздос, ну кто так условия ставит.
А как проходит ваш день?
Вы видите копию треда, сохраненную 8 ноября 2022 года.
Скачать тред: только с превью, с превью и прикрепленными файлами.
Второй вариант может долго скачиваться. Файлы будут только в живых или недавно утонувших тредах. Подробнее
Если вам полезен архив М.Двача, пожертвуйте на оплату сервера.