Это копия, сохраненная 29 июня 2023 года.
Скачать тред: только с превью, с превью и прикрепленными файлами.
Второй вариант может долго скачиваться. Файлы будут только в живых или недавно утонувших тредах. Подробнее
Если вам полезен архив М.Двача, пожертвуйте на оплату сервера.
— https://dotnet.microsoft.com/learn
— https://ru.stackoverflow.com/a/416585/422180
— https://metanit.com
— https://professorweb.ru
2. С# для веб
— https://docs.microsoft.com/ru-ru/aspnet/core
3. C# для десктопа
— https://docs.microsoft.com/ru-ru/dotnet/desktop
4. С# для игр
— https://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
Прошлый тред: >>2621949 (OP)
У каждой точки останова есть условия, это что-то в виде очень простого макроса. Дальше гугли что надо прописывать.
Жалко, что нельзя эти условия как-то сохранять в список.
>и логировать все значения переменной в студии для удобного просмотра в UI
Если Serilog, то есть множество либ, типа
Sink.File, Sink.Debug, Sink.RichTextBox и т.д. У меня первые два, настроил для них разные уровни. Поэтому в окне интерпретации поверхностная информация, а более подробная в файле.
Для NLog наверно тоже самое.
Ну дык вот. Проблема в чем. Вот в чем: Тащить из базы миллион записей, чтобы их на клиенте отфильтровать, сгруппировать - бредово.
В GraphQL - девекстримовский датагрид - не умеет.
odata - не подходит, потому что не умеет в группировки(а они - надо).
Нужно велосипедить свое решение, чтобы поддерживало на стороне сервера группировки, сортиорвки и все это вот.
Ну, собственно - теперь у меня есть вопрос. А КАК?
Типа блин, я реально не понимаю, как мне динамически по имени поля - EF'ом отсортировать как надо, сгруппировать и отфильтровать. Типа мне прилетает запрос вида:
{
public bool RequireTotalCount { get; set; }
public bool RequireGroupCount { get; set; }
public bool IsCountQuery { get; set; }
public bool IsSummaryQuery { get; set; }
public int Skip { get; set; }
public int Take { get; set; }
public SortingInfo[] Sort { get; set; }
public GroupingInfo[] Group { get; set; }
public IList Filter { get; set; }
public SummaryInfo[] TotalSummary { get; set; }
public SummaryInfo[] GroupSummary { get; set; }
public string[] Select { get; set; }
public string[] PreSelect { get; set; }
public bool? RemoteSelect { get; set; }
public bool? RemoteGrouping { get; set; }
public bool? ExpandLinqSumType { get; set; }
public string[] PrimaryKey { get; set; }
public string DefaultSort { get; set; }
public bool? StringToLower { get; set; }
public bool? PaginateViaPrimaryKey { get; set; }
public bool? SortByPrimaryKey { get; set; }
}
Я должен отдать типа
{
data: [{
key: "Group 1",
items: [ ... ],
count: 3,
summary: [30, 20, 40]
},
...
],
totalCount: 200,
summary: [170, 20, 20, 1020],
groupCount: 35
}
И если паггинацию, сортировку, да хрен с ней, даже фильтрацию я как-то сделал с помощью DynamicLinq, то вот как мне группировки эти делать - я с душе не ебу, хоть убей.
Объяснить фронтендеру, что нафиг этот датагрид ебаный, тоже не получается, мне говорят что я рукожоп просто(((
Ну дык вот. Проблема в чем. Вот в чем: Тащить из базы миллион записей, чтобы их на клиенте отфильтровать, сгруппировать - бредово.
В GraphQL - девекстримовский датагрид - не умеет.
odata - не подходит, потому что не умеет в группировки(а они - надо).
Нужно велосипедить свое решение, чтобы поддерживало на стороне сервера группировки, сортиорвки и все это вот.
Ну, собственно - теперь у меня есть вопрос. А КАК?
Типа блин, я реально не понимаю, как мне динамически по имени поля - EF'ом отсортировать как надо, сгруппировать и отфильтровать. Типа мне прилетает запрос вида:
{
public bool RequireTotalCount { get; set; }
public bool RequireGroupCount { get; set; }
public bool IsCountQuery { get; set; }
public bool IsSummaryQuery { get; set; }
public int Skip { get; set; }
public int Take { get; set; }
public SortingInfo[] Sort { get; set; }
public GroupingInfo[] Group { get; set; }
public IList Filter { get; set; }
public SummaryInfo[] TotalSummary { get; set; }
public SummaryInfo[] GroupSummary { get; set; }
public string[] Select { get; set; }
public string[] PreSelect { get; set; }
public bool? RemoteSelect { get; set; }
public bool? RemoteGrouping { get; set; }
public bool? ExpandLinqSumType { get; set; }
public string[] PrimaryKey { get; set; }
public string DefaultSort { get; set; }
public bool? StringToLower { get; set; }
public bool? PaginateViaPrimaryKey { get; set; }
public bool? SortByPrimaryKey { get; set; }
}
Я должен отдать типа
{
data: [{
key: "Group 1",
items: [ ... ],
count: 3,
summary: [30, 20, 40]
},
...
],
totalCount: 200,
summary: [170, 20, 20, 1020],
groupCount: 35
}
И если паггинацию, сортировку, да хрен с ней, даже фильтрацию я как-то сделал с помощью DynamicLinq, то вот как мне группировки эти делать - я с душе не ебу, хоть убей.
Объяснить фронтендеру, что нафиг этот датагрид ебаный, тоже не получается, мне говорят что я рукожоп просто(((
>как мне динамически по имени поля - EF'ом отсортировать как надо
Я х.з. честно говоря, последний раз такое года два назад делал. Но насколько помню, пилишь пачку спецификаций которые будут собирать тебе нужные предикаты (либо базовых и конкретных, наследуемых от них, либо универсальных, но тогда понадобится резолвер для приведения имен столбцов в БД к именам свойств сущностей). А потом подсовываешь все эти предикаты в нужные места запроса.
До этого я с ботами не сталкивался, реализовал стейт, чтобы бот понимал последовательные запросы. Аутентификацию добавил, т.е пользователь сохраняется в основной базе даже в случае если он до этого не использовал приложение. Все работает, пока храню контекст в словаре (id, context). Получаю нового пользователя - добавляю в словарь, даю базовый стейт, когда он ливает, то убираю из словаря.
1) Теперь думаю, а где лучше стейт (мб даже сам контекст) хранить? В базе или может в json каком-нибудь? По логике не стоит вообще это пихать в основную бд(там где апи и прочие основные проекты), т.к это ж по-сути только к боту относится. Сделать новую бд? Json кажется костылем, но может быть так делают?
2) Также бот умеет в оповещения (Background jobs). Пользователи могут сам создавать джобы, задавать им время, периодичность. Т.е при выполнении задачи бот посылает пользователю сообщение. Где лучше их хранить, в смысле задачи? Могу сделать бд с таблицей вроде (тип задачи, время, периодичность), либо опять же json?
Наверное глупые вопросы, но мне пока непонятно, что стоит хранить в json помимо всяких конфигов, а что в бд.
>>651551
>Теперь думаю, а где лучше стейт (мб даже сам контекст) хранить? В базе или может в json каком-нибудь? По логике не стоит вообще это пихать в основную бд
SQLite. Маленькое, быстрое и не требует установки доп звисимостей в систему. БД может либо инмемори, либо в одном файле быть.
У меня пимерно такой же проект. Я все что нужно самому боту храню в sqlllite бд.
На второй вопрос тот же ответ.
в жсон конфиги. в бд данные
хранить состояние в теории можно в файлах, но зачем - у нас тут не сайтик на пхп
Храня в файлах получаем весь попутный гемор вида
- а выбирать как? все в память грузить что ли?
- а обновлять частично как?
- а если свет рубанут (процесс умрет), а оно файл как раз писало
- ручное костылирование транзакций.
нафиг оно нужно. правда нужно не забывать что sqlite лочит всю базу на запись. И если вдруг ты из многих потоков будешь активно пытаться писать вида "открыл коннект - записал - закрыл", то можешь легко получить database is locked
Я не знаю как щас с мс оберткой там они ж пул коннектов прикрутили. Но вот с (какой там самый старый провайдер) я получал database is locked.
Оказалось что первый коннект пишет, пришел второй видит занято и ждет. Причем не в очередь становится, а просто через время еще раз пробует. А пока он ждал пришла еще запись. В итоге второй через кучу попыток так и не сможет вклиниться и выдаст ошибку. Пришлось разруливать семафорами, что неудобно
Думал так сделать, спасибо. Уже в принципе сделал.
>>651905
Про локи не думал и пока не сталкивался обычно использовал postgresql/mssql, у меня ещё была идея кэшировать все это, не сильно поможет, но все же. Спасибо за подробный ответ.
А как поступают с неизменяемыми строками, тоже лучше в бд? Я сейчас все ответы бота храню в json, потом через DI прокидываю конфиг в класс, что отправляет сообщения, там он в зависимости от языка пользователя берет из файла нужный ответ. С динамическими ответами сложнее, благо у них тоже структура есть, достаточно взять из конфига, подставить значения прилетевшие с бекенда.
Я это сделал, чтобы не хранить строки в коде и читал в факе о ботах, что желательно подстраивать ответы под язык пользователя.
>Вопрос по теме для диплома, хочу делать на asp .net core и нужна какая-то идея для задания
Как-то по ебанутому у тебя диплом выглядит. Обычно всегда дается одна или несколько тем на выбор, а потом уже к ним ищется инструментарий для выполнения.
>>652193
>какие-то сферы/кейсы где .net core себя проявляет лучше в сравнении с другими
Как бы мне ни нравился C#, но по факту - ни в каких. Есть джава, есть go. Шарп с джавой примерно от одного хуя яйца по возможностям и эффективности. Большинство различий - вкусовщина. Плюс джавы - она более распространена, но за шарпом стоят все бабки майкрософта и они нихуево так вкладываются сейчас в его развитие. За go правда все бабки гугла стоят, но там пока еще сырая архитектура, плюс это гугл, вариант того, что они завтра скажут "мы наигрались, закрываем проект" немаловероятна. Ну может еще в инди-геймдеве шарп кое-где роляет (но я так понимаю диплом ты на этом не построишь).
Сделай какой-нибудь сервис по консолидации грузоперевозок. В нынешних реалиях очень полезно (такие проекты есть и разрабатываются сейчас и за них платят неплохие деньги). А выбор шарпа мотивируй скоростью и удобством разработки, легкостью разворачивания готового сервиса. Если сделашь на .net7 (или даже на превьюшке 8-го), то можешь даже скоростью козырнуть.
>А как поступают с неизменяемыми строками, тоже лучше в бд?
Я бы такой функционал, как ты описал хранил бы в БД наверное. Просто во время работы дергал бы из нее набор для нужного языка и использовал.
Плюс опять же, в случае использования sqlite, ты можешь целый пучок этих баз создать под разную функциональность. Один под хранение стейтов, один под работу с сообщениями на разных языках. Тогда и локов проще избежать будет и ебли с файлами не будет. Просто разные контексты настроишь и все. А файлы бд в случае sqlite вообще мизер будут занимать на диске.
>Как-то по ебанутому у тебя диплом выглядит. Обычно всегда дается одна или несколько тем на выбор, а потом уже к ним ищется инструментарий для выполнения.
Это же чуть ли не клише "студенческая работа", когда человек подбирает задачу под инструмент, а не инструмент под задачу. Такие работы оторваны от жизни, а если хочется впихнуть невпихуемое, то маскируется под "исследование темы", типа "в этой работе я попытался исследовать возможность программирования микроконтроллеров на C#"
>если методу передать массив из 1000 строк, то передастся ссылка или значение?
Это ж насколько у тебя хлебушек в голове, если ты задаешь настолько ебанутые вопросы? Ты не думаешь, что тебе не стоит влезать в кодинг, если ты даже базу о ссылочных и значимых типах не можешь освоить?
https://learn.microsoft.com/ru-ru/dotnet/csharp/programming-guide/arrays/passing-arrays-as-arguments?source=recommendations
Никак не повлияет. Если апишка просит широкий перечисляемый тип, значит код внутри метода сам обо всем позаботится.
Ссылка.
>Большинство различий - вкусовщина
ну да ну да - жрать черствый заплесневелый хлеб или сладкую мягкую булочку...ну да, просто разные вкусы ))
видимо нужно написать дополнение к браузеру чтобы он скрывал этого спамера
Есть же автоскрытие и спеллы для куклы.
Автоматизация предприятий. Особенно что связано с промышленностью и всяким железом.
Написать микроскаду на шарпе под конкретное предприятие - это просто охуеть как приятно, удобно и просто.
Если у тебя специальность прикладная - то я бы что-то в духе: использование компьютерного зрения, для автоматизации работы предприятий такой-то промышленности. Ну, мерил бы там размер крышечек на конвеере и все такое.
Если не прикладная, то можно в криптуху удариться со всякими блокчейнами и прочим.
Если специальность сугубо научная - делай очередную колоночную субд с оптимизацией хранания деревьев в ней.
Да. Из прикладных - еще можно намутить систему управления умным домом, хостить систему на какой-нибудь малинке. Тоже прикольно.
Обосновать шарп всегда можно тем что все есть и требует минимальное число телодвижений, по сравнению с остальным добром, за то и любим.
Вот буквально. Джуны - нам норм каждый раз в Startup/Program добавлять. Мидлы - нам норм. Сеньеры - та хуй знает, а вдруг другие на поймут, найхуй свой метод расширения тащить в проект...
Я как еблан, только в своих частях кода - вот такое делаю.
Просто заебывает именно то, что это у себя-то я делаю, но вынести в отдельный проектик в духе: Project.Common - не разрешают(((
>нам норм каждый раз в Startup/Program добавлять
да. не джун.
потому что так все в одном месте и это место ясно где
а не размазано по проекту
Я не знаю. Может быть я один такой болезненный и если 6 часов ебусь с какой-то сложной логикой - могу забыть зарегистрировать. ХЗ. Меня - напрягает. Особенно, когда сервис который ты писал - где-то в дебрях логики, и чтобы наткнуться на то что ты забыл зарегать что-то, приходится проделать кучу манипуляций, пока не поймаешь эксепшн.
А тесты-то не падают, ведь тестировать что ты все зарегал - муторно, потестировал что сервис работает как надо - залил, потом - прилетает тебе пиздюлей, что ты еблан такой.
Плюс, файлик startup - становится пиздецки огромным у меня. 100 сервисов сделать мне - это как пить дать, я люблю на любой чих - делать отдельный сервис.
>Может быть я один такой болезненный
Я тоже подумывал над таким вариантом.
Но меня останавливает то, что при рефакторинге, можно задолбаться отыскивая какие сервисы у тебя подключены, а какие нет. Плюс если захочешь изменить лайфтайм какай-либо цепочки, то вместо того чтобы в одном месте все изменить, придется по всем сервисам пройтись и в каждом атрибут поменять.
Шарпопетухи занимаются ещё как
Недавно нюхал рыночек вакансий, в итоге решил пообщаться с букмекерами/онлайн казиношниками.
Искали мидла/сеньора для поддержки высоконагруженных сервисов с основным требованием "Уметь быстро и качественно парсить сайты", попросили написать пагинацию коллекции на LINQ без Take/Skip и перебора со счётчиком
Были посланы нахуй за трату моего времени.
А как бы вы реализовали эту пагинацию?
>попросили написать пагинацию коллекции на LINQ без Take/Skip и перебора со счётчиком
Кек. С одной стороны зввдачка на ехуй делать. С другой стороны мощнейший признак того, ясто собеседующий ебобо.
Да я вот что-то придумать не могу, если запрещено писать свой метод.
Через TakeWhile и SkipWhile?
collection.Chunk(size).ElementAt(pageIndex);
nuget MoreLINQ Batch
Ну так дроби
Смотри же как тот же асп.нет делает
Ты подключаешь либы и делаешь
services.AddFeature()
Ну а кто тебе мешает так же делать
Сделать стат класс где методами расширениями разбить эти 100 регистрации на логические секции
А если классы в других модулях кишки котрого не торчат наружу, то унести регистрацию этих классов туда.
Не каждый проект в солюшене торчит кишками наружу, а вполне себе отделяется интрфейсами и ничем не отличаются от либы с нюгета
У меня в качестве халтурной подработки три нормальных микросервиса на очереди стоят. При том что я не фрилансер даже и еще думаю соглашаться или нет. Нормальной работы кругом - жопой жуй. Нахрена еще с парашей вроде парсинга сайтов заниматься?
Ну так он их и получает, либо через свое API, либо по шине.
Ну и опять же микросервисы разные бывают. Не всем в интернете нужно сидеть и мониторить цены на говносайтах.
Вот, например, у меня есть wpf приложение, где UserControlы использую как страницы, загружая в бордер. В каждом UserControlе создаю свой контекст ApplicationContext db = new ApplicationContext();, но нигде не закрываю.
и если можно и не закрывать, то я так понимаю нужно использовать try catch на каждое обращение к базе?
От провайдера зависит, когда ты руками или через юзинг диспоузишь контекст, то он может быть реально не закрыт, а помещен в пул. Также и с открытием.
Тебе не нужно держать контекст долго, т.к в таком случае данные там могут быть несвежие. Юзинг в таком случае твой выбор.
Ещё подумай о том, почему вообще контролы знают о контексте? Мб оно им не надо и стоит сделать абстракцию над AppDbContext, например репозиторий какой-нибудь?
Спасибо
В структуре только ссылка хранится. Ссылки хранятся на стеке или в регистрах, в хипе если подразумевается долгое хранение.
Другие дело, что value types совсем необязательно будут на стеке. Можешь чекнуть статью the truth about value types или как-то так.
То, где будет храниться value type сильно зависит от того как ты его используешь. Но даже так за тебя это jit делает, какую он там стратегию выберет только ему известно
))))))))))
Мне нужно в JSON массиве хранить информацию о всех игровых предметах на сервере. Это ID предмета, тип предмета и тому подобное (скрин 1). Там же мне нужно хранить информацию о стоимости. И отдельными списками хранить офферы для каждого игрока, тоже в JSON массиве.
Более 95% предметов доступны к покупке только через офферы. То есть их нельзя купить напрямую, только если сервер предложил их тебе через оффер. Допустим, набор с 500 монетами можно купить напрямую и сколько угодно раз, а определённое Оружие можно купить только по офферу и только один раз. Я для доступных предметов решил добавить поле IsPublic, чтобы проверять его на сервере может ли игрок купить свободно этот предмет. Но чёт мне не нравится. Может это нужно перенести в GameItemPrice.
Получить предмет можно 3 способами:
- Бесплатно
- За реальные деньги (для этого нужно хранить ProductID товара из реального магазина)
- За виртуальные внутриигровые деньги. У таких денег есть код валюты (Gems или Coins) и может быть скидка. У одного предмета может быть стоимость в разных виртуальных валютах, со скидкой и без
Вопрос: как всё это хранить у игрового предмета и что хранить в офферах?
Набросал первый вариант на 1 скрине. Вроде удобно получается и даже близко к реляционной базе данных. Но возможно для моего случая это избыточно. Ещё набросал второй вариант чуть проще. Возможно он логичнее с той точки зрения, что Free задаётся в самом оффере (если ты выдаёшь предмет бесплатно, как подарок, то это только оффер как ни крути)
Желаю теб чтоб ты срал дальше чем видел. Пока не поймешь, что из-за таких как-ты, современные игры стали полным дерьмом.
Надеюсь ты все осознаешь и станешь заниматься чем-нибудь более полезным.
Ебантяй уже продумал как продавать говно в своей игре, а игру не сделал
Хранение в json не осилил, игродел ёбаный
Уебывай в раздел для юнитидебилов
Моя задача распознать сигнатуру и определить, что это "Folder_A_Folder_B_My_File" имеет отношение к этому "Folder A/Folder B/My File". Вернуть все обратно.
Есть какие нибудь мысли? Если бы я запретил пробелы и прочерки в именовании файлов, то все просто, но я не могу этого сделать.
Условия:
1. Это не путь на диске, а локальный путь в документе приложения, поэтому никаких GetFullName().
2. Я не могу заменить косые черты. Они формируют правильное отображение файла и эти правила я не могу изменить.
Я могу решить задачу в лоб, типа сравнивать две строки посимвольно и при конфликтном символе переходить к сравнению списка возможных символов (пробел или косая черта). Если ни то и не другое, то выдавать false.
Ну скормил ты тулзе файл, а че дальше-то? Она ренеймит и кидает в какой-то каталог или что? И тебе нужно заменить исходных файл из жирно каталога?
Поддвачну шарподебила.
В asp dbcontext обычно регают как scoped, дальше пайплайн сам создаст скоуп на каждый http реквест и все заебись.
Как быть не в asp? У меня также есть dbcontext, который прокидывается в хэндлеры медиатора. Я могу в теории сам создавать скоуп через фабрику в диспетчере, где вызывается медиатр, чтобы все команды и квери получали один инстанс на вызов. Но это выглядит как дрочево, т.е мне придется ещё и фабрику как зависимость прокинуть.
С другой стороны мб регать как transient, но тогда остается проблема, что хэндлеры получат каждый по контексту? Сейчас скоуп работает как синглтон.
Как бы вы регали dbcontext не в asp? Кроме как руками скоуп делать есть варианты?
Кто-нибудь, помогите!
На работе нужно сделать надстройку для excel, используют версию 2010 года.
Я начал сначала по гайдам с vba делать, но потом перешёл на c#, ибо насколько я понял это более гибкое решение.
Создал проект, начал реализовывать первый какой никакой функционал, и обнаружил, что как будто кроме меня этим никто толком и не занимался, в интернете вообще нет информации толковой, единственное что хоть как-то помогало это документация от майков, но там очень много непонятного (в том числе из-за того, что язык я почти не знаю, изучал только python.)
Быть может есть какие-нибудь ресурсы с этим? Ну форумы, статьи, видео, книги и т.д. на примете?
Желательно особенно про сводные таблицы информации.
С меня как обычно.
>Она ренеймит и кидает в какой-то каталог или что?
Именно. Тулза конвертирует файл в другой формат, но ради универсальности с другими приложениями ренеймит полное имя файла. Сконвертированные файлы кидает в каталог.
Моя задача импортировать эти файлы обратно, но расставить всё на свои места в иерархии документа, заменив старые экземпляры импортированными.
Все что мне доступно — это стринговая информация. Я думал мб есть какие-то регулярные выражения для подобной ситуации.
>сделать надстройку для excel,
Макрос или плагин? Каким образом ты взаимодействуешь с приложением?
Или ты типа создаешь свое приложение, которое запускает эксель и пердит в него?
>ибо насколько я понял это более гибкое решение.
Главное чтобы эта гибкость не порвала твою неподготовленную для гибкости жопу.
>как будто кроме меня этим никто толком и не занимался
Та же ситуация. Начинал писать на vba для CorelDraw, Rhinoceros.
Никому это не нужно, все пробуешь методом тыка. Потом перешел на написание плагинов на VB.NET. Но у меня для каждой проги был свой мертвый форум, а через маркет плейс вижуал студии скачивал шаблоны для создания плагинов програм нейм. Названия форумов не всегда очевидны. С экселем не работал.
Ну что могу сказать? Если ты не хочешь положить несколько лет на это дерьмо, а потом выбросить в помойку, то юзай vba. Перейти с бейсика на шарп — дело одной недели.
> Макрос или плагин? Каким образом ты взаимодействуешь с приложением?
Делаю надстройку, а именно панель инструментов.
Сейчас проблема в том, что я не понимаю как можно работать с полем с датами (получать список выделенных или выделять нужные). Прикрепил скрин, должно стать гораздо понятнее.
> Главное чтобы эта гибкость не порвала твою неподготовленную для гибкости жопу.
Тут ты прав, но я постараюсь
> Никому это не нужно, все пробуешь методом тыка. Потом перешел на написание плагинов на VB.NET. Но у меня для каждой проги был свой мертвый форум, а через маркет плейс вижуал студии скачивал шаблоны для создания плагинов програм нейм. Названия форумов не всегда очевидны. С экселем не работал.
Все, что у меня работает тоже сделано методом тыка, понимаю. Возможно поступлю потом так же.
Если я правильно понял твою задачу, то просто вырезаешь в обеих строках спорные символы и сравниваешь, что получилось. Если совпало, то значит это одно и то же. Можешь не вырезать, а заменять (точно так же в обеих строках) на какой-либо общий символ, который не может встречаться ни там, ни там (ну или эскейп последовательность).
>На работе нужно сделать надстройку для excel, используют версию 2010 года.
Hello darkness my old friend...
Тоже годная идея, но нужно как минимум два прохода по символам + операции со стоками.
Есть .NET Core WEB API проект (.NET 7), и я его опубликовал как Windows Sevice на определенной машине.
На самой машине до эндпоинтов достучаться можно, через localhost.
Теперь нужно достучаться до них с другой машины.
Админы говорят что порты открыли (443, 80, 5000) 5000 потому что localhost открывается на нем.
С другой машины доступа нет, скорее всего я чего-то не добавил в сам проект.
Что мне нужно сделать? Я пытался поставить URL самой машины через UseUrls, но это не перезаписало дефолтный URL, сервис все равно доступен только через localhost.
Я перерыл весь гугл но момента похожего на мой не нашел. Во многих примерах есть класс Startup которого нет у меня, нужен ли он для UseUrls? Не понимаю.
>Делаю надстройку, а именно панель инструментов.
VSTO?
>я не понимаю как можно работать с полем с датами
Ну все языки используют одну и ту же библиотеку с одними и теми же методами. Тут только гуглить похожую задачу, смотреть какие методы используются и пытаться адаптировать под себя.
Я эксель вообще не знаю. В таких ситуациях все упирается в знания функционала api.
MDSN форум видел?
https://social.msdn.microsoft.com/Forums/office/en-US/home?forum=exceldev
Эксель форум
https://www.excelforum.com/excel-programming-vba-macros/
Сделай конвертер имён сам, полученные имена пихаешь в словарь, он будет у тебя содержать оригинальное имя и то, которое сделает тебе тулза сторонняя
Потом берешь все файлы в папке вывода, ренеймишь, пихаешь обратно по пути из словаря
(Код примерный)
foreach var f in Directory.GetFiles(путь выхода тулзы сторонней){
var oldPath = dictionary[f.Name]
f.Name = Path.GetFileName(oldPath)
File.Move(f.Path,oldPath)
}
Добро пожаловать в мир COM Interop пердолинга
Гайдов почти нет, если будет установка через в виртуальные рабочие места через сись админа - заворачивай в exe через wix
>Ты там в цикле символы что ли менять собираешься?
У тебя сначала
1. идет цикл замены символов одной строки
2. идет цикл замены символов второй строки
3. цикл сравнения двух строк
Три цикла
>Ну ясен хуй 'операции со строками'
Я имел ввиду, что рождается новый экземпляр строки.
Replace создаст еще одну строку.
>1. идет цикл замены символов одной строки
>2. идет цикл замены символов второй строки
>3. цикл сравнения двух строк
Хуйней не страдай. Под капотом всегда где-нибудь да будет цикл. Либо на уровне шарпа, либо на IL, либо еще глубже. Тебе не похуй ли? Главное, что не ты сам руками перебираешь.
>>656361
>Я имел ввиду, что рождается новый экземпляр строки.
А тебе не похуй ли, что там рождается?
Ну если ты байтоеб дохуя, замени на StringBuilder.
несмотря на то что это типа контекст это все равно что работать с бд в обычном режиме. нужна база? - открыл, почитал/записал, закрыл. И тут DI не нужен. Просто в asp.net есть удобный scope куда можно это приатачить и тогда никто не забудет закрыть коннект или вернуть в пул.
в других приложениях ты сам открываешь когда тебе нужно и закрыаешь, когда не нужно. И никакого смысла цепляться за DI scope нет.
1 вот где у Dictionary метод GetOrAdd
2 Convert.ToHexString выдает HEX строку в верхнем регистре. И там внутри использует HexConverter которого можно попросить дать другой регистр сразу....но он internal
3 StringBuilderCache - интернал
4 ValueStringBuilder - интернал
5 unsafe timer, который не захватывает ExecutionContext (а вместе с ним AsyncLocal) - интернал
6 ListDictionary дженерик версия вообще где?
7 туда же HyvridDictionary
8 сколько лет просит народ сделать настройку для задания ConfigureAwait для сборки.
9 WPF за столько лет не обзавелся диалогом выбора папки
10 SortedList внезапно не "сортированный список".
11 StreamReader.ReadLineAsync возвращает таск.
12 Что там у "byte order" у BinaryReader
13 ну сделайте вы уже системный тип Unit. жалко что ли.
14 а можно мне офф MemoryStream основанный на чанках или пуле? Они то выдали, но блин такое неудобное - управления памятью закрыто. Нет чтобы просто дать возможность передать свой пул, а там хоть чанки, хоть тачанки, хоть шаредпул.
15 контракты похерили (в итоге каждый мудрит свой Guard/Requires), зато себе сделали либу для студии.
правильно. и зачем нужна стандартная библиотека. только велосипеды (как делает буквально каждая софтина на шарпе), только хардкор ))
ps: где ты увидел байтоебство в этом списке я вообще хз. но шарписты - люди с причудами, увидеть могут многое.
Ты имеешь ввиду напрямую писать что-то вроде using (ctx = new AppCtx())?
1 А тестировать как?
2 В моем случае два варианта. Прямо в хэндлерах медиатора создавать, тогда на каждый реквест из другого приложения в моем будет создаваться n раз контекст. N раз потому что неизвестно как построится цепочка вызовов, для каждого реквеста она своя и может содержать несколько вызовов хэндлеров. Либо я открываю контекст где-нибудь, где происходит диспетчеризация вызовов и тащу это на каждый вызов команды, закрываю по возвращению к клиентскому коду.
Просто я подумал, что мне будет выгоднее настроить все похожим с асп образом т.к тулза тоже обрабатывает запросы, но не http
>где ты увидел байтоебство в этом списке я вообще хз
Модель поведения 'схожая до степени смешения', если выражаться юридическим языком.
>1 А тестировать как?
вопрос "как тестировать" сразу встает когда видишь ctx = new AppCtx())
и мс на это дело говорит - суй подставную бд типа sqlite или плоди огород в виде репозитариев (и тогда зачем нам вообще контекст и тяжелый EF)
в общем то я не использую EF ибо тяжело и неудобно.
2 Не ambient context никто не отменял. Другое дело что применение его - очень спорная штука и не всегда возможна.
>все похожим с асп образом т.к тулза тоже обрабатывает запросы
ну если ты можешь создать scope ну создай почему нет (и не забывай про ambient context). Но обычно весь скоуп это просто using
мде. тяжелый ты случай
там только 6+7 частично можно сказать "экономим байтики в памяти", а остальное - банальный оптимизатор под перфоманс, причем оптимизации высокого уровня
просто если ты привык писать медленное и большое - ну что ж...
Нахуй ты высираешься, если тебе нечего сказать по делу, животное обоссанное? Игры у меня уже есть готовые. И заработал я на них уже больше, чем всё твоё нищее семейство уродов вместе взятое за всю жизнь (на пике лишь малый процент). Давай ещё что-нибудь высри, посмеюсь с обезьяны убогой.
>И заработал я на них уже
До-о-о. С такими-то доходами, конечно же, только на дваче советов спрашивать.
>мульён долларов
Лол, хоть бы один разряд скинул для приличия и правдоподобности.
Люди с такими доходами нанимают кодо-макак, а не советы на двачах спрашивают.
Впрочем подозреваю что это возможно доходы галеры, на которую ты гребешь.
>ambient context
Никогда об этом не слышал, почитал, спасибо. Я так понял это некий синглтон, который шарит какой-то ресурс и доступен всем. Поправь, если не прав. Большинство инфы, что нашел утверждает, что это антипаттерн и обычно не применяется.
>обычно весь скоуп это просто using
Да, я просто прокидываю вызывающему коду фабрику, которая создаёт скоуп через юзинг на каждый запрос, получаю диспетчер и дальше через него продолжаю конвейер обработки запроса. Так на каждый запрос контекст создаётся один раз и используется сколько нужно. Немного напрягает, что через эту фабрику можно получить провайдер, но у меня она буквально в одном методе на 5 строк кода задействуется, так что может и ничего
>что это антипаттерн
антипаттерн он типа потому что делает свою работу неявно. А явное лучше неявного...пока это явное не вызывает свои проблемы.
так что тут выбор из двух равных зол
1 неявность есть неявность
2 передавать явно по всем уровням кучу параметров, причем которые не имеют отношения к логике.
>это некий синглтон, который шарит какой-то ресурс и доступен всем
Нет. Ты что то задаешь и она летит дальше по уровням вместе с ExecutionContext и может быть получено внутри твоего кода.
Прямой пример такого: TransactionScope
ты можешь получить транзакцию внутри скоупа через Transaction.Current. и несмотря на то, что это статическое свойство - на деле оно выдаст тебе значение в рамках твоего exeсution flow
Даже если допустить что это правда, как это отменяет факт того что ты ебучая безрукая обезьяна, которой ссут в рот по любому поводу, а за неумение перекладывать жсоны насрали на ебало без задней мысли?
Пиздуй к юнитидебилам, нанимай кодомакаку или инвестируй оставшиеся от лечения СПИДа жопы деньги в курсы программирования
Уебывай отсюда и не возвращайся
Помнишь меня? Я твой бывший проект менеджер. Я узнал тебя по твоим шизоидным словам и высерам. А помнишь, как мы всей галерой нассали тебе в кружку прошлой зимой, на корпоративе? Ты ещё выпила, облизнулась и попросила добавки. А потом тебя пришёл забирать твой ёбырь, тот самый дворник, который на Вернадского изнасиловал собаку и получил условный срок за то, что украл плавленный сырок в магазине. Он зашёл ресторан, все стали смеяться, а ты обосралася под себя от стыда, а потом сказала, что всю жизнь будешь ненавидеть изучать дотнет, но недавно, когда ты в очередной выставил доходы всей галеры за свои, чтобы их унизить, то они пустили тебя по кругу, после чего тебе наложили на анус восемь швов. Как поживаешь?
Задача:
Пишу надстройку в excel (vsto c# excel interop), а именно ленту (панельку с кнопками полезными)
Проблема:
Не могу установить свойство Visible класса PivotItem, подробности на прикрепленных скринах.
1 пик - наглядно то, что я хочу делать видимым
2 пик - кусок кода кнопки, которая должна это сделать, там же исключение
Спустя N часов ручного перебора выявил, что все работает, если
Это:
pivotItem.Visible = true;
Заменить на это:
field.PivotItems().Item(pivotItem.Name).Visible = true;
Похоже pivotItem не является экземпляром списка, либо какой-то другой тип. Но это очень странно.
Сравни экземпляры неработающего и работающего pivotItem ради интереса
Вместо месседжбоксов пиши инфу хотя бы в Debug.WriteLine("твое сообщение"), иначе заебешься отключать 10500 месседжбоксов при отладке, особенно когда в ход пойдут циклы. Пишется сообщение в окно интерпретации (если оно не открыто).
Возможно при работе с экселем это будет геморно, тогда один раз настрой себе логгирование, либо создай тестовое окно с листбоксом каким нибудь и печатай туда.
А еще не пиши вот так
"Min: " + DateMin.ToString() + ", Max"
А пиши хотя бы вот так
$"Min: {DateMin}, Max"
Т.е. перед строкой ставишь знак доллара, далее пишешь сообщение одной строкой
$"Min: , Max" без мудоебских конкатенаций, а потом в эту строку вставляешь в любом месте данные в фигурных скобках, для которых автоматом будет вызван метод .ToString(). Так удобнее.
С помощью апи не хочу, там ключ передавать нужно, к тому же наверное лимиты есть + задержка.
Второй вариант работает хорошо, с нугета скачал врапер, быстро работает и устраивает.
Норм ли хранить на бекенде эту программу? Враппер только аргументы ей передает, а сама она на плюсах написана.
Может есть решение в прямо шарпах? Хотелось бы, чтобы css тоже поддерживался, но для меня главное просто чтобы он из таблицы html делал картинку
> Похоже pivotItem не является экземпляром списка, либо какой-то другой тип. Но это очень странно.
> Сравни экземпляры неработающего и работающего pivotItem ради интереса
У меня голова от этого шарпа уже кипит, может потом...
> Вместо месседжбоксов пиши инфу хотя бы в Debug.WriteLine("твое сообщение"), иначе заебешься отключать 10500 месседжбоксов при отладке, особенно когда в ход пойдут циклы. Пишется сообщение в окно интерпретации (если оно не открыто).
Спасибо, так и сделаю.
> Возможно при работе с экселем это будет геморно, тогда один раз настрой себе логгирование, либо создай тестовое окно с листбоксом каким нибудь и печатай туда.
> А еще не пиши вот так
> "Min: " + DateMin.ToString() + ", Max"
> А пиши хотя бы вот так
> $"Min: {DateMin}, Max"
О, это как f-строки в питоне, прикольно.
Проработал год и 3 месяца в мухосранской продуктовой конторе. Недавно сократили штаб. На проекте про SOLID и паттерны знал только я . Нет опыта работы с микросервисами ,докерами и брокерами сообщений. Уже месяц не могу найти работу. Что посоветуете делать ? Идти в кассиры? На собесы не зовут, я даже не знаю какой у меня уровень . Субд использовал Mysql, но как я понял,что он никому нахуй не нужен
Приходится дублировать сообщение.
Это как? Вот запустил ты серверное приложение на линуксовой виртуалке, где нет монитора. Как там рисовать винформы?
Постоянно WTF при работе с ними
Накосячили с IReadOnly*, и вот спустя 2 десятка лет додумались что нужны фрозен коллекции.
Вот у меня допустим byte[] и как мне его сделать риоднли? А никак. AsReadOnly вернет ReadOnlyCollection что вообще не то же самое. Сразу идут лесом AsSpan и CollectionsMarshal ничего не знает ни про какие ReadOnlyCollection по понятным причинам.
использовать List? так мне спан нужен. Ну ладно есть CollectionsMarshal, вот только ему нужен List который не ридонли ни в каком месте.
вот будет шарп 8... а там точно будет FrozenArray? думаю нет. И все методы что принимают byte[] не будут знать как с таким работать, то есть ситуация так и останется - "а ты не меняй вот. ишь че захотел - ридонли ему подавай - просто не меняй ничего и будет тебе риондли. а если ты поменял то ссзб. И вообще, ты шарпист же - терпи. Контракты? Безопасность? все это для лошков. Шарпист не боится вернуть Ilist и верить что никто его не изменит, не боится также null и вообще он смелый и упорный (в плане обхождения граблей)."
ну то есть я могу использовать и использую Memory, но это все же костыль.
Можешь рассказать что вы делали на работе и какой стек использовали? Я пока ещё новичок, хотел бы узнать о том, что используют на реальной работе, чтоб понять на что делать упор.
Субд пока только mssql и sqlite использовал, разве в них есть различия с mysql, чтобы было сложно перейти? Они ведь все примерно один sql используют. И разве сейчас работают напрямую с базой не через orm помимо каких-то специфичных ситуаций? Спасибо если ответишь
>Субд пока только mssql и sqlite использовал
Я не он, но поотвечаю.
SQLite в энтерпрайзе не используют, т.к. там в ней слишком много ограничений и нет необходимости в ее легковесности и портабельности.
MSSql используют много где, но сейчас наступила пора импортозамещения и все массово переходят на постгрес.
MySql на шарпе вообще ни разу не встречал, честно говоря не знаю почему, т.к. мало с ней знаком.
Еще раньше попадался Oracle, но с него уже почти все слезли и новых проекто начинать точно никто не будет.
Сейчас практически везде рулит постгрес поэтому учи его - не ошибешься.
>>657971
>И разве сейчас работают напрямую с базой не через orm помимо каких-то специфичных ситуаций?
Даже если у тебя будет проект с философией ORM-онли, то ситуаций когда тебе по работе придется лезть в базу и писать разные запросы будет очень много. Для тестов, анализа, починки сломанного и т.д. Плюс опять же, чтобы нормально и продуктивно работать с ORM, нужно как минимум иметь представление, что она делает под капотом. Ну и на каком-то этапе тебе возможно придется даже разбирать построенные ей запросы, чтобы понимать какого хуя БД так тяжело ворочается.
Я про случай для десктопного приложения.
Вообще у логгеров есть модули способа вывода, которые подключаются по необходимости. У меня так в файл и дебаг-окно выводится одно и то же сообщение, но конкретно расширения для вывода в месседжбокс я почему-то не увидел, хотя совершенно очевидно, что на десктопе при Error и Critical Error в 99% случаев требуется уведомление пользователя месседжбоксом.
Хотя есть шанс, что такой подход может обернуться пердежом тысячей диалоговых окон.
Я предполагал, что логгеру можно хотя бы передавать делегат, который он мог бы запускать. А сейчас получается лишняя работа и дублирование информации.
А еще мне непонятно как регистрируется код ошибки. Возьмем к примеру условную ошибку в вижуал студии "XLS0112". Кто дал название этой ошибке? Это все делается вручную или есть подход делать это автоматом? Или создается какая-то база данных всех ошибок? В какой последовательности регистрируются? Разработка идет непоследовательно и может получиться так, что сначала идет ошибка №112, а следующей строкой ошибка №330 — это норма?
>в 99% случаев требуется уведомление пользователя месседжбоксом.
Уведомления пользователя - это не забота логгера.
Есть 4 радиокнопки в окне, использующие данный стиль (пикрил 2). Одна кнопка сама по себе, а три остальные находятся в PopUp. Так вот, те, что в попапе, игнорируют состояние свойства, определенное стилем (смотрите окно свойств). А если я укажу явно способ выравнивания, то окно свойств вообще отказывается визуализировать (пикрил 3).
Первая радиокнопка не имеет подобных аномалий. Замечу, что это касается только окна свойств, по факту кнопка ведет себя соответствующе стилю. Я могу еще понять, почему не отображается актуальный размер кнопки, ведь попап скрыт, но выравнивание же не зависит от внешних факторов?
Почему? Это просто вариант отчетности, к тому же у него уже есть вся информация. Почему я должен эту информацию нерационально дублировать?
Потому что основная задача логгера сохранять историю событий (запросы, ошбики и т.д.) в логгируемой системе в каком-либо хранилище (окно консоли, файл, БД и т.д.). Причем делать он должен это максимально быстро и даже в случае падения основной системы.
Уведомление пользователей это другой слой абстракций и ты его либо реализуешь в основной системе отдельно, либо если тебе так нужно уже после логгера отдельным сервисом.
А ты впиши IsOpen тру и узнаешь
> Люди с такими доходами нанимают кодо-макак, а не советы на двачах спрашивают
Люди с такими доходами сами решают, что им делать. Мне нет смысла нанимать людей, открывать компанию, в разы увеличивать расходы и ответственность, и постоянно бегать кабанчиком. Когда я могу спокойно сидеть дома, получать пассивный заработок и потихоньку, в своё удовольствие, создавать новые игры.
>>656870
>>656871
Нормально работо-скот порвался. Да, кстати, вчера пришла выплата с рекламы. Сколько вам и вашим нищим, убогим семействам и всей родне придётся работать, чтобы столько заработать? А у меня это просто пассивный заработок. Один из нескольких, если быть точнее. Удачи поработать на дядю, клоуны. Можете не отвечать, мне более не интересно тявканье нищего говна.
>все массово переходят на постгрес
Спасибо, буду его использовать
>придется лезть в базу и писать разные запросы
Это делается через ado net? Его я ещё не смотрел. Пока что только через mssql management studio писал запросы. Учился на базе northwind, т.к ее рекомендуют майкрософт и читал теорию баз данных про нормализации, индексирование и прочее, но пока не приходилось применять в проектах.
Значит джуну нужно с этим ado net разбираться?
Сейчас я изучил сам шарп, asp net razor pages, asp net web api, не изучал пока mvc, signalr, grpc. Смысла mvc не понял, то же самое ведь делает razor pages. Решил, что это пережиток прошлого и не очень нужно сегодня. Да и на веб апи можно сделать то же время, просто spa на клиенте использовать. Путаница какая-то, эти две технологии делают примерно одно и то же в контексте создания сайта.
Спасибо за ответы
>Можете не отвечать, мне более не интересно
А я отвечу, т.к. знаю, что ты все равно прочитаешь.
Все равно, как если бы наркобарыга пришел и начал задавать вопросы как ему лучше толкать наркоту, был бы справедливо обоссан и потом начал возмущаться в стиле "зато я бабки гребу лопатой, а вы нищеброды"
То что ты дохрена зарабатываешь, не отменяет того. что ты зарабатываешь на дерьме и место твое у параши.
>Это делается через ado net?
Нет, я не это имел в виду.
Тебе придется периодически брать в руки инструмент вроде mssql management studio, или PgAdmin (постгресовский инструмент), подключаться через них к БД и смотреть, что там внутри твориться и правльно ли отрабатывает твое приложение. А для этого придется составлять запросы для выборки данных и помещения каких-нибудь тестовых наборов данных в БД.
И лучше всего используй DBeaver CE. Он бесплатен и позволяет подключаться практически к любому виду баз, составлять любые sql-запросы и намного удобнее и быстрее чем родные клиенты для разных БД.
Насчет ADO.Net - х.з. стоит ли его учить вообще, с вероятностью в 90% тебе придется работать либо с EF либо с Dapper-ом (которые кстати по сути надстройка над ADO). Я за последние несколько лет даже упоминаний об ADO в проектах не встречал.
Насчет razor pages и MVC не скажу, т.к. на шарпе работаю только до WebAPI, дальше уже обычно идет что-нибудь вроде реактового UI, либо ничего не идет. Razor наверное понадобится знать только если в Blazor пойдешь, т.к. он вроде как является их развитием. И SignalR тоже там где-то трется.
А вот grpc надо изучать, т.к. это по сути уже стандарт и в случае микросервисной архитектуры точно с ним столкнешься. А так же еще брокеры сообщений вроде RabbitMQ тоже понадобится знать.
>лучше всего используй DBeaver CE
Спасибо, учту
>Насчет ADO.Net - х.з. стоит ли его учить вообще, с вероятностью в 90% тебе придется работать либо с EF либо с Dapper-ом
Я так и думал до этого.
>WebAPI, дальше уже обычно идет что-нибудь вроде реактового UI
Кстати сильно ли нужно знать эти js фреймворки? Слышал мнение, что новичка вряд ли возьмут не фулстек и нужно одновременно знать .net со всеми необходимыми технологиями и js/ts с его фреймворками. Я сначала использовал голый ajax, потом Vue.js, но никогда не изучал их как .net, просто использовал для написания клиентов к своим проектам.
>SignalR тоже там где-то трется
Хотел его изучить, т.к думал, что он также нужен как и grpc, но видимо это что-то специфичное как Blazor. Real time communication звучит как что-то полезное.
>grpc надо изучать, т.к. это по сути уже стандарт и в случае микросервисной архитектуры точно с ним столкнешься. А так же еще брокеры сообщений вроде RabbitMQ тоже понадобится знать.
Пока имею очень смутное представление о микросервисах. Кажется, что это набор проектов webapi, которые как-то между собой коммуницируют, возможно с помощью вот этого RabbitMQ или каких-то ещё технологий.
Я смогу изучить как работать с микросервисами дома на локальной машине, как со всем остальным до этого?
Везде в вакансиях где пишут про микросервисы есть что-то вроде "требуется опыт работы с микросервисами", то есть подразумевается, что человек уже на другой работе имел дело с ними?
Вот я и подумал, что их изучают уже на работе в реальных проектах.
>>люди с такими доходами
187 баксов заработал
Старина, сьеби отсюда и дрочи свои копейки в другом месте
>Смысла mvc не понял, то же самое ведь делает razor pages
не не то же самое. MVC/MVP/MVVM - разные подходы логического разделения приложения. У каждого свои достоинства и недостатки. И не пережиток прошлого это. Как раз наоборот - razor pages для любителей "пережитка прошлого", кто привык там писать в стиле вебформс и "не нужным мне ваши MVC, и не заставите, я привык как в вебформс" (это как люди после винформс идут в WPF и все равно пишут так будто они в винформс)
>Кстати сильно ли нужно знать эти js фреймворки? Слышал мнение, что новичка вряд ли возьмут не фулстек и нужно одновременно знать .net со всеми необходимыми технологиями и js/ts с его фреймворками.
Новичков да, очень часто берут на позиции где минимум 30% будет работ по фронту. Потом уже когда появится опыт сможешь говорить на каком органе ты фронт вертел и почему не будешь им заниматься.
Но в любом случае знание js и какого-нибудь js-фреймворка типа react или angular будет очень большим подспорьем в работе. Как минимум придется разворачивать себе тестовые стенды с фронтом, дебажить его и т.д. Т.е. понимание как это работает может очень пригодиться.
>>658805
>Я смогу изучить как работать с микросервисами дома на локальной машине, как со всем остальным до этого?
Теоретически да, но я бы посоветовал прикупить себе какую-нибудь дешманскую vps-ку и на ней экспериментриовать. Так во первых лучше изучишь различные сетевые технологии, поймешь как происходит деплой и не будешь убивать свою рабочую машину.
>>658805
>то есть подразумевается, что человек уже на другой работе имел дело с ними?
Таки да. Т.к. даже если ты у себя дома сможешь развернуть какой-нибудь кластер с микросервисами, ты вряд ли сможешь обеспечить его нормальной нагрузкой и реальными задачами.
Собственно вся суть, почему везде требуют именно коммерческий опыт, потому что только на реальных проектах ты сможешь научиться решать реальные задачи нужные бизнесу. Т.е. не вылизанные учебные недопроекты в вакууме, где все расписано и все понятно. А стандартные "Распараллелить вот чё там под этой кнопкой на 2-3 потока, если получится" и "тут где-то проблема, надо найти и устранить".
Понятно. Спасибо большое
https://www.youtube.com/watch?v=IrlBW2Oa_8Y
Джава дебил даже видео осилить не мог.
Во первых он не говорит о том, что джава лучше шарпа, а просто сравнивает фичи которые появились в джаве на пару лет раньше чем в шарпе. И в сравнении они получаются плюс минус одинаковыми, за исключением некоторых мелочей.
Во вторых. В шарпе если, что-то появляется и оно народу заходит, то этим начинают пользоваться. В джаве же ты будешь сидеть хорошо если на 14-й версии, а в большинстве случаев вообще на древней восьмой. И тебе ни тепло, ни холодно будет от этих новых фичей.
С первым апреля от Ника!
А почему ты в выходной прибежал в шарпотред кстати? Так сильно горит, что шарп вытесняет джаву из бэкенда даже в российский банках?
Это просто отключает contextmenu, меня устраивает то, которое по умолчанию. Ладно, просто ключи тогда раздам.
>RB Whitaker - The C# Player's Guide
Нормальная книга для начала?
Пытаюсь собрать ASP NET веб приложение на WebForms в VisualStudio 2019 на NetFramework 4.7.
Подскажи как поменять версию языка?
Интернеты говорят в корне проекта должен лежать файл prjName.csproj, в котором можно поправить свойство. Но файла нет. Есть только веб.конфиг.
Создай в студии новый ASP.NET проект, скопируй оттуда .csproj файл в свой проект и отредактируй как тебе нужно.
Оказалось что в VisualStudio есть две опции при создании нового проекта, пикрелейтед.
Новый проект веб приложения имеет *.csproj файл, а веб сайт нет.
Если подсунуть файл от веб приложения к веб сайту, он, ожидаемо, не используется.
Я пытаюсь унаследоваться от уже скомпилированного сайта/приложения, который нашел на IIS сервере.
По структуре каталога скомпиленного сайта он больше похоже на "веб сайт", поэтому его и использовал при создании нового проекта.
Возможно, для веб сайта есть другие опции по изменении версии языка?
Или, судя по "имеет ограниченную поддержку MSBuild" оно вообще не умеет в более высокие версии?
Хотя сама IDE предлагает обновить версию. Но не справляется и упирается в ошибку.
>.NET 10 или как его теперь начнут называть .NET X
> Почему .NET 10 и где .NET 9?
> "У нас так принято." - Дословный перевод.
Бля, когда же человек отвечающий за нейминг версий продуктов в майкрософте сдохнет нахуй уже.
Что винда, что приставки, что фреймворки - сплошной ебанизм в версиях.
Алсо я в курсе, что это первоапрельская статья, но это не отменяет того, что в майкрософте уебанский нейминг версий продуктов. Меня просто тригернуло.
Ненавижу 1 апреля.
А что такого? Windows X вроде бы не было.
Нет.
В амазоне и майкрософте (очевидно)
Надо знать алгосы и сисдиз и архитектуру компьютеров, ты должен быть экспертом в этих вопросах. Надо просто уметь написать за выходные на с++ или расте что-нибудь системное типа systemd или прикладное типа транспилятора из питона в сишку, читать исходники опенсорсных системных библиотек и понимать, что в коде делется.
Где здеь ты видишь шарп?
Да и нах нужен это ваш фаанг. Просто заканчиваешь в МГУ по программе повышения квалификации на фин математике. Потом защищаешь к.т.н. и идешь устраиваться в финтех. Всяко лучше чем копаться во внутреннем легаси коде гугла.
У меня есть длл-ка с кучей классов и методов.
Я хочу изменить код одного из этих методов.
Но так, чтобы приложенька до обращалась к нему по имени метода в длл, типа дллКлассНейм.дллМетодНейм() , но при этом фактически выполнялась моя функция.
Никак.
>Как вообще относятся к тем, кто программирует на сишарпе в линуксе?
Ну а ты сам как думаешь? Конечно же считают людьми второго сорта и при встрече в лицо плюют.
>Как вообще относятся к тем, кто программирует на сишарпе в линуксе?
Ну а ты сам как думаешь? Конечно же считают людьми второго сорта и при встрече в лицо плюют.
Ебать, 2 часа.
Я за это время как раз успею длл-ку в код ручками перекопировать.
Энивей, спасибо, анон :3
Только час. Второй доклад до кучи идет про другое. В первом докладе несколько кейсов. Возможно один из них тебе подойдет.
Стоит ли мне задрачивать постгри, если я знаю MySql. SQl он и в африке SQL, только со своими нюансами, или есть вариант свичнуться уже на рабочем месте?
1. Не обновлялся и сидеть на бочке с порхом в надежде, что ничего не сломается.
2. Потратить время на миграцию на новый дотнет.
> только со своими нюансами
В том-то и дело, что нюансов куда больше, чем сам SQL. Начинаешь создавать таблицу и сразу вспотыкаешься: "ой, а где автоинкремент, что за SERIAL, сложна, нипанятна". Лучше заранее подготовится.
1920x1080, 0:03
Ты представляешь объём работы по переписыванию даже среднего по размеру проекта на новый дотнет?
Чел, ты...
Поэтому под версией указывается в скобочках (долгосрочная поддержка) или не указывается. Можешь осесть на долгосрочной (LTS) и минимум 3 года не париться.
>Ты представляешь объём работы по переписыванию даже среднего по размеру проекта на новый дотнет?
Сколько? В конфигурационном файле одну строчку переписать?
Ты же не с дотнета на кор пересаживаешься.
>Ты представляешь объём работы по переписыванию даже среднего по размеру проекта на новый дотнет?
Зависит исключительно от архитектуры. Если изначально написано нормально, то у тебя максимум месяц уйдет даже на 10-к приложений. А если хреново, то ты и одно будешь полгода дрочить.
>если исходные условия подогнать под мой неправильный ответ, то он станет правильным
Работаешь тоже так?
- Сделай нам проект
- Готово, держите
- Но твое говно не работает
- Оно работает, если ... если ... если ... если ...
Ебало представили?
Тебе за это деньги платят
У меня в аспе, перестали генериться дефолтные guid айдишники юзерам в UserManager<User> _userManager.Create();, просто пустые строки, даже не null. Кто-то знает как это фиксить? В интернете нихуя.
Из вариантов я подобрал для себя:
1. Дока мелкософта
2. Метанит
3. Видосики на ютубе. Может быть кто-то знает годные курсы на ютубе?
И ещё вопрос, с какими сложностями я могу столкнуться и как мне их лучше всего избежать? Ну, например, подучив что-то.
сложность одна - как потом на этом зарабатывать.
с этим определись, а потом уже языки выбирай.
Ну с вакансиями плоховато, это да. Питон и жиесть лидируют, само собой.
То есть ты бы советовал придерживаться джаваскрипта?
Метанит и справочник Албахари.
Двачую, помимо фронтенда на реакте дотнетчики еще должны уметь в кубер, докер и azure
Вот это уже ближе, кроме того, что azure сейчас уже никому не нужен.
>опрашивать для каждого вывода?
Да.
>а как посчитать общее количество, если система оффлайн и опросить ее невозможно?
Вообще в нормальных системах в выводе с пейджингом присутствует поле вроде Total, означающее общее количество элементов на всех страницах.
Да хоть с хуйдой.
Если у тебя в организации по регламенту винда - работаешь на винде, если линукс - на линкусе, если пидорство - на маке. Если требований нет - на чем хочешь. Я вот когда на толчке сижу размышляю, вообще на телефоне с андроидом програмки под .net пишу.
Главное чтобы твой конечный продукт запускался на системе целевой машины.
>Я вот когда на толчке сижу размышляю, вообще на телефоне с андроидом програмки под .net пишу.
Прям какая-то мечта советского фантаста...
Я раньше общался с одним челом, который писал на сишарпе, и он говорил, что когда станет богатым, то купит виндовс. Поэтому писал в линупсе в монодевелопе каком-то.
Вот допустим, я хочу чтобы у меня был один поток на все приложение, но, была типа очередь "запуленных" задач. И типа ход выполняю-выполняю, бац, чет долго выполняю, го следующую посмотрим, начал ее и так по всем "задачам" которые запуленны, потом - хобана - вернулись к месту где остановились, посмотрели, че да как и если надо - продолжили.
Но как такое сделать - я чет не представляю.
Почему я такой тупой(((
Хм. Хм. Только такое пока что придумал, пока ждал ответа...
Но это не то. Тут я явно должен сказать в методе - на, бери управление и делай че-то. А я бы хотел не так, хотел бы чтобы сам поток был умный и такой: Ля, чет долго я тут сежу-пержу, го посмотрим че другим задачкам надо.
задача следующая
дан исходник на java с одним классом и одной функцией в нём и нужно с помощью antlr распарсить этот метод и узнать все возможные результаты её работы
А чо не на шарпе?
Берёшь грамматику здесь: https://github.com/antlr/grammars-v4/tree/master/java/java
Грузишь в Antlr, скармливаешь ей исходник, обходишь дерево.
пояснение, на шарпе нужно написать анализатор данного кода, который перед этим распаршен с помощью antlr
собственно спасибо за грамматику.
Есть ли какие доки внятные чтобы понять как это дерево будет выглядеть и как его обходить?
ясен бобер что нужно будет использовать паттерн посетитель, но хотелось бы подробностей
Суть в чём: нужно скомпилить тулзы одного чувака написанные на шарпе, вчера с горем пополам один чувак-пендос помог мне собрать другие тулзы, а с этими в душе не ебу чё делать, ошибка на скрине.
Ссылки:
1. Что компилю https://github.com/gibbed/Gibbed.Avalanche
2. Либы к ней https://github.com/gibbed/Gibbed.ProjectData/
2.1. https://github.com/gibbed/NDesk.Options
2.2 https://github.com/gibbed/Gibbed.IO/tree/e8984c5c3fe8ca73631bcd3152118b768dd1a19a
Либы просто закинуть в папку Gibbed.Avalanche убрав с папок либ постфиксы типа "-main" или "-НАБОРЦИФРИБУКВ".
Помогите тупому, с меня нихуя по традиции.
Дрочит конечно каждый как хочет, но будут смотреть как на дурачка, всё-же шарпы это что-то под винду и UWP, логично будет заниматься языком там, для чего он предназначен.
>А если у меня стоит винда, но я создал виртуалку с линуксом и там программирую на сишарпе. Это нормально или на меня будут смотреть как на дурачка?
Смотреть будут примерно так же как если бы ты поставил виртуалку с виндой на линукс и программировал в ней. Ну т.е. долбоебом тебя будут считать не от того на какой системе ты работаешь, а от того, что на виртуалке при наличии живого машины.
>всё-же шарпы это что-то под винду и UWP, логично будет заниматься языком там, для чего он предназначен.
)))))))
пол лимона далларов уже выплатил или в ростов возвращается?
>. И типа ход выполняю-выполняю, бац, чет долго выполняю, го следующую посмотрим, начал ее и так по всем "задачам" которые запуленны, потом - хобана - вернулись к месту где остановились, посмотрели, че да как и если надо - продолжили.
async/await
или APM с его BeginAction/EndAction
К примеру,
foreach(key, value in collections) { ... }
Угу, а все нормальные браузеры - это Internet Explorer.
Я про NewtonJson, которая качается из NuGet-репозитория, а не сразу доступна внутри dotnet
Написали
>Во всех нормальных языках этот цикл должен
Во первых не должен. Во вторых в C# при необходимости такое можно сделать (хотя оно и будте не нужно в 99% случаев)
1280x720, 0:50
Сорян, на толчке снимать было неудобно, поэтому так.
Просто там откуда он капчует планшеты и ноуты запрещены. Телефоны собственно тоже, но их хотя бы можно протащить при определенной сноровке.
Там же не гарантирован однопоток.
Мне-то надо это в контексте - попробовать на ARM одноядерном с 128MB оперативки - запустить приложение с полноценным дотнетом. А там-то не только оно будет, но и другие службы всякие, ну и линуксу тоже чет надо.
Просто тесты с классическим подходом - приводят к тому - что миллиард тредов создается и большую часть времени - контроллер тратит на то чтобы переключаться между ними. Даже 20 потоков - уже больно.
Из тюрьмы? Или из психиатрической лечебницы?
Цветовая схема у тебя - говно.
Какого ответа ты ждёшь от миддлов со 100к и госзаказами?
вот потому eventы и плохая конструкция в шарпе. Берется слепок подписчиков, начинает обходить, а в этом время кто то отписался и ему не нужны никакие вызовы. Но event про это не знает.
В общем то это решение твоей первой проблемы (лок над списком) - не должно быть никакого лока. Должен быть иммутабельный список
Решение проблемы отписки во время вызова придумаешь сам. ты же умный.
>Property 'Pages' does not support values of type 'PageContent'.
Пиздец, искал решение проблемы и челы 13 лет назад пишут, что это уже тогда известная проблема и предлагают использовать ебаные костыли. Серьезно? за 13 лет это говно не смогли пофиксить? И это уже не первый раз я встречаю подобое. wpf вообще хоть немного жив?
Нет.
Я - да.
А еще сверху про рефлексию, кодген люблю поспрашивать.
А уж если чел мне понравился - еще могу про IL начать спрашивать.
На вашем сисярпе работу то можно найти?
Для чего его вообще сейчас применяют если десктоп никто уже не пилит?
На заводах активно применяется, чтобы байтики туда-сюда гонять.
Для всяких автоматизаций - тоже активно.
Ну и если повезет - бекенд.
Если не повезет - фуллстек говнина с блазором.
Если сильно не повезет - вебформы.
>Для чего его вообще сейчас применяют если десктоп никто уже не пилит?
Половина (ладно, пусть будет треть) русского финтеха на шарпе работает и активно развивается.
>и какой был код изначально.
Это по принципу "Если человек пытается ответить на подобный вопрос, то он однозначно долбоеб и нам не подходит" ?
Это проект для портфолио, чтобы сказать: вот я, вот мой проект, берёте?
ну вообще технически это сахар
out заменяет собой "обьявление + ref". Чем не сахар?
is MyClass variable заменяет собой if(a is MyClass) { ... a as MyClass} - ну вот это самый настоящий сахар.
Если для себя - норм.
Если для поиска работы... Какой-нибудь js-фреймворк был бы более в кассу, но в принципе на blazor вакансии тоже попадаются и я бы не сказал, что на них есть особенная конкуренция. В принципе почему бы и нет. Я бы только советовал сразу разделять чтобы бэк был отдельным проектом, а UI на блазоре, тоже отдельным.
А если c Blazor не получится, а будет просто MVC, то это норм считаеся? Допустим два проекта, первый чистый бэк, а второй MVC, который дергает API первого проекта.
Я могу быть хоть горшком (если тебе вдруг от этого легче) - это ничего не изменит в пхп.
пхп по рождению обладает откровенно паршивым дизайном языка.поэтому на нем было написано невообразимое количество говнокода.
и хоть он с того времени пытался стать похожим на жаву - его наследие навечно с ним. Думаю многие читали статью "фрактал плохого дизайна".
я писал на пхп более 10 лет и был профи в нем. Как и все пхпшники привык не замечать подводные камни и обходить грабли. Но после перехода на питон я понял что это не уровень мастерства, а мазохизм.
никому нельзя начинать изучать программирование с пхп.
Что взять для вката в этот ваш сишарп? Какие книги нынче в тренде?
Тут важно больше не то сколько у тебя проектов и какие-они, а их качество, плюс выполняется ли у них правило 3-х кликов.
Для полиморфизма - интерфейсы.
Чтобы реализовать интерфейсы с пика, у меня, грубо говоря, есть три варианта:
в 1-ом класс AB не получается унаследовать, и приходится копипастить код из классов A и B;
во 2-ом копипасты ещё больше;
в третьем просто один огромный говнокласс, зато без копипасты.
Так?
То есть смысл в том, что я либо делаю 1 класс на сразу несколько интерфейсов, либо неизбежно прихожу к тому, что часть кода придётся копипастить.
Спасибо за внимание.
Нормальные поцоны наследование классов избегают, а когда надо достают из контейнера нужный класс с одним нужным методом
>Где я дурак?
Если мы говорим про наследование, то где-то в твоем ДНК. Спроси у родителей, может они тоже в молодости полиморфизмом без меры баловались.
А если серьезно, ты проебался где-то еще раньше, когда решил, что тебе нужна такая замороченная схема. Т.к. даже если ты сможешь это нормально сделать, оно будет неподдерживаемо и непонятно. Переделывай.
Собственно ситуевина следующая. На одной машине происходит примерно прикриплейд.
В результате - второй TCP-сокет никогда не получает запросы.
Первый - я не контроллирую.
Меня бьют палкой по башке, за то что запросы не доходят.
Проблема в том, что даже если я в своем приложении - грохну чужое, что очевидно неправильно - запросы почему-то начинают доходить только если я сам перезапущусь, а за это тоже грохают по башке.
Че делать?
Ну. Т.е. какая хуйня. Есть чужое приложение, которое открывает активно порты и оно типа в дуалмоде но типа на IPv4. Есть мое, которое типа тоже активно открывает порты, и оно типа в IPv6 и типа тоже в дуалмоде.
Если лежит мое - все нормально до первого доходит, но к нему принципиально IPv6 почему-то не доходит.
Если лежит чужое - все нормально до меня доходит, как IPv4 так и IPv6.
Если оба работаем - до меня доходит исключительно в случае если порты не пересекаются.
При этом все нормально открывается, что и усложнило процесс поиска проблемы.
Нормально делать так:
interface IA{ void Foo(); }
interface IB{ void Bar(); }
interface IC{ void Buz(); }
class A : IA{ void Foo() {}; }
class B : IB{ void Bar() {};}
class C : IC{ void Buz(); }
class MySupperDupperMegaClassOneToRuleThemAll : IA, IB, IC
{
private readonly IA _a = new A();
private readonly IB _b = new B();
private readonly IC _c = new C();
public void Foo() => _a.Foo();
public void Bar() => _b.Bar();
public void Buz() => _c.Buz();
}
В общем. Раз ответов нет.
Решил что буду так делать: Ебаю чужое приложение, открываю сокет на IPv4 и IPv6 и пусть чужое ПО страдает.
byte b) where T:unmanaged
static T Shr<T>(T value, int shift) where T : IUnsignedNumber<T>, IShiftOperators<T, int, T>
{
return value >> shift;
}
ошибся, правильно будет: return value >>> shift;
Можно. Только вот вопрос - нахуя?
Вот серьезно. Чем больше я кодю - тем больше кажутся все эти ограничения - костылями какими-то. Придумываешь сам себе, чтобы хуй пойми зачем. Тесты - все еще писать надо. Все еще надо проверять что у тебя там не запаковано чет. Так на кой хуй жизнь себе усложнять? Делаешь все dynamic и как мужик в 1 строчку проблему решаешь.
А. Насчет можно. Можно в последних версиях шарпа. Да. С тех пор как завезли Generic math. Проблема что оно все еще говно и ты все еще будешь страдать больше, чем с dynamic.
А так - берешь кодген и делаешь просто нужные тебе методы генерацией, если так уж боишься dynamic.
У меня есть программа, точнее плагин к программе, которая работает (и плагин и программа) на C#, но нет инструкций к этой программе и не понятно, как пользоваться одной из её функций. У неё открытый исходный код, который я смотрел, собственно в нём я и нашёл скрытую функцию, и понимаю, как он работает частями, понял, как его активировать (ну я думаю, что понял), но не могу понять, что мне делать дальше и как заставить его работать.
Что посоветуете ?
https://github.com/Lacro59/playnite-successstory-plugin
Вот собственно программа, я не могу понять, как работает SteamЭмулятор встроенный.
Я не знаю, что это такое, я вообще не программист.
Я просто открывал файлы и читал, что там написано.
Сейчас попробую это погуглить и посмотреть.
Ну гляньте кто-нибудь сами пж, я сам не факт, что разберусь.
Напиши конкретнее, в чем ты хочешь разобраться. Хотя бы имя метода поведение которого ты хочешь понять.
https://github.com/Lacro59/playnite-successstory-plugin/blob/42d9964da6290eeda246b88d1f54f9cceb8194b1/source/Clients/SteamEmulators.cs
> Что посоветуете ?
Научиться внятно формулировать что конкретно тебе нужно.
Допустим, я посмотрел код твоего этого SteamEmulators. Беглый взгляд дает понять, что оно - смотрит по дирректориям и собирает список статов и ачивок, вроде как просто читает текстовые файлики в нужном формате и парсит их.
Так вот. Без того чтобы понять - что тебе вообще надо - как-то лень разбираться.
Ну. Т.е. как я понял - есть некая программулина Playnite и плагин позволяет ачивки либо оттуда либо туда отобразить.
А дальше - нужно больше входных данных. Что тебе непонятно, что конкретно не работает, почему ты вопрос не задал на гитхабе.
Спиздел про файл. Совсем бегло смотрел. Оно апишки дергает. В остальном - вроде не спиздел.
>>666415
>>666414
Я хочу разобраться, как использовать эту скрытую функцию.
В файле SuccessStorySettings.cs есть параметр EnableLocal, при его включении уже в самом PlayNite появляется менюшка, в которой необходимо указать путь и id игры, я пытаюсь понять, какой именно путь и id мне надо указать. Вот в файле SteamEmulators.cs описано, как он просматривает папки, которые там указаны, или которую ты укажешь, и читает в этих папках ini файлы. Соответственно, я и указываю этот путь к ini файлу, который он должен прочитать, но ничего не происходит, либо, иногда, он пишет, что я не авторизирован в стиме, и ищет SteamKit2 будто бы работает по тому, что написано в SteamAchievements.cs.
Я в общем хочу понять, как этой функцией в пользоваться в целом...
Может я какие-то требования не выполняю, или что-то не активировал, чтобы эта функция работала, или я в целом не понимаю, как ей пользоваться.
На гитхабе чел отвечает редко, он сидит либо на редите либо на форуме, а на редите, там разработчик PlayNite банит за любые вопросы про эмуляторы, на форуме тоже.
Ну смотри. Вот буквально что делается при включении EnableLocal
Т.е. тебе нужон апи ключ и чтобы через веб оно работало. Как-то так.
> out заменяет собой "обьявление + ref". Чем не сахар?
Out еще обязывает присвоить значение параметра внутри метода
> if(a is MyClass) { ... a as MyClass}
Ты можешь так написать
if(a is MyClass x)
Так оно тебе проверить и приведет к типу, если a is MyClass = true и не надо тогда во вложенном блоке ничего городить
>>666522
Сяп сяп, я понял, как скачивать достижения благодаря API ключу, но не могу понять, как заставить его добавлять достижения из ini файла, созданного эмулятором в базу данных.
Судя по коду на картинке, если я правильно понял, он должен создавать новый файл эмулятора в той же папке, где находится конфиг плагина и переносить туда данные о apikey, название игры, id игры, но я не знаю, как спровоцировать создание этого файла, и всё ещё не понимаю, какие пути указывать в появившейся менюшке (на пике код менюшки, которая появляется в приложении после активации локал), пробовал разные варианты с id и локальным путём файлов. Никакие новые файлы он не создал в собственной базе, только скачал список достижений, а ещё похоже список всех игр со стима и их id, там текстовой файл на 9мб, но как я понимаю, это не то.
В общем теперь мне надо понять, как заставить его перенести данные из ini файла созданного эмулятором по пути AchievementsDirectories.Add("%PUBLIC%\\Documents\\Steam\\CODEX"); , в собственный файл базы данных.
Чел, это опенсорс, а шарп хороший и простой язык для новичка. Чутка поднаторей, разберись. Тут дел то по сути на час времени - форкнуть этот репозиторий, запустить исходники у себя на пк в вижуал студии, посмотреть че там в отладке происходит и поменять код, как тебе нужно. Потом скомпилить, и будет у тебя своя собственная версия этого аддона с нужным тебе функционалом.
Она нужна для того, чтобы без дублирования кода обрабатывать случаи, когда TOptional нужен и когда он не нужен.
Просто пустая структура (без полей и методов и свойств) занимает 1 байт. И по причинам выравнивая в качестве поля структуры она раздувается до 4 байт.
System.Void использовать нельзя в своём коде никак, но и он по информации Маршалла тоже занимает 1 байт, что наверное не правда.
Вот бы все ползьаки вместо насилия над сапортом или разработчиком шли в исходники и разбирались во всем сами.
Вопросы требующие копаться в исходниках должны быть описаны в документации. Иначе будь добр - отвечай, ведь ты писал этот код. Или не выкладывай программу в паблик, а пользуйся сам у себя дома, тогда и вопросов не будет. А то хочешь и рыбку сьесть и на хуй сесть, чтобы и чcв потешить, что твоим говном пользуются, и не брать за это ответственность нихуя не делая для этих пользователей. Наглая безответственная эгоистичная свинина.
>Ну так это буквально и есть сахар)
Так то, если присмотреться, то 95 конструкций языка можно охарактеризовать как сахар. Даже обычный цикл, это по сути сахар над if - goto.
А если копнуть чуть глубже, то в принципе, абсолютно все конструкции, абсолютно любого языка - это сахар, над всего тремя базовыми функциями.
Ну цикл это все таки базовая конструкция
А вот автокаст при is уже нет. Потому и ввели через много лет после is как сахар для сокращения необходимости явного каста после is
А вот в котлине is делает смарт каст и это не сахар а базовая функциональность
https://stackoverflow.com/questions/536349/why-no-icloneablet
Какой вопрос ни задай, кто-нибудь уже задавал его раньше.
Я честно говоря не уверен. Я знаю, что для бинарной логики есть три базовых набора
- AND-OR-NOT
- NAND
- NOR
Каждый из них самодостаточен и позволяет получить все многобразие, но когда я это изучал, вроде как считалось, что штрих шеффера или стрелка пирса слишком заморочены на уровне электроники, чтобы на них все реализовывать и поэтому предпочтительнее первый набор. Как оно там в нынешнее время - я х.з.
Ну тамошние ответы я видел, и они меня не устроили.
> And I implemented ICloneable<T>, then do I implement ICloneable<Foo>? ICloneable<Bar>?
1. Тут-то я согласен, что для такого случая и нужно, чтобы возвращался объект.
Но иногда клонируемый тип явный и конкретный и заявленной проблемы нет.
И например проблема наследования и специфичности типа легко решается, например написав ICloneable<T> where T : struct. Struct может содержать массивы внутри. Тот же например ImmutableArray. Поэтому иногда нужен именно глубокой клон.
> ICloneable is considered a bad API now, since it does not specify whether the result is a deep or a shallow copy.
2. То, что Clone не для всех понимается как глубокая копия, и не гарантирует создание подлинно глубокой копии (т.е. полностью независимого объекта) - так это проблемы реализации и криворукости отдельных людей, а также настройки статических анализаторов. Я например всего его так понимал, что он должен гарантировать создание
3. Да и в общем случае, я думаю у всех иногда возникает необходимость создания глубокой независимой копии объекта, и было бы хорошо, иметь для этого обобщённый интерфейс и какие-то гарантии глубокости.
>1. Тут-то я согласен, что для такого случая и нужно, чтобы возвращался объект.
а я не согласен. что нужно клонировать то и делай ICloneable<Foo> и/или ICloneable<Bar> - а не нужно, то и не делай
Это уже код работающий с ICloneable<> либо сможет скастовать к нужному типу, либо нет, что как бы штатно. От чистого ICloneable тоже толку не особо, ведь он возвращает object и чтобы работать с клоном нужен каст...так какая разница? а никакой
2 тип копии должен быть "ну чтобы был клон по смыслу, а иначе зачем тогда клон"? Если же оно не может быть склонировано (например мы не можем склонировать Stream чтобы получить такого самостоятельного клона) - так оно и не может быть ICloneable.
Все просто и совсем не сердито. Поэтому свой ICloneable<> нормально работает, просто мс опять думает "шарписты дурачки, запутаются, не будем им давать".
А мне потом приходится писать списки вида "мелкософт, ну WTFFFFFFFF"
они просто вернулись к состоянию до "сломали". и никогда лучше уже не станут.
Шрифтодроч - это что-то вроде лампового звука у аудиофилов. Большинство пользователей никакой разницы не почувствует.
1. Логическое И пишется с двумя символами &&. Одно & означает побитовое И, вряд ли оно тебе нужно.
2. 5 < a < 10 вычисляется как true < 10 или false < 10 в зависимости от значения a. Что по-твоему больше, true или 10? Вот и шарп не знает.
3. Где фигурные скобки?
1. Разве && от & (как и || от |) отличаются не лишь только тем, что двойные версии операторов & и | присваивают переменной результат проверяя не каждый операнд, а только необходимый?
Скажем, если x = false && true, то && сразу присвоит x false, ведь логическое и подразумевает, что оба операнда должны быть true.
2. Резонно.
3. А функция у них есть какая-нибудь, или так принято выделять?
1. Нет, && и || работают так, как ты говоришь, но & и | обходят оба операнда целиком, проверяя каждый бит и складывая всё в результат: 5 | 6 = 0b101 | 0b110 = 0b111 = 7.
3. Принято оборачивать в фигурные скобки любые блоки даже из одной инструкции, чтобы в случае потерянного отступа разраб всё равно прочитал код правильно.
поверь. не всем нравится дизайн а-ля веб с крупными элементами и шрифтами. А меньше шрифты выглядят ужасно.
программ разумеется. Большие кнопки, большие надписи, все большое
на авалонии физически нельзя сделать "пусть выглядит как WPF"
капец капча на дваче стала
>Принято оборачивать в фигурные скобки любые блоки даже из одной инструкции
Принято где? Среди вас, петухов?
Не кукарекай петушара любитель гребней {}
Каких программ? Конкретно что ты пишешь?
Программы же разные и соответственно требования к интерфейсу. Вот ты говоришь "любят/не любят" но это бессмысленный пук без указания конкретного применения. Что тебе надо сделать? Если не можешь сказать, значит и не делаешь ничего, только треплешься впустую тупостью как дебил.
Мне правда нужно доказывать что мир идет не туда в плане UX/UI?
Кнопка пуск, приложения метро, электрон..мало что ли?
Там не требования к интерфейсу рулят - там рулят "а мы хатим вот так сделать". А еще сверху может быть приправлено плоским дизайном и по юзабилити это все ЦЕНЗУРА
И конечно же такие же деятели считают что их поделия нравятся людям. Не потому что ситауция "жричодали", а именно нравятся. Потому что... а он так считает и этого ему хватает.
На той же авалонии проще делать именно новомодный дизайн (ох уж эта дебильная тенденация к новодмодному дизайну (пик))и невозможно сделать похожий на нативный.
берешь и биндишь. какая проблема. только сеттеры не забудь если чекбокс не ридонли
Можешь немного подробнее подсказать?
Я, может, хуёво ищу, но толком ничего подходящего не видел.
да вот пример - стартую визуал студию, а там на старте окно с недавними проектами.
Тормозное (зависает в половине случаев, возможно решарпер виноват, я не знаю, я ведь его сразу ставлю и не знаю как без него, но....ммм почему????), убогое - имеем только сортировку по дате запуска (ну ок еще и фильтр по символам, который работает просто невообразимо медленно!!!).
Никакой тебе организации проектов как нужно тебе.
В экран влазит очень мало элементов (ну ок можно раскрыть на весь экран ладно)
Невозможно выделить несколько и удалить их - удаляй по одному
Зато не забыли подпись "вам нравится окно? ставьте лайк"
Это правда такие требования к UI чтобы такое говно сделать?
мда. капча викторина просто капец
л?ша... что это за слово блин
это базовое
твой йоба класс по смыслу это 2 чекбокса
<CheckBox IsChecked="{Binding Read, Mode=TwoWay}">
<CheckBox IsChecked="{Binding Write, Mode=TwoWay}">
если это один чекбокс где Read читается в чекбокс, а пишется во Write, то это дичь. Читают из геттеров, а пишут через сеттеры.
А если мой класс йоба - это вью модель для элементов TreeView?
И тогда CheckBox.IsChecked может/должен быть null, но при этом есть свойства Read и Write как "защита от дурака", чтобы null не сунули.
Пусть будет дичь? Возможно или нет?
>Как поьзователь кликом на чекбокс всунет нулл?
Если автор вью, увидев во вьюМодели свойство bool?, вдруг поставит IsThreeState=True.
Вообще это гипотетическая ситуация, но стало интересно возможно ли как-то забиндить чекбокс на чтение к одному свойству, а на запись - к другому.
Через конвертер/обертку взоможно все
В общем хочу я сделать облако на блазоре (васм)
А Файлки распихивать по разным серверам (Микросервисы).
Все бы ничего только васм омежка и он не может в корс,он может общаться только с родительским сервером.
Все бы ничего только тогда файл будет загружаться дважды (через прокси) тоесть сначала на контроллера лазор сервера а только потом он сделает реквест на контроллер инстанции файлового облака. Конечно это чушь полная.
Есть возможно заставить васм сделать корс запрос только он сделает это через жопу (Без авторизационных хедеров )
И это тоже не вариант для меня.
Третий вариант это конечно имплементировать облако непосредственно в блазор сервере но это хуйня потому что теряются все фичи микросервиса и к тому же у меня из серверов несколько стареньких насов и ноутбуков. А при таком сценарии их использовать не получится, тут нужно полноценный AIO сервер.
Четвертый Вариант реализовать загрузку потоком, тогда прокси сервер может просто редиректить поток на другой сервер и балансировать нагрузку. только моя упер идея заключалась в том что бы юзать чанки для загрузки даже невьебенно огромных файлов а при таком варианте это будет невозможно.
Анончи подскажи, как же все таки изьебнутся и сделать заебись?
это что-то из концепции лайфтаймов, где все живет в рамках какого то лайфтайма. И как раз отлично подходит для любого проекта, где нет явно выраженных скоупов как тот же WPF где время жизни чего либо разное и примитивное управление жизни от DI не подходит
А вот лайфтаймы это мощь. нет утечек, нет проблем с Dispose, нет проблем с отписками - лайфтайм схлопнулся и все автоматически почистилось. Концепт простой как сатиновые трусы (с) - у CancellationTokenSource + Token - та же семантика.
другое дело что WPF фреймворки основаны на концепции слабых ссылок и "GC придет - порядок наведет" и тут уже не так красиво их использовать, ведь та же вьюмодель будет владельцем лайфтайма, а значит нужно ей как то сообщать "ты уже все", а по хорошему вьюмодель сама должна жить в каком то лайфтайме и тогда не забудешь почистить. Когда все принимает лайфтайм, то забыть его невозможно, а значит и забыть очистить граф невозможно.
в очередной раз запощу
https://www.youtube.com/watch?v=Sq_h5bVWJ0k
посмотри, проникнись годными идеями. Конечно понимать годноту идеи и использовать ее - две большие разницы, но лучше все же расти над собой.
Че ты там понаписал? Нихуя непонятно.
Куда блядь у тебя файл будет загружаться? В обычной микросервисной архиетектуре - у тебя просто клиент шлет запрос на гейтвей, тот проверяет авторизацию, даже не читая тела, если все ок - стримит файлик куда тебе там надо.
Какие нахуй корсы? У тебя в контексте микросервисов - все в одном домене крутится, запросы идут через гейтвей, сервисы уже внутри - либо по какому-нибудь rpc либо через шину общаются.
Короче. Я вообще не понимаю что ты там такое придумал. При чем там вообще васм и микросервисы.
Двачаю. Было бы неплохо уметь убивать объекты явно. Но домохозяечность высокоуровневость языка исключает вероятность реализации этой фишки - объекта нет, а корни на него все еще будут присутствовать где-то в ран тайме сохраняя "безопасную" ссылку на мертвый объект. И че может случится если такую ссылку разыменовать хуй его знает. Кому-то придется перепроверять все ссылки. Производительность это точно не прибавит.
> когда там достаточно написать delete object
Вот тебе конструктор. Расскажи как чистить будешь
class Car{
public:
User(World w, CarStrategy s, vector<Component>* c }
...
}
Гц может почистить. Например, передаешь объект и говоришь, чтобы этот объект не пережил ближайшую уборку мусора. Соответственно вложенные объекты, которые в результате перестанут быть досягаемыми, тоже должны умереть. Граф объектов у ГЦ и так на карандаше - можно за одну уборку очистить память как от виновника торжества так и от всех связанных с ним объектов.
GC.Kill(car1);
GC.Collect();
Вот с корнями что делать не понятно. Представь, что ты спустя время, после массы аллокаций, разыменовываешь такой осиротевший корень. И попадаешь вообще хз куда. Что там за объект будет или произвольный кусок объекта. Безопасной и управляемой такую ситуацию не назовешь. Следовательно нужно вводить проверки и кидать эксепшен. Так будет безопасно, однако перспектива словить эксепшен на ровном месте это даже хуже, просто клоунада на ровном месте начнётся. Удаляешь парочку объектов и все, рантайм проклят, поэтому везде трай кетчи, которые ничего полезного не делают, а только страхуют на случай корней с небезопасными ссылками.
Ну. Я сам любитель велосипедить.
Но блин. Почему не Channel-то?
Вот серьезно. У меня создается впечатление, что про них только я да второй кун из соседнего отдела знаем.
Но если тебе принципиально велосипедить, то можно вот так замутить.
ок, возьму на вооружение. Но если рассматривать мой код, это тоже рабочий вариант?
Ничего нормального
Очередь не потокобезопасна как минимум
Нет защиты от ошибок
И вообще хз как оно должно работать
один поток всегда кладёт в очередь. А ошибки, я так понимаю, потенциально в Enqueue, нужно TryEnqueue
Нужно вникать в конкретно что ты там делаешь.
Лучше не выдумывай и просто используй Channels. Можешь такую вот оберточку намутить.
ошибка вообще использовать такую "синхронизацию"
ты вон даже специально задержку сделал чтобы "ну на всякий пожарный"
но это не сработает. представь
1 ты добавляешь в очередь 1й элемент и запускаешь хендлер для его обработки
2 хендлер живо проходит свой семафор и уходит на 200мс в ожидание
3 хендлер пытается извлечь элемент и в этот момент кто то еще раз вызывает добавление. В итоге у тебя происходит гонка и внутреннее состояние Queue идет лесом.
И вообще никогда не пиши в стиле "что то добавил и последней строкой запустил попутно обработку". Это в принципе будет работать, но лучше разделить добавление и обработку на независимые потоки выполнения.
Методы, в которые переменные передаются по ссылке (ref ...), изменяют значение переменных для локального и глобального окружения.
Функции, в которых заново определяется переменная из глобального окружения, изменяют значение только для локального окружения.
Во всём прав? Пик рилейтед.
сука ОБСЕРИЛСЯ с пиком, в третьем *изменяет для локального
>локального окружения
>глобального окружения
Ты о чем? На каком языке ты разговариваешь? Что ты такое?
1 не вижу где бы вообще запускался этот цикл выдирания из очереди. Чей там токен отмены. В каком контексте весь цикл работает.
2 в Enqueue лишний await не нужен
3 а где ConfigureAwait(false). надеешься что не будет контекста синхронизации?
4 (зависит от пункта 1) А когда токен бросит исключение отмены то что будет
5 Что насчет gracefull shutdown
есть разница между "все отменяем нахрен" и "больше элементов не будет, но нам важно дождаться обработки тех, что уже в очереди". То есть если как бы не совсем плевать, то делается какой то механизм чтобы кто-то, кому надо, мог дождаться окончания работы очереди - свойство Task Completion например или еще как.
зы: викторина от капчи убивает. вт?ить. это что такое? а свин?я? свинзя что ли ). муж?к внезапно не мужик. сш?ть???
Какой еще нахуй Local/global scope в шарпе? Откуда ты эту хуйню притащил?
Забивать все абстракциями и где-то в одном месте подключать нужные реализации в зависимости от железяки.
На таком уровне и сам понимаю, хочу глянуть референс имплементации что бы не изобретать велосипед.
Например для обработки всякого рода случайных ошибок есть Polly которую все юзают, может и в моем случае что нибудь подобное есть?
Ну поч. ОПП я знаю , SOLID знаю , про архитектуры тож знаю. Если ты про специфические знания о самом языке , то ясен хуй заного учиться буду.
Хуегаси. После 5.0 ничего ломающего не появилось, только сахар.
Конкретно у этой книги есть хороший перевод, только я не помню у последнего издания или нет. Ищи перевод от DotNetRu.
Его и нашел. Издание 21го года.
Смотрите. Хочу сделать типа доступ к апи по разрешениям.
Ну. Базово: Users.Edit, Users.Delete, вы поняли.
Собственно. Я чет смотрел, че там у майков и там какая-то непонятная фигня с политиками и прочим.
Решил делать велосипед.
Сделал. Работает.
Но тут я вспомнил, что вообще-то у меня микросервисы.
И вот тут - проблемка. Все, от джунов до сеньеров вокруг - считают обычный JWT - говном и вообще. Нужно чтобы был зашифрован.
Шарить ключи при этом никто не хочет.
Делать уродство в духе: при каждом запросе где нужно разрешение - стучаться к серверу авторизации, чтобы проверить разрешения - уже я не хочу.
Собственно. А как умные люди делают-то?
Просто когда я начинал, в голове было такое видение:
//Service A
[Permission("User.Add")]
public IActionResult AddUser(UserAddRequest r)
//Service B
[Permission("Items.Add")]
public IActionResult AddItem(ItemAddRequest r)
Но оно разбивается об описанные выше проблемы.
Вот если бы было можно выставить перед какой-то сервис, который бы ниче про другие сервисы не знает, просто расшифровывает токен, а потом запихивает куда-нибудь разрешения...
Блин. Пока писал - решил, что это в принципе-то норм вариант. Навесить на гейтвей - расшфировку токена, запихивание в какой-нибудь из хедеров все эти пермишны и дальше - погнали.
Но пока это писал - уже понял, что это уязвимость же, типа кто-то прознает и будет сразу вешать эти заголовки в запрос. Хотя конечно можно опять же на гейтвее - чистить их и забивать правильные.
Короче. Умные люди. Посоветуйте чего-нибудь.
Смотрите. Хочу сделать типа доступ к апи по разрешениям.
Ну. Базово: Users.Edit, Users.Delete, вы поняли.
Собственно. Я чет смотрел, че там у майков и там какая-то непонятная фигня с политиками и прочим.
Решил делать велосипед.
Сделал. Работает.
Но тут я вспомнил, что вообще-то у меня микросервисы.
И вот тут - проблемка. Все, от джунов до сеньеров вокруг - считают обычный JWT - говном и вообще. Нужно чтобы был зашифрован.
Шарить ключи при этом никто не хочет.
Делать уродство в духе: при каждом запросе где нужно разрешение - стучаться к серверу авторизации, чтобы проверить разрешения - уже я не хочу.
Собственно. А как умные люди делают-то?
Просто когда я начинал, в голове было такое видение:
//Service A
[Permission("User.Add")]
public IActionResult AddUser(UserAddRequest r)
//Service B
[Permission("Items.Add")]
public IActionResult AddItem(ItemAddRequest r)
Но оно разбивается об описанные выше проблемы.
Вот если бы было можно выставить перед какой-то сервис, который бы ниче про другие сервисы не знает, просто расшифровывает токен, а потом запихивает куда-нибудь разрешения...
Блин. Пока писал - решил, что это в принципе-то норм вариант. Навесить на гейтвей - расшфировку токена, запихивание в какой-нибудь из хедеров все эти пермишны и дальше - погнали.
Но пока это писал - уже понял, что это уязвимость же, типа кто-то прознает и будет сразу вешать эти заголовки в запрос. Хотя конечно можно опять же на гейтвее - чистить их и забивать правильные.
Короче. Умные люди. Посоветуйте чего-нибудь.
Я вот я беру. И хуячу в обход инфраструктуры всякое.
Типа вот есть всякие мидлвары аспнетовские, для всего почти. Там наделали провайдеров, хуяйдеров, фабрик, наследуйся, да расширяй.
Но хуй там. Я предпочитаю не разбираться во всей этой залупе - и хуячу сбоку свою хуйню.
Вот типа помню, была таска - типа делать прокси вида: api/proxy?to={route}. Ну и что бы вы думали? Стал я искать готовое решение? Может быть я посмотрел че там есть такое чтобы упросить себе жизнь?
Не. Я взял и сделал мидлварем вот это вот.
Типа проблему решил. А спать нормально не могу, потому что снится мне в кошмарах, что вдруг я там чет не предусмотрел. Но вроде за 2 года пользованием - никто не жаловался.
Map - сам лист. (Я объявил и инициалировал его в самом начале функции, перед if'ами я его поставил для наглядности.)
Первый if - тот, в результате которого функция возвращает false (а должна true!), хотя ясно, что я присвоил этой переменной лист и сравниваю её с только что созданным листом.
Второй if - тот, который возвращает true.
Объясните пожалуйста почему эти if'ы по разному себя ведут.
Ссылка на if'ы (пикрил): https://pastebin.com/rbUsQfYm
Ссылка на всю функцию: https://pastebin.com/RfMWw4wy
private void dataGridView1_RowHeaderMouseClick(object sender, DataGridViewCellMouseEventArgs e)
{
}
А дальше как?
Как пофиксить этого ебучего пира https://github.com/username1565/CSharpServers/tree/Peer
Хочу децентрализованно раздавать хэш-таблицу, и синхронить её, а оно нихуя не робит. Заебало уже тыкаться. Хочу сделать серверы, в виде модулей, и из модулей этих ебанных - собрать пира, короче. Но чё-то запутался, блядь. Наверное, из-за голого энтузиазма. Бывает.
даже WPF, который пришел ему на смену, и тот уже давно заброшен (хотя абсолютно зря). Я уже много лет как забыл как кодят на винфорсах.
нет. они ушли в UWP, который забросили, потом в WINUI который тоже забрасывают и типа в MAUI, который забросят не успев туда даже перейти.
в любом случае по винформсу ничего сказать не могу. А в WPF для такой задачи я банально навесил attached property на нужные колонки и достаю их в хендлере и знаю по чем сортировать.
не использую EF, но судя по прочитанному - он создает контекст при каждом внедрении, то есть дефолтно это transient
Поэтому и есть вариант использования пула контекстов
builder.Services.AddDbContextPool
чтобы каждый раз контекст не создавать.
А вообще если видишь чужой Services.Add* то переходишь и смотришь исходник и там видно у кого какой лайфтайм, благо в DI от майков их 3 стандартных.
Да , я тоже так подумал. Потому что создал не пустой контсруктор и он отрабатывал каждый раз при переходе по урл, судя по логам.
Почему EF не юзаешь ? Какие еще аналоги есть ?
Потому что не хочу.
Супер тяжелый при старте, а также дополнитнльная прослойка которой нужно разбираться как пояснить чтобы он не нагенерил херь в sql
Альтернатив тонна на разный уровень безумия
Если хорошо разбираешься в какой-то одной, то нет. Вопрос одного-двух дней. Если как чувак выше с вопросом про лайфтаймы, то очень сложно.
а что там учить? прочитать что нового, что изменилось и как мигрировать
Ну иногда могут быть фичи где нужно вникнуть
А ты не боишься, что не сможешь понять дотнет 8? Вдруг там такого наворотят, что по новой надо будет учить?
Я нет. Я полиглот. В первую очередь из-за того что не пытаюсь использовать один язык везде, а признаю что каждый язык силен в чем то и мне лучше знать его чем страдать золотым молотком.
Потому любые фичи что повышают выразительную мощь и позволяют сделать проще я всячески приветствую.
>А ты не боишься
Нет. Я же не джавист какой-нибудь, для которого добавление одного модификатора доступа - это уже пиздец и breaking changes.
Я за 5 лет примерно вот такую цепочку прошел:
.NetFramework 3.5
.NetFramework 4.7
.Net Core 2.0
.Net Core 3.1
.Net Core 6.0
Это не считая всяких минорных версий, .Net Standart и версий разных библиотек.
И как-то норм, нет там таких изменений, чтобы занимало бы больше недели на изучение.
но она же по факту является неткором.
Если не согласен, то попробуй с него с вордом поработай. Потом расскажешь )
Та вообще похуй. С учетом того как сам майкрософт относится к неймингу версий своих продуктов, ебал я в рот правильно называть их версии.
Знаешь почему никто даже не попытался ответить? Потому что почитай стайл гайды.
При одном только открытии репы хочется закрыть т.к. стена файлов и никакой структуры. Открываю рандомный файл а там такой же пиздец.
Стойкое ощущение что по тебе дурка плачет
Так там же есть целая ебическая структура, из кучи разных серверов, и клиентов. Глянь бранчи, штоле, и как они переплетены. Я их хочу как модули сделать. Потому и куча файлов.
Там структура такая:
TcpServer - один сервер TCP
TcpServer -> TcpServers - много серверов на разных айпи и портах
TcpClient -> TcpClients - много клиентов
TcpServers + TcpClients -> TcpClientsServers - TCP серверы и клиенты - в одном приложении
UdpServer - один сервер UDP
UdpServer -> UdpServers - много их
UdpClient -> UdpClients - много клиентов
UdpServers + UdpClients -> UdpClientsServers - клиенты и серверы UDP в одном приложении
То же что и UDP, но с мультикастом, чтобы искать пиров в локальной сети, и коннектится к ним:
UdpMulticastServer
UdpMulticastServer -> UdpMulticastServers
UdpMulticastClient -> UdpMulticastClients
UdpMulticastServers + UdpMulticastClients -> UdpMulticastClientsServers - клиент-сервер (много их).
Та же хуйня, только тут UDP и TCP серверы - работают на общем порту, но отвечают по-разному на разные пакеты:
TcpServers + UdpMulticastServers -> TCPUDPMulticastServers
TcpClients + UdpMulticastClients -> TCPUDPMulticastClients
TCPUDPMulticastServers + TCPUDPMulticastClients -> TCPUDPMulticastClientsServers - это уже пир, как-бы.
Ну а дальше уже, шла разработка пира, только как-то кривовато, и он не пашет нихуя.
Шиза. Уже за csc в скрипте запуска и mono в цивилизованном обществе даже руку не пожмут. А плодить ветки с абсолютно разным кодом это отедльный вид извращенства
И ты так и не пояснил как должны простые смертные читать подобную жесть?
>Шиза. Уже за csc в скрипте запуска и mono в цивилизованном обществе даже руку не пожмут.
А как это говно ещё запускать, если не с под командной строки?
Даблкликом по екзешнику, штоле?
>А плодить ветки с абсолютно разным кодом это отдельный вид извращенства
А что предлагаешь, кучу репозитариев для каждого сервера заебенькать? Хотелось бы чтобы это были отдельные модули, как-бы. Но я особо не силён в модульном программировани, поэтому так.
>>672688
>И ты так и не пояснил как должны простые смертные читать подобную жесть?
Надо стать бессмертным, как я - очевидно же.
Шо там непонятного-то?
Первый метод - возвращает строчку. Второй метод - байты. Это - ответ на запрос.
Ну а третий метод - возвращает TcpClient, тогда, когда подключение есть. Если его нет, то возвращает хуй, какбэ.
А уже имея TcpClient, подключенный к серверу, можно юзая его - слать запросы на этот вот сервер, слать их циклом, и не отключаясь.
Скажи просто честно, ты хоть что то читал по сборке в дотнете?
А про оформление кода и нэйминг?
У тебя ни один стайл гайд не соблюдён. csc никто напрямую не дёргает, все идут прямым путём через мсбилд который и то вызывается через dotnet xxx и потом с готовыми собранными бинарями делают что хотят и где хотят. Моно это привет из 2010
Я честно хуй вообще что сказать, это всё выглядит на столько плохо и неудобно что вообще не понимаю как с этим работать.
Как ты это нечто в дебаг режим загоняешь?
Первый вариант мне нравится, что виртуалка сама по себе контейнер и можно настраивать там окружение: свой дотнет, свои инструменты, но минусы что вижлу на линукс не поставишь и надо работать с вс кодом.
Второй вариант удобен, что работаешь с вижлой, но сам WSL какой-то костыль, который перманентно отжирает у тебя ОЗУ. Если виртуалку можно выключить, то WSL можно только деинсталировать с потерей всех данных.
первое в разы менее удобно
второе может доставить проблем. мало ли с чем тебе придется и как работать. А это все таки костыль.
WSL тоже можно выключить.
так что лучше начинать с WSL пока не упрешься в "да е...й WSL"
> WSL какой-то костыль, который перманентно отжирает у тебя ОЗУ
Если всл1 то он ничего не отжирает, но раз ты про докер то всл2. И внезапно но всл2 просто виртуалка глубоко интегрированная в винду которую можно прибить
Это везение, что режим эмуляции не лагает, не больше
>Скажи просто честно, ты хоть что то читал по сборке в дотнете?
>А про оформление кода и нэйминг?
Ниет. Я же не кодер-шарпист, мне за погромирование не плотят, я на голом энтузиазме пира костылю, чтобы в нанобороду прикрутить его.
Просто в гугле пишу "как сделать хуйнюнейм CSharp", вижу вылазит говнокод всякий, перевариваю эту хуету всю в мозгу, потом открываю NotePad++ в WindowsXP и короче пишу говнокод туда. Потом значит сохраняю его как cs-файл, ну и создаю .bat-файл чтобы откомпилить и протестить. Если что-то выёбывается там, приходится врубать фиксиков, смотреть как они фиксят и короче фиксить, всю эту еботу.
Ну а в линупсах шоб робило - так через mono, .sh файлом конпелирую, и там уже пердолюсь, какбэ.
>У тебя ни один стайл гайд не соблюдён.
А как их блюсти?
>csc никто напрямую не дёргает,
>все идут прямым путём через мсбилд который
>и то вызывается через dotnet xxx
>и потом с готовыми собранными бинарями делают что хотят и где хотят.
Ну вот, я так и думал, как-то, в бинари всё заделать, чтобы оно как модули было, а потом из модулей этих собрать пира и ебись оно конём. Но я до такого уровня, какбы - врядли дойду. Нутыпонел.
>Я честно хуй вообще что сказать, это всё выглядит на столько плохо и неудобно что вообще не понимаю как с этим работать.
А зачем работать? Надо написать заебато, чтобы уже не трогать это говно, и чтобы оно работало, а не над ним чтоб работать.
>Как ты это нечто в дебаг режим загоняешь?
Просто пишу Console.WriteLine где надо, чтоб в консоли лезла инфа, а когда не надо - закомментировал и нету его.
Ну, чё сказать.. Вроде как пофиксил уже этого ебучего пира. Поплыло говно по трубам: https://github.com/username1565/CSharpServers/network
Вот тут короче видно.
Вроде робит, но всё-равно надо фиксить всю хуйню, и тестить, а ещё позакомментить всякое, а то многабукафф лишних вылазит.
1920x1080, 3:35
>Шо там непонятного-то?
>Первый метод - возвращает строчку. Второй метод - байты. Это - ответ на запрос.
>Ну а третий метод - возвращает TcpClient, тогда, когда подключение есть. Если его нет, то возвращает хуй, какбэ
капец у тебя на строчки аллергия. будь твоя воля - ты бы писал все в одну большую строку.
Чел, ты охуенен. Даже представить боюсь через что ты прошел, чтобы у тебя все это вот так получилось. Местные домохозяйки привыкли что за них все делает студия и компилятор, а тебе и так норм, вот они и бесятся, тимлиды хуевы. Скатили тред в перманентное интервью на собесе. Так что не слушай долбоебов, ты очень крут.
суть в том что код должен быть читабелен. Если одному норм - то только одному этот код и нужен. И то только пока он его пишет ибо через год все забудется и он сам ахереет от этой неотформатированной лапши без структуры
Это С++, а не C#
Согласен. Послушал его мысли, посмотрел его работу и много нового для себя извлёк.
Как минимум буду теперь делить части проекта по веткам гита, а не директориям!
Для энтузиастов есть питоны с жабаскриптами. Пишешь на языке профессионалов и просишь помощи - соблюдай стандарты
Ничего не получается. И где это ваше хваленное: микрософт любит линукс? Я уже в самом начале споткнулся.
Хм. Вот тебе картинка как примерно оно работает.
А про твой вопрос. Контекст БД, по умолчанию - Scoped. Т.е. на каждый скоуп создается один экземпляр, который шарится между теми кому эта зависимость нужна.
Там короче надо в переменные где-то записать путь до папки из которой будет запускаться.
Так почему-то на некоторых дистрибутивах.
Вот конкретно с маджарой - сам ебался. Уже забыл че делал конкретно и куда прописывал.
Проверить что оно работает - можешь просто открыва ~/.dotnet и посмотрев что оно установилось, можешь еще и запустить сам dotnet и увидеть вывод с помощью.
Но чтобы оно глобально работало - надо где-то прописать путь до dotnet'а, а где - уже не помню.
Запускаешь cmd
Переходишь в каталог: c:\Program Files (x86)\Microsoft Visual Studio\Installer\
(ну или туда где у тебя установлен инсталлер студии)
Вводишь команду: vs_installer.exe --locale en-US
После этого инсталлер запустится на английском. И при последующих запусках так же будет на английском.
Переключи студию на русский, это решит все твои проблемы.
Похвально. Теперь бы sqlite прихуярить туда как-то, чтобы база данных могла быть пиздатой. У меня есть репа с сиквелайтом тут https://github.com/username1565/KeyValue
И недопиленный бранч с сиквелайтом в наноборде - вот тут: https://github.com/username1565/nanoboard/tree/nanodb-sqlite
Короче, базу вообще переделать бы в виде хэш-таблицы, и тогда уже можно было бы её раздавать в пиринговой сети, децентрализованно. Даже в локальной сети, можно было бы просинхронить базу. К тому же, если использовать sqlite, то можно вообще убрать нафиг ограничение на аттачи, и blob'ами их заливать туда (с каптчёй, разумеется). Каптча встроенная, что заебато. Это всё пока лишь на уровне идеи, и очень много пердолинга. Но, пожалуй - закину всё это в todo, для потомков. А вам бобра, шарпаны.
>привыкли что за них все делает студия и компилятор
Я до того как перекатился в .net, лет 15 писал на разных экзотических языках у которых не было ни нормальных сред разработки, ни инструментов, ни прочего. Точно так же приходилось писать код в текстовых редакторах, делать разные батники для запуска компиляции, отладку через печать в консоль, для некоторых даже самому трансляторы приходилось писать и прочие велосипеды изобретать.
Я это к чему. Ебал я в рот возвращаться ко всему этому пердолингу. После перехода на шарп я только и делаю, что кайфую от того что мне не нужно заниматься всей этой херней. Можно просто сосредоточиться на конкретной задаче и писать код на полном расслабоне.
ого, чёт ты каким то мазохистом раньше был)
>манжару
У меня на ноуте в манжаре даже звук не завелся. Отлетел при первой загрузке и больше не работал.
А ты говоришь дотнет, лол.
Тут дело не в майках, а в линуксе как таковом. Я думаю им нахуй не уперлось поддерживать свои продукты на всем пингвинячьем зоопарке. Они базу сделали, а в остальном ебитесь сами, хотели опенсорс - берите сколько унесете.
Собственно как и со многими другими производителями софта.
Пишешь пет проект, ковыряешь чужие репы. Ничем не отличается от любых других технологий
Репы с 1к+ звездочек за редким исключением говно
Еще бы к ней документацию нормальную.
вещь конечно годная, но если использовать ее на полную катушку. Я использую в основном в WPF - там у меня все на его основе построено, а сам он поверх DI от мелких.
Увы кроме исходников
https://github.com/JetBrains/rd/tree/master/rd-net/Lifetimes
и пары роликов на ютубе ничего и не нашел
Хотя мне в принципе хватает. Основное лайфтаймовое - там ведь немного. Остальное в длл всякое утилитное.
А что GC
GC чистит только то что осталось без ссылок. Но занулить ссылки легко забыть или неудобно. А еще и не тот порядок диспоза.
Лайфтаймы все это решают
Я устраивался в 2020м
После меня еще чел приходил, тоже без каких-то знаний.
Другое дело, что это от места зависит и готовности за 40к работать на начальном этапе.
Я и за 20к готов работать, лишь бы взяли. Сейчас особо выбирать не приходится.
Но могу ли я для удобства сделать одноименный метод для экземпляра, который ретранслирует данные из статического метода? Хорошая ли это практика?
>Но могу ли я
Можешь. Статические члены класса доступны для членов экземпляров класса. Обратно нет.
А вот насчет
>Хорошая ли это практика?
для начала нужно понять, что ты имеешь в виду под:
>относительно тяжелый метод
>ретранслирует данные из статического метода
Судя по формулировкам ты не до конца понимаешь, что такое статика в шарпе и зачем она нужна.
В моем понимании код обычного метода будет дублироваться при каждом новом экземпляре. И если будет 100 экземпляров, то будет 100 копий метода. Если внутри экземпляра еще и 100 методов, то это (в моем понимании) влияет на объем памяти, если я захочу составить большой список.
Статический метод будет существовать в единственном экземпляре. Поэтому я делаю метод статическим, который принимает экземпляр собственного класса и обрабатывает его.
(пикрил)
>относительно тяжелый метод
Тут я имел ввиду количество строк кода. Я понимаю, что при конвертации в IL-код строка строке рознь..
метод существует в таблице методов в размере одна штука
а при выполнении используется память из стека текущего потока
так что статический метод ничего не выигрывает в плане памяти.
Спасибо, я думал что методы дублируются.
>>674980
Допустим я создал экземпляр класса Bike, и экземпляр класса Car. В их свойствах лежит один и тот же экземпляр класса Gas.
Вот я удаляю Bike, но экземпляр Gas определенно продолжает существовать в Car. Получается, что у Bike не будет почищен GC, ведь в его свойстве лежит ссылка на Gas. Так?
будет почищен, ведь никто не ссылается на байк (и он никому не нужен). А байк может хоть на тыщу всего ссылаться - никому до этого дела нет.
Как бы в этом и суть работы GC - найти объекты которые уже никому не нужны и выбросить их из памяти
Есть список
List<Booba> women = new List<Booba>();
Тип Booba реализует интерфейс ITitties
Какова хуя я не могу привести список типа Booba к списку интерфейса ITitties?
А почему тогда DependencyProperty использует статический метод OnPropertyChanged? У него же есть экземпляр класса, почему бы не вызвать метод напрямую?
DependencyProperty реализует паттерн "приспособленец" чтобы чего то там минимизировать.
>Какова хуя я не могу привести список типа Booba к списку интерфейса ITitties?
Потому что дженерики, ковариантность и еще дохуя умных слов, которые ты все равно не поймешь.
Короче делай так как на пике и будет тебе счастье.
Получится у тебя лопустим List<ITitties> и что должен делать рантайм когда ты попытаешься туда сделать .Add(new FatRetard())?
В архиве.
Выглядит как бред. Я что, должен создавать НОВЫЙ экземпляр массива? Не слишком ли жирно? И в чем смысл интерфейсов?
А если у меня есть несколько списков разных типов, но я хочу сделать универсальный метод для них, внутри которого нужно просто получить индекс итема списка, то как быть тогда? Я же не могу сотни раз туда-сюда создавать новые списки?
>Выглядит как бред
Как бред тут выглядишь только ты.
Тебе же сказали, что у тебя лист дженериковый. Ты по сути пытаешься на лету у него обобщеный параметр поменять. Так это не работает.
Ты можешь тип самого списка привести например к Inumerable<Booba> или Ilist<Booba>. Если же ты хочешь приведение для элементов сделать, то и делай его именно для элементов (по отдельности, перебором или через ToList<ITitties>)
>>675987
>Я что, должен создавать НОВЫЙ экземпляр массива?
Либо так, либо сразу создавай список того типа который тебе нужен.
Тебе же написали про ковариантность и контрвариантность
Очень интересно. Ты хотя бы понимаешь что в лист с Booba типом объектов ты впихнёшь элемент другого типа который вообще не приводим к Booba?
Я даже в теории не понимаю как это должен переваривать рантайм
только это не каст
Та банально.
1. Он может скастить все к обжект. Вообще 0 проблем.
2. Он может делать обертку виде {type; any} и таким образом мы бы могли делать что-то в духе list[index].As<T>();
3. Можно проиграть по памяти но так же хранить че угодно: 2 массива под капотом - один с оффсетом до элемента с индексом, второй - любой элемент. Доступ к элементу получается в 2 шага, но все еще оч быстро.
Это первое что приходит в голову за 2 минуты.
Другое дело, что List<T> - делался чтобы быть пиздец быстрым и экономным. Если надо что угодно пихать, есть ArrayList
>Он может
>Он может
>Можно проиграть
Он то может быть и может, только не хочет. А хочет он чтобы можно было как в каком-нибудь js - скормить языку любое дерьмо и чтобы он сам разбирал и угадывал, что там "разраб" подразумевал и хотел. Но пацанчик не в тот район забрел, у нас сильная типизация и таких тут не любят.
>Я даже в теории не понимаю как это должен переваривать рантайм
Элементарно. Как и всегда. Ты просто кретин и не понимаешь, что в списке хранятся не объекты, а указатели, которые все одинаковые, хоть на что указывай, похуй вообще. И даже если кроме указателей хранится еще мета-информация наподобие идентификатора типа, это тоже для всех объектов имеет одинаковый размер. В списке всегда хранится одинаковые стандартная информация, которую можно спокойно кастить во что угодно, во что захочешь, в то и касти. Если в реальности шарп не дает такую возможность, значит его писали говношлепы тупые кривожопые макаки. Технически нет никаких проблем кастить содержимое списка во что угодно, ибо он и так работает с одинаковыми данными.
А кто дает? Даже жава с его стираниями типов вольностей не позволяет и будет тебе ошибка. Котлин еще строже. А все потому что без этого нельзя гарантировать безопасность всех сценариев.
Шарп так бузит на список ибо у него чтение и запись T. А сидеть можно только на одном стуле (in T или out t). Потому Ilist вредничает, а вот IReadOnlyList только чтение и потому ковариантен
Конечно на уровне IL ты "царь во дворца" но это уже и не шарп
Дада. Я верно зашел
Ты высказался что шарп написан макаками. Еще собеседника кретином обозвал
Я же показал что эти правила не только в шарпе и имеют причины их иметь, а не потому что "макаки ниасилили".
Помимо компилятора рантайм тоже должен давать некотрые гарантии безопасности (та же жава внезапно дает даже во время исполнения хотя как бы type erasure),
Во всех тредах поудаляли старые шапки с книгами и заменили их на тупые видосики, чтобы никто точно не вкатился.
async - позволяет использовать await внутри метода и создаёт стейт машину между await'ами внутри метода
await - проверяет, завершился ли метод, если да сразу возвращает результат и управление вызывающему коду, иначе меняет стейт и выполняется асинхронно и все такое
Похоже. А я как назло забыл закопипастить сюда старую шапку, будет время скину.
Ограничения в основном из-за выполнения таски потоком из пула.
Типа проблемности отлова исключения в async void, так как эксепшон заворачивается в Task. Из войда полетит в текущий контекст синхронизации и ловить их надо прям в этом методе.
Return в using, из-за возможности ГЦшки потереть нахуй все ещё до обращения к результату.
Отмена таски происходит эксепшоном(ну спасибо, нахуй, разрабы)
Остальное опционально или нахуй не нужно
Потому что асинк-эвейт и раскраска функций - это антипаттерн. В сихэштеге естественно выбрали вариант сделать через жопу. В джаве поступили гораздо умнее и добавили интуитивно понятные виртуальные треды, которые прекрасно встраиваются в язык и ничего не ломают.
go не делит функции на красные и синие.
В go всё просто. Даже книжки по языку - это брошюрки от 100 до 400 страничек, а в сишарпе - талмуды на 1000 страниц, да ещё и двухтомные.
как раз в шарпе примитив - ввели абстракцию таски которую можно запустить и дождаться. В общем то эта та самая корутина.
В шарпе просто упор на абстракцию "запустить и получить объект ожидания", а "где выполняется, как выполняется, выполняется ли вообще" это уже детали реализации.
Исторически сложилось, что в шарпе сначала ввели концепцию "все можно представить как таски", а уже потом к этой концепции добавили сахар await
Таким образом ты получаешь простой и унифицированный подход - "тебе выдали (Future/Defered/Promise в других языках) и ты можешь либо соединить в цепочки вида ContinueWith (then) либо заюзать сахар await "
То же самое в питоне, в жаваскрипте...это обобщенный унифицированный подход позволяющий работать с абстракцией, а не с деталями.
взять, к примеру, котлин - там suspend методы и когда их пишешь то нет никакого await и выглядит линейно....до тех пор пока тебе не понадобится запустить 2+ параллельно и получить результаты и бац - опять тот же await
(зато попутно там дичь с исключениями вместо унифицированного единого подхода)
я го не знаю. но если я правильно понимаю ридми по go то в шарпе это экивалент Task.Run ("запусти и забудь"). ключевого слова для этого не делали (вообще мелкие очень очень очень скупые на ключевые слова (привет ConfigureAwai(false)), но суть та же.
получается не так красиво из за await но унифицировано!. Я могу работать со всем в одном стиле. Я могу обернуть в таски любые другие подходы и связать одно с другим. Например я могу спокойно превратить event в таску и связывать с другими тасками. Я могу добавить TaskCompletionSource куда то и работать с ним так же унифицировано как с таской. Все есть таска.
В других языках же мне придется явно "ага, тут нам нужен результат и значит нужен объект типа Defered и как то его дождаться же и вклинить его в мой код. И вот тут начинается "зона особых правил", которой в шарпе нет - там все работает единым подходом.
почитал по диагонали. горутины легковесные по своей природе. но по той же природе не могут возвращать результат. И если нужно его вернуть и чтобы было "по красоте", то приходится городить огород.
еще тут товарищ хвалит типа виртуальные треды в жаве. Не знаю про них (и знать не хочу ибо котлин) но...что тут сказать..."и 20 лет не прошло". Хотя ой - прошло. Когда там в шарпе await появился?!
У каждого подхода свои достоинства и недостатки. Шарп все же язык общего профиля, а го по рождению заточен под задачу - работает быстрее, но писать что то большое....ну нах.
>DevJungles
Этот чел что-то принимает перед съемкой видоса?
Так а что сложного в async-await в шарпе?
Реально же интересно, че там сложного. Типа промисы из JS - не сложно, а вот шарповские Task - сложно пиздец? Чи шо?
Или просто, это чтобы у тебя было в духе:
SomeMethod(callback => {
Console.WriteLine("Complete");
})
?
А рутину свою в фоне, как на тредпуле, так и без - изи можно самому сделать. Правда придется делать свой тип и там Wait метод, если надо дождаться результата, но никто не мешает. Деды так делали, пока TPL не завоевал шарповский мир.
Он про канцелейшен токен, вероятно. Ну и многие асинхрннгые функции работаю с этим токеном, поэтому в большинстве случаев отмена авейта приведет к исключению.
И это засрет твой лог, хотя отмена в штатном режиме.
Мне не дает реализовать интерфейс с конкретным типом Data.
Не тот пикрил.
А как иначе в языках основанных на исключениях?
Как еще прервать поток выполнения и гарантировать что никто выше не подумает что все завершилось штатно (на деле оно было отменено)?
Либо исключения, либо плоди Result<Error> (коды отмены). Третьего не дано. Выбор очевиден.
Исключение отмены вполне вписывается в парадигму "поток выполнения не пошел по задуманному и был прерван". И "отмена в штатном режиме" все равно означает "выполнение не пошло штатно"
Так что это из разряда спора "коды отмены против исключений".
не хочется исключения - забудь про await и работай с сырыми объектами тасок (Defered)
в шарпе, питоне, котлине и уверен в любом языке, где во главе угла стоят исключения - используется свой вариант CancelledException
Как же я рад, что не перевел проекты на шарп. Звоночек с кидком линуксовского гуя был тогда к месту. Смотрю вот 7 версию, а они уже выпилили поддержку win 7.
Жрите это сами
ну так то не самая большая проблема (хоть и неприятно)
мало кому нужно делать продукт что должен работать на вин 7
Тем более что дотнет 4.8 никуда не делся и даже если бы он обновлялся, то не на вин 7
IList<IZalupa> или ICollection<IZalupa>, если Zalupa совершенно точно реализует интерфейс IZalupa?
При этом привести к IEnumerable<IZalupa> получается. И что вписывать в интерфейс, чтобы можно было редактировать итемы?
>мало кому нужно делать продукт что должен работать на вин 7
Ну да, все первого января перешли на десятку же.
Не нужно с мировозрением вебмакаки что-то рассуждать.
причем тут макака . ожидать что те кто перестали поддерживать вин 7 даже платно (исключая ембедед который тоже скоро все) продолжат его поддерживать в других продуктах...особенно если их основной посыл всех именно пересадить на новую версию винды....
понятно что не все перешли, но таков уж мир легаси - сидишь на древнем, так забудь про новое. дотнет 4.8 там по прежнему работает (и на него апдейты даже прилетают)
кстати питон, который язык самого широкого профиля, тоже дропнул вин 7
>сидишь на древнем, так забудь про новое.
Ща всем клиентам напишу это, а то хера они такие додики не бегут покупать десяточку, сейчас вот только они драва сами на десятку напишут.
Я тебе говорю, сиди в вебмакинге и не парся, к тебе с EEE позже придут.
>дотнет 4.8
А что пора слазить с кроссплатформы? Посидели и хватит?
>кстати питон, который язык самого широкого профиля, тоже дропнул вин 7
Как раз скрипты как софт никто не распространяет, там вообще если углубиться в бинарную зависимость окажется все плохо на вин.
А че? Тебе нужна кроссплатформа или легаси ось и дрова и вообще кровавый энтерпрайз где никто никуда не переедет
Ты уж определись
>>677953
Еще как распространяют. Просто ПОПУТНО могут притащить и свой питон и вынуждены писать под него не переходя на более новый
Но в общем то тут никакого отличия от твоей ситуации
Зумерок услышал слово легаси.
4 месяца - легаси!
И вообще вместе с софтом распростроняй установщик десятки. Хера нудишь.
>Еще как распространяют. Просто ПОПУТНО могут притащить и свой питон
Установка однокласснику питона, чтобы твоя лаба запустилась, это не совсем коммерческое распространение софта.
4 месяца статуса "вообще забыть нужно"
а легаси это "больше не рекомендуется использовать, вот вам новое".
И этому никак не 4 месяца.
>>677967
Какая еще установка. Ну да, есть распространение через pypi, но обычно софт упаковывается в ехешник пиинсталлером или py2exe и прочим подобным. И там внутри помимо твоей проги и дистр питона.
должен явно пометить соответствующий заголовок. К примеру:
Property ZalupaKonya As Zalupa Implements IZalupy.ZalupaKonya
Поэтому название свойства может не совпадать с названием свойства интерфейса.
Property QWERTY As Zalupa Implements IZalupy.ZalupaKonya
А как с этим в шарпе? Как детектируется нужное свойство? По имени?
>но обычно софт упаковывается в ехешник пиинсталлером или py2exe и прочим подобным
Стой, подожди, ты только сказал ставят свой питон. Ты реально сейчас загуглил и пытаешься показаться умнее?
дичь какая то в бейсике тогда
конечно по имени
ведь интерфейс как бы и задает именование которое должно быть реализовано. Давать возможность менять имя - стрелять себе по ногам. Если же конфликт имен есть, то есть явная реализация интерфейса
string IZalupaKonya.ZalupaKonya { get; set; }
>п-п-притащить свой питон это не с-с-ставить! Слышишь!?
Четырех месячное легаси у него, лол. Как ты с таким интеллектом капчу проходишь?
>п-п-притащить свой питон это не с-с-ставить! Слышишь!?
да. притащить не значит ставить
даже дотнет позволяет упаковать свое приложение в один ехешник вместе с рантаймом дотнета и запускать его на системе без дотнета
<PublishSingleFile>true</PublishSingleFile>
<SelfContained>true</SelfContained>
или это ты тоже назовешь "установкой дотнета"?
>Четырех месячное легаси у него, лол
это не у меня 4 месяца легаси. не тупи, капчепроходец )
В теории это мне позволило конкретизировать свойство, если я обращаюсь напрямую к классу, но при этом у меня есть обобщенность в виде интерфейса. Мне кажется это плюсом.
ну ок.принимается. это сахар для экономии кода.
в шарпе решили не сахарить. шарп очень жадный на сахар. Это по сравнению разве что с жавой он сахарный.
Так а какую альтернативу ты предложишь в случае заводов, допустим, где с самого начала либо C# либо C++ CLI, и за 20 лет столько кода написано, что просто ебнешься переводить на что-то открытое. Проще таки обновить винду и допилить софт под новый стандарт.
А как в шарпе это разруливается?
Вот, к примеру два класса (пикрил 1). Оба имеют одинаковую сигнатуру, только разные типы. Существует ли какой-то вариант, чтобы вот это все привязать к единому интерфейсу? Дженерики не помогут.
Я голову сломал, у меня нифига не получается.
Суть в том, что у меня есть универсальная команда переименования выбранных итемов. Я должен запустить метод Execute, который "удалит выбранное" экземпляра той вьюмодели, которая хранится в свойстве команды.
Проблема передать вьюмодель в свойство. Допустим я делаю дженерик класс ViewModel<Document> и ViewModel<Page>
Если я захочу передать в свойство, которое выглядит так
public ViewModel<INode>? CurrentViewModel { get; set; }
То я получу ошибку. Я не могу менять тип.
Интерфейс я не смогу использовать, потому что нет подходящего интерфейса для ObservableCollection, позволяющего редактировать коллекцию.
И казалось бы, ситуация очевидная, а вот хрен.
Блин. Я в последнее время гляжу на код, который генерирует моя башка и думаю, вот на кой хуй я сам-то на шарпе кодю, если постоянно пытаюсь его наебать? Пиздец меня это вымораживает. Все ебучий опыт ЖС с его гибкостью и удобством. Хочу бладь на ЖС писать бекенд.
Через паттерн Pipeline
Делай как завещали нормальные люди:
Каждое следующее состояние - это информация об изменении предыдущего.
Ну. Т.е. примерно так:
StateA - твое начальное состояние
StateB = StateA + Midificator1
StateC = StateB + Modificator2
Все просто. Всегда можно повторить. Можно двигаться в любом направлении, как вперед так и назад.
Блин, идея указывать два дженерик типа мне тоже приходила в голову, но мне показалось это слишком грязным. Ну раз мысли сходятся, то придется юзать это. Спасибо, за уделенное время :3
https://www.youtube.com/watch?v=xk4Y7z_8vbU
>Как хранить последовательность действий?
Ты имеешь ввиду историю действий? Я хранил в стэке - списке, который при получении итема его автоматом удаляет. Собственно было два таких стека - один Undo, другой Redo. При команде Undo я извлекал последний итем списка Undo и помещал в список Redo. И наоборот.
Сами итемы ничего не знают от предыдущих или последующих действиях. У тебя все должно восстанавливаться само собой, но для этого твои команды не должны производить сложные неотслеживаемые действия.
К примеру мне нужно сгруппировать объекты — это по сути три мелких команды: создать папку, переименовать папку, переместить итемы в папку. Соответственно что бы я не отменял, у меня будут ровно те условия, которые мне нужны на текущем этапе. Не будет такого, что папка внезапно будет с другим именем или она отсутствует.
я не люблю рефлексию потому использовал бы интерфйес IViewModelWithEditableItems и уже в нем методы которые бы дергала команда
А майкрософт не может забить? Один баг для бейсика они не могут пофиксить пять лет.
Капча: ша.ка
Думаю "хм, наверно речь идет о шапке", оказывается имелась ввиду "шавка".
Ты имеешь ввиду, что условные методы DeleteItems, RenameItems, MoveItems находились бы прям во вьюмодели? Чет слишком тяжело даже по меркам вьюмодели. Я щас раскидал по командам в отдельных классах и у меня все равно все засрано.
Вопрос не про шарп, а про моделирование объектиков.
В общем. Есть ряд устройств. Тысячи их.
Я хочу ПО, которое бы собирало со всех этих устройств нужное мне.
Мне, как пользователю - не интересно, что тут модбас-снмп-или MQTT, мне интересно, условно влажность воздуха, включена лампочка чи нет, ну и температура, допустим.
Ну так вот. Какие я вижу способы абстрагироваться от желеязки.
Я выделяю такие вот сущности:
Data - ДАННЫЕ, которые нужны пользователю.
DataChannel - абстракция, которая должна как-бы для приложения символизировать поток данных, который идет от устройства уже в виде который пользователю нужен
Channel - абстракция, которая содержит в себе уже более близкую информацию к устройству: тип данных, формула для приведения и т.д.
CommunicationLine - тута мя прчем уже специфичные для протокола данные: номера регистров, как мы их соотносим с данными
Device - абстракция над устройством, получает драйвер, устанавливает соединение, держит его, если надо, периодически дергает из CommunicationLine сущности, и отдает их ей, чтобы вверх пошло
Ну и где-то снизу - DataCollectorEngine, который читает конфигурацию, строит всю эту модель и начинает опрашивать устройства в зависимости от настроек.
Ну так вот. Это должно работать.
Но у меня возникает вот какая проблема. Смотрите. Есть большой список устройств, в которых протоколы задумывались дохуя эффективными, в духе: открыть соединение и серануть сразу большой запрос, чтобы большой ответ получить одним запросом. Ну дык в этом и проблема. Если мы делаем как я выше описал, наш движок - должен думать в контексте Data и посылать вниз запросы, которые распарсятся к конкретному протоколу из конфигурации и потом устройству улетят. Но это пиздец неэффективно для того же SNMP, где я могу разом считать дохуя всего одним Bulk-запросом.
С другой стороны - так проще и так добавление поддержки нового устройства будет заключаться просто в написании dll которая все что надо умеет. Пара DeviceImpl и DeviceDriverImpl и все, кайфуем.
В общем. Рассудите меня. Как быть? Что делать? Может быть какие-то лучшие решения или вообще, моя модель - хуйня и я вообще долбоеб?
Вопрос не про шарп, а про моделирование объектиков.
В общем. Есть ряд устройств. Тысячи их.
Я хочу ПО, которое бы собирало со всех этих устройств нужное мне.
Мне, как пользователю - не интересно, что тут модбас-снмп-или MQTT, мне интересно, условно влажность воздуха, включена лампочка чи нет, ну и температура, допустим.
Ну так вот. Какие я вижу способы абстрагироваться от желеязки.
Я выделяю такие вот сущности:
Data - ДАННЫЕ, которые нужны пользователю.
DataChannel - абстракция, которая должна как-бы для приложения символизировать поток данных, который идет от устройства уже в виде который пользователю нужен
Channel - абстракция, которая содержит в себе уже более близкую информацию к устройству: тип данных, формула для приведения и т.д.
CommunicationLine - тута мя прчем уже специфичные для протокола данные: номера регистров, как мы их соотносим с данными
Device - абстракция над устройством, получает драйвер, устанавливает соединение, держит его, если надо, периодически дергает из CommunicationLine сущности, и отдает их ей, чтобы вверх пошло
Ну и где-то снизу - DataCollectorEngine, который читает конфигурацию, строит всю эту модель и начинает опрашивать устройства в зависимости от настроек.
Ну так вот. Это должно работать.
Но у меня возникает вот какая проблема. Смотрите. Есть большой список устройств, в которых протоколы задумывались дохуя эффективными, в духе: открыть соединение и серануть сразу большой запрос, чтобы большой ответ получить одним запросом. Ну дык в этом и проблема. Если мы делаем как я выше описал, наш движок - должен думать в контексте Data и посылать вниз запросы, которые распарсятся к конкретному протоколу из конфигурации и потом устройству улетят. Но это пиздец неэффективно для того же SNMP, где я могу разом считать дохуя всего одним Bulk-запросом.
С другой стороны - так проще и так добавление поддержки нового устройства будет заключаться просто в написании dll которая все что надо умеет. Пара DeviceImpl и DeviceDriverImpl и все, кайфуем.
В общем. Рассудите меня. Как быть? Что делать? Может быть какие-то лучшие решения или вообще, моя модель - хуйня и я вообще долбоеб?
> Хочу вкатиться на фулстак
Нахуя? Чтобы работать в 2 раза больше а получать столько же?
А по остальному посту. Коротко. Че конкретно где используется - зависит от того, че в свое время бизнесу продали те разрабы, что были там в тот момент.
Кто-то продал веб-формы и они столько лет работали, их не трогает никто.
Кто-то продал MVC - оно работает, потихоньку пилят.
Кто-то продал блазор.
Подытожив. Фуллстек - это неабка. Причем проигрывают все. Бизнес думает, что сэкономил - наняв как-бы 2 человек по цене одного, а получает хуйлушу, который ни там ни тут нормально не разбирается. Ты, чтобы все успевать - занимаешься скоростным копипастом, не имея возможности даже нормально разобраться. В итоге - задачи валятся, через 4 года ты только-только будешь подходить по знаниям к мидлу что с одной, что с другой стороны. Так что не страдай хуйней. Попробуй то, попробуй это. Че больше нравится - то и начинай качать. Иначе - проебешь время, силы, деньги. Оно тебе надо? Не надо.
Я понял твою мысль и в общем-то согласен. Я немного сумбурно выразился, попробую поточнее. Я в целом готов пойти как на фронта так и на бэка. Фронт я более менее подучил. Бэк знаю слабо. Буду ближайшее время искать работу фронтом. Но уже заранее готовлюсь к тому что у меня это может не получиться учитывая популярность фронта и большую армию джунов и вкатышей. Поэтому хочу еще бэк подучить чтобы были еще варианты. Сишарп понравился. Посмотрел вакансии там берут джунов фулстеков в моем городе. Вот я и подумал что буду откликать по отдельности на бэк или фронт но если выбирать не приходится и предложат фулстаков или это как-то увеличит мои шансы на поиски работы фронта и бэка по отдельности то я бы хотел использовать эту возможность
Я так понимаю ты про ввод? Всё просто - юзлесс сахар. Отсутствие префикса для них не накладывает никаких ограничений
Я про литералы типа 0777 с ведущим нулём или хотя бы 0o777, чтобы удобно задавать права доступа к файлам.
Когда все начиналось - сразу было требование, к этому серверу сделать веб-морду в виде SPA-приложения.
Собственно сказано-сделано, я просто не долго думая, начал все с WebApi-проекта, в нем папочка TcpServer. Не суть. На картинке приложенной - приблизительная структура того как было сделано(ессно это пример, в реальности чуть по другому, но на память накидал структуру)
Суть в другом. Внезапно появилось требование, чтобы веб-морда была опциональной, а сервер был лололо демоном, и вообще их нужно теперь много разом запускать на разных машинах, а управлять из одной веб морды.
И вот тут-то я чет кхм. Дааааа.
Просто из-за того что изначально это не задумывалось - для простоты - сразу в контроллере дергали че надо от сервера.
Теперь вот.
Вопрос вот в чем. Сколько приблизительно должен занять рефакторинг этого дела? Просто когда я думаю об этом - мне кажется, что не меньше года, тем более что в одно рыло же пилил. С другой стороны - я старался чтобы не так связно было. Код из контроллеров - можно в какой-то класс вынести, типа TcpServerFacade. Но с требованием с одной мордой сразу за несколькими серверами следить, кажется, что правильнее будет придумать свой протокол и сделать клиент для сервера, который будет уже дергать апишка.
Не знаю. Сложненько чет.
Вы уже на игле, это я радуюсь за себя, что на воодушевление маркетингового буллшита, чуть не попал в тотальный вендерлок
>не попал в тотальный вендерлок
98% разрабатываемых сегодня в мире GUI - это тотальный вендорлок на гугл, его хром или андроид.
> Сколько приблизительно должен занять рефакторинг этого дела?
Отделить морду и добавить обнаружение даю план тайм до недели
Ну тем кто на острие тем норм. Если бы еще мелкие делали полезные фичи, а не ерунду
Они не делают нужные штуки распыляясь на ерунду
required сделали на версию позже
С !! что вообще?
ConfigureAwait годами висит issue
Вон будут фрозен коллекции (спустя столько лет то и потому костыль но хоть так) где фрозенлист???
Контракты похерили ибо делали жопой... Ну сделайте прямыми руками что ли.
Дайте возможность расширить статики
Где типизированные специальные коллекции? Что за дичь вообще с коллекциями в шарпе.
Про косяки что уже и не исправить я вообще молчу
>распыляясь на ерунду
Они сделали обобщённую математику, и это действительно мощная фича.
>required сделали на версию позже
Ну да, и даже field до сих пор не завезли, хотя казалось бы вещь насущная, сократит кучу кода, и легко реализуемая.
>С !! что вообще?
Это странная фича, и она на мой взгляд будет не согласованной с nullable нотацией, когда если нет ?, то сущность почти гарантированно не нулл. Кроме того, при некорректном обращении к нулл, экспшн и так будет кинут.
>где фрозенлист?
ImmutableArray?
ReadOnlyMemory?
>Дайте возможность расширить статики
Экстеншены - это дурнопахнущий стиль. Код читать не возможно.
Кроме как для кастрированных по сравнению с джавой енумов, оно нигде не оправдано.
>Они сделали обобщённую математику, и это действительно мощная фича.
а еще сделали main без programs...
>при некорректном обращении к нулл, экспшн и так будет кинут
ага. и будет поломан стейт.
А чтобы не поломать стейт...проверяйте аргументы. то есть if(is null) throw
то есть !!
А нулабле нотация вообще не причем - она не более чим хинт. Причем частенько тупящий на ровном месте. Аттрибуты из Diagnostics немного помогают, но именно что немного.
>ImmutableArray?
фрозен != иммутабле. Абсолютно разная реализация, потребление памяти и перфоманс.
> ReadOnlyMemory?
Имеет свой апи. Никак не соотносится с IReadOnlyList.
>Экстеншены - это дурнопахнущий стиль. Код читать не возможно.
ножом можно убить, запретим ножи - будем резать вилкой )
всему свое применение.
посмотри на банальный Dictionary. Там нет банального GetOrAdd(key, Func<T>). И куда ты будешь это добавлять? в хелпер что ли? экстеншены отлично решают такую тупость. И такого очень очень много
расширение статики - банально для создания дополнительных фабричных методов которые постоянно приходится пихать абы куда
(оффтоп - в котлине экстеншены вообще юзаются на полную. и с помощью скоупов (в шарпе их нет) делегатов пропертей (опять же их нет в шарпе) и необязательности классов (в шарпе нет) создается очень читабельный и крутой DSL что шарп нервно курит в сторонке)
>ImmutableArray
ну ладно я глянул его реализацию. оказалось что оно не на связанных списках, а тупо array с копированием, от чего я немного ШТААА
то есть технически если привести его сразу к IReadOnlyList мы получим фрозен, но блин это продолжение того же бардака что изначально в шарпах с коллекциями. Там и так дерьма хватает, но вместо того чтобы сделать фрозенлист элементарный придется подключать ImmutableArray с его левой семантикой. Проще продолжать жить на собственных велосипедах, ведь порядка в шарпе не дождаться никогда.
викторина от капчи просто убивает: Б?ТИ(Е). вот что это (цензура)
> викторина от капчи просто убивает: Б?ТИ(Е). вот что это (цензура)
Бытие. Книжки вообще не читаешь?
е было написано очень бледно-зеленое на зеленом.
Так что решал я изначально Б?ТИ
Я предположил что оно относится к слову только после того как капча сменилась. Потому и написал его в скобках и отправил пост.
Зачем подкручивать разность цветов до еле читабельного если ботам плевать на эту разницу, а человек страдает.
Есть один GridView с TextBox для ввода и кнопочка "Добавить".
На TextBox'ах висит Validator.
Подскажи как на клиентской стороне блокировать кнопку пока валидатор не скажет что все збс?
Правильно ли я полагаю что без жаваскрипта не обойтись?
Полоумный поисковик предлагает решения типа пикрелейтед, но при выполнении ругается на НуллПоинтерЭкспешин при обращении к кнопке из скрипта(возможно она еще не создана в момент вызова, я хуй знает про этот жизненный цикл страницы).
Подрядчик выкатил решение с интерфейсом в вебприложении на аспнете.
Двач, что значит вот эта ебола:
int i = float > float ? 1 : -1;
?
Типа если один из флоатов больше то инт равен -1 или 1?
При Сталине такой ухни не было!
Это не скомпилится. Как ты собрался сравнивать типы данных? Раз на то пошло, float не может быть больше float, потому что он равен ему.
Подставь рандом флоат вместо слова "флоат"
Конечно могу представить, нахуя гуглить то, о чём в первой главе любой книги пишут. Называется тернарная условная операция.
Книги для задротов.
public class TestCommand<T> : BaseCommand<IViewModel<T>>
{
}
этот базовый класс реализует интерфейс IBaseCommand
public class BaseCommand<T> : IBaseCommand<T>
{
}
Чому я не могу добавить экземпляр команды в список типа IBaseCommand
var myCommand = new TestCommand<Document>();
var commands = new List<IBaseCommand<DocumentViewModel>>();
commands.Add(myCommand);
Ошибка:
System.InvalidCastException: "Unable to cast object of type 'MyApp.TestCommand`1[MyApp.Document]' to type 'MyApp.IBaseCommand`1[MyApp.DocumentViewModel]'."
Но сработало бы, если бы я первое написал так
public class TestCommand<T, V> : BaseCommand<V> where V : IViewModel<T>
{
}
В чем магия?
Каждый день кто то влетает с жалобами на каст джинериков и каждый день ответ ковариантность и контрвариантность
У меня будет куча команд разных типов. Мне надо как-то их все хранить в одном списке, поэтому я создал интерфейс IBaseCommand<T>. Ну, понятно, что мне не нужен Object, мне надо с этим дальше работать.
>>679387
Я прочитал про ковариантность и контрвариантность, но я так и не понял почему вот это
public class TestCommand<T> : BaseCommand<IViewModel<T>>
{
}
Совершенно не то, что это
public class TestCommand<T, V> : BaseCommand<V> where V : IViewModel<T>
{}
У меня есть подорзрение, что ковариантность тут не при чем, а дело в том, что в во втором варианте тип указан конкретный IViewModel<T>, в то время как V as IViewModel<T> обобщенный.
И что характерно, подобные вопросы идут в основном от десктопщиков, пытающихся какими-то хитровыебаными способами прокинуть данные в UI или обратно.
По крайней мере вопросов от бэкендеров, вроде "я тут хотел гланды через, жопу удалить, но у меня A<B> не кастится к <D>", на порядок меньше.
>Что характерно, вопросов проблеме о сохранения заряда аккумуляторов в теплых странах меньше, чем в холодных.
Очевидно потому, что на севере живут криворукие уебаны.
Учебные хеллоуворлды можно хоть в виме писать.
В зависимости от того для чего ты учишься. Если планируешь потом где-то работать, то придется знать либо студию либо райдер. Так что, хоть что-то да придется устанавливать.
Ну и 12 гигов студии - это фигня с тем, что тебе может еще понадобится установить для разработки. У тебя одних докер контейнеров гигов на 20...30 может быть или БД всяки. Поэтому покупай себе максимально возможный дисковый объем иначе вместо нормальной разработки постоянно страдать будешь.
Да я планирую работу потом найти, вкатиться то бишь. Жестко конечно, придется сериалы и прочее говно удалить с ноута.
А если я попрошу рабочий пк с линукс то будут проблемы? Вообще у нас импортозамещение же, какая вижла, какой виндовс нах
Вот код
int pageIndex1 = 0;
DocumentPage page;
// Выполняем цикл, вызывая GetPage() до тех пор, пока не вернется null
do
{
page = GetPage(pageIndex1);
pageIndex1++;
} while (page != null || pageIndex1 != 350);
Тут ПРОСТО надо выйти из цикла, когда page будет null ИЛИ когда pageIndex1 будет 350. НО ОНО НЕ ВЫХОДИТ, БЛЯТЬ. page становится null уже где-то на 100 индексе, но не выходит, пока pageIndex1 не будет 350. КАК?! Сука, там же ИЛИ, а не И! Просто пиздец, я над какой-то ебанистикой сижу уже час, нахуй
Ну вот у тебя и работает до момента "ИЛИ СТРАНИЦА НЕ 350" то есть похуй что у тебя налл потому что ИЛИ.
Твой цикл выйдет ТОЛЬКО когда страница 350 И пэйдж налл.
Ты разницу между И и ИЛИ понимаешь? При или нихуя не должно ждать до тех пор пока оба условия выполнится, а должно выходить, когда выполняется хотя бы одно. Этого не происходит. То что ты говоришь это И
Цикл продолжается покуда результат условия true. Твоё же условие true пока page != null ИЛИ pageIndex1 != 350
Видит бог я пытался. Последняя попытка. Если ты не понял и не троллина клятая то лучше почитай мат логику
Бля, всё, зря быканул, я не прав. Столько лет использовал условия эти и никогда не тупил так
Зависит от того где и на кого ты будешь работать.
Возможные варианты.
1) Работаешь со своим ноутом. Работаешь как хочешь и с чем хочешь. Единственное, что обычно нужно vpn настроить и рабочие месенджеры/почту.
2) Выдают рабочий ноут на котором можно работать как на своем. Просто если сломаешь - отдаешь работодателю бабки.
3) Выдают рабочий ноут, но он настроен как нужно и поставить туда, что-то не из списка - большой геморрой.
4) Удаленная машина. Комп стоит в офисе, либо в ферме, либо вообще виртуалка. Подключаешься удаленно и работаешь. Тут обычно как в 3-м пункте. Большая часть софта только из одобренного списка, что-то новое только по заявкам и/или через безопасников. Тут тоже могут выдать ноут, но слабенький исключительно для подключения к удаленке. На этом ноуте можно уже что угодно ставить, но смысла нет.
Самый нормальный вариант 2, при условии, что тачку выдадут нормальную мощную.
Так же хороший вариант 1, т.к. тут ты почти ничем не ограничен и тачку можешь подобрать себе сам. Да это дорого, но в принципе нормальный рабочий ноут отбивается за 2...3 зарплаты.
3-й самый херовый вариант. Плюс он часто подразумевает офис или как минимум гибрид. На удаленке такое редко бывает. И как раз в таких вариантах любят ставить всякие анальные трекеры и прочий контроль.
4-й вариант тоже так себе. Тоже могут быть зонды, хотя и далеко не везде. Но... Сейчас это уже почти стандарт. По крайней мере в финтехе только так. Так что рано или поздно все равно с этим столкнешься. Во вторых в очень многих конторах есть очень много лазеек, который позволяют весь этот анал-карнавал обходить и работать более-менее комфортно. Даже на своей машине, заглядывая на удаленную только для отметок, почты и еще какой-нибудь мелкой фигни.
Еще бывают странные хитровыебанные схемы (например у газпрёма). Там тебе выдают спец флешку с линуксом и прописанными доступами. Ты ее втыкаешь в ноут/комп. Грузишь с нее линукс и уже с него подключаешься к удаленной рабочей машине в офисе. Причем там куча головняков всяких возникает на любом этапе этой цепочки.
>>679941
>Вообще у нас импортозамещение же, какая вижла, какой виндовс нах
Телевизор меньше смотри.
Зависит от того где и на кого ты будешь работать.
Возможные варианты.
1) Работаешь со своим ноутом. Работаешь как хочешь и с чем хочешь. Единственное, что обычно нужно vpn настроить и рабочие месенджеры/почту.
2) Выдают рабочий ноут на котором можно работать как на своем. Просто если сломаешь - отдаешь работодателю бабки.
3) Выдают рабочий ноут, но он настроен как нужно и поставить туда, что-то не из списка - большой геморрой.
4) Удаленная машина. Комп стоит в офисе, либо в ферме, либо вообще виртуалка. Подключаешься удаленно и работаешь. Тут обычно как в 3-м пункте. Большая часть софта только из одобренного списка, что-то новое только по заявкам и/или через безопасников. Тут тоже могут выдать ноут, но слабенький исключительно для подключения к удаленке. На этом ноуте можно уже что угодно ставить, но смысла нет.
Самый нормальный вариант 2, при условии, что тачку выдадут нормальную мощную.
Так же хороший вариант 1, т.к. тут ты почти ничем не ограничен и тачку можешь подобрать себе сам. Да это дорого, но в принципе нормальный рабочий ноут отбивается за 2...3 зарплаты.
3-й самый херовый вариант. Плюс он часто подразумевает офис или как минимум гибрид. На удаленке такое редко бывает. И как раз в таких вариантах любят ставить всякие анальные трекеры и прочий контроль.
4-й вариант тоже так себе. Тоже могут быть зонды, хотя и далеко не везде. Но... Сейчас это уже почти стандарт. По крайней мере в финтехе только так. Так что рано или поздно все равно с этим столкнешься. Во вторых в очень многих конторах есть очень много лазеек, который позволяют весь этот анал-карнавал обходить и работать более-менее комфортно. Даже на своей машине, заглядывая на удаленную только для отметок, почты и еще какой-нибудь мелкой фигни.
Еще бывают странные хитровыебанные схемы (например у газпрёма). Там тебе выдают спец флешку с линуксом и прописанными доступами. Ты ее втыкаешь в ноут/комп. Грузишь с нее линукс и уже с него подключаешься к удаленной рабочей машине в офисе. Причем там куча головняков всяких возникает на любом этапе этой цепочки.
>>679941
>Вообще у нас импортозамещение же, какая вижла, какой виндовс нах
Телевизор меньше смотри.
По большому счету, абсолютно похуй на чем и чем ты кодишь. Главное чтобы твой конечный продукт заводился и работал на той/тех системах которые указаны в ТЗ.
Но если твоя рабочая тачка обязана находится в каком-либо контуре, то тут уже все зависит от того, что прописано в требованиях у безопасников. На чем они скажут, на том и будешь работать.
Условие "или" всегда с подвохом.
Да это для теста
Не работал с ним но судя по сорсам нельзя https://github.com/dotnet/symstore/tree/main/src/Microsoft.SymbolStore/SymbolStores
из костылей могу предложить смайнтить самбу на машине и как локальную директорию добавлять
Спасибо. Попробую завтра такое сделать
Стоит соваться туда вообще, мне подтянуть знания по mvc 5 вроде как не большая проблема, но страшно, бля.
Сначала спроси зачем они его знание требуют?
Если вариант взять старый софт и переделать на новый стек, то вполне можно попробовать.
Если же исключительно поддержка старого говна - то нахуй. Такая вакансия ни новичку, ни опытному ничего не даст.
Это вакансия на джуна вообще, сегодня повторю model binding и validation и авторизацию и завтра с ними попытаюсь связаться, чисто на удачу, конечно.
Не получится, после 10 мая буду еще искать.
Как там линку работает?
Вот допустим, у меня есть массив object'ов
Если я сделаю так: arr.Wher(x => x is User).Select(x => x as User), линку сначала отфильтрует а потом выберет, либо будет применять фильтр при селекте?
Ну. Т.е. как будет
Так :
IEnumerable<object> a(IEnumerable<object> arr)
foreach(var it in arr)
{
if(it is User) yield return i;
}
IEnumerable<User> b(IEnumerable<object> arr)
foreach(var it in arr)
{
yield return it as User
}
или :
IEnumerable<object> a(IEnumerable<object> arr)
foreach(var it in arr)
{
if(it is User) yield return it as User;
}
Как там линку работает?
Вот допустим, у меня есть массив object'ов
Если я сделаю так: arr.Wher(x => x is User).Select(x => x as User), линку сначала отфильтрует а потом выберет, либо будет применять фильтр при селекте?
Ну. Т.е. как будет
Так :
IEnumerable<object> a(IEnumerable<object> arr)
foreach(var it in arr)
{
if(it is User) yield return i;
}
IEnumerable<User> b(IEnumerable<object> arr)
foreach(var it in arr)
{
yield return it as User
}
или :
IEnumerable<object> a(IEnumerable<object> arr)
foreach(var it in arr)
{
if(it is User) yield return it as User;
}
Ну уровне - ты знаешь что такое HTML, можешь назвать 3 самых популярных браузера, знаешь где фронт и бек пересекаются.
> линку сначала отфильтрует а потом выберет, либо будет применять фильтр при селекте?
Вся цепочка будет проходить для каждого элемента по мере запрашивания элементов. Гугли IEnumerable
Не прикладывай код к посту один хуй его никто не будет читать в таком виде
будет применять фильтр при селекте
вообще все работает для каждого элемента если в цепочке нет элементов где нужна полная материализация. Например GroupBy ты не можешь сделать без полной материализации.
И сейчас можно писать что угодно. Докер/кубы это про распространение, но ты можешь поискать контору где каждый разраб ходит и руками по фтп раскатывает на виндовый сервак бинари под фреймворк 3,5.
Лично я бы не захотел туда идти
приходишь, а там такие же как ты...аааа
А где деды? А они свалили с такого проекта, не жависты же, вот и приходится нанимать хоть кого то на замену
Этот шарит
так сложилось исторически.
из-за совместимости с VB который юзал тогда BSTR, который по факту UCS-2 с префиксом длины, который поддерживался в NT и таким образом работал с COM/OLE, потому что строки utf-8 трудно индексировать и вообще нужно работать особым образом. позже это все переросло в UTF-16 (после изобретения стандарта)
потом родился шарп и ему ему ж тоже нужно работать с COM/OLE/Automation и существующим кодом VB и потому выбора и не было.
А я думал, что они тупо скопировали с джавы, в которой тоже UTF-16
Я хотел программировать на голанге, но мне сказали учить прежде РНР или сишарп.
В голанг-треде сказали
Чтобы быть как Михаил Флёнов, который в Канаде сначало программировал на РНР, а когда получил гражданство, то смог перекатиться в сишарп?
Да. И затем, спустя какое-то время программирования на шарпе, можно вкатиться в го.
Почему так несправедливо? Ведь я уже умею программировать на голанге, но должен изучать ещё кучу всяких языков?
НИхуя ты не умеешь ебень. Если ты думаешь что изучить синтаксис = уметь програмировать то ты ошибаешься.
Основной язык программирования в хозяйстве, веб, утилитки, гуи, геймдев поиграться итд.
Шарп.
Перед изучением ПХП надо выучить питон.
пхп конечно пытается стать как жава, но...
с огромным количеством детских болезней, которые никуда не денутся никогда (читай https://habr.com/ru/articles/142140/). И если думаешь, что "так 10 лет после этой статьи прошло. все уже не так", то ты сильно ошибаешься.
пхпшник может просто знать подводные камни и приучиться их обходить костылями.
это не программирование, а костылирование.
Это из разряда "мы не ищем легких путей". так блин поищите.
когда потом переходишь на питон, то ссышь кипятком от того как там все стройно и понятно в своей основе. Никаких тебе неявных переводов в числа, нормальные коллекции, единый подход ко всему, нормальные исключения, все ведет себя предсказуемо.
Это мелочи. Лучше иметь работу на несовершенном языке чем быть кукаретиков на питоне и сишарпе
то есть ты хочешь сказать, что "на го работы нет"
а на пхп и шарпе есть и поэтому и шлют учить их?
ясно.
Сейчас работы ни на чем нет кроме 1с. На пхп есть чуток.
>приходишь, а там такие же как ты...аааа
>А где деды? А они свалили с такого проекта, не жависты же, вот и приходится нанимать хоть кого то на замену
Кстати неплохой вариант для новичка. Приходишь такой на проект о котором никто ничего не знает и спокойно с новоприобретенными братюнями вкатунами познаешь все тонкости профессии. И предъявить вам особо никто не сможет. На все доебки можно спокойно делать "у нас же лапки", "насяльника стараемся как можем", "ты не настолько дохуя нам платишь козел, чтобы выебываться" и потихоньку пилить код. Так можно как минимум полгода-год проковырятся. И либо стать охуенным гуру, либо спокойно свалить на более другое место с хоть каким-то реальным опытом в резюме.
Ыыы)))
Ыыы)))
))))0
Первые несколько глав можешь навернуть для общего развития. Чтобы хотя бы базу разбирать. CLR от CLS и CTS отличать, ну или зачем .NetStandart нужен, основы типов и т.д. Непонятные вещи можешь по диагонали прочитывать.
Сейчас найти человека который её хотя бы до конца второй части дочитал - редкость.
Но лучше советую перед собесом краткий справочник Албахари пару раз перечитать. Там всего 300 страниц и самая мякотка выбрана без лишней шелухи.
Только это если что, по самому C# и самой платформе .net
По фреймовркам типа ASP или EF так просто не отделаешься. Там уже опыт нужен.
Точно - проебался. Он же только про .net Framework писал, позже он ничего не выпускал. Сорян.
А на кого собеседуешься? Честно, как-то рихтер на джуна (включая опытного) даже не понадобился
По конвенция вью модели должны заканчиваться на ...ViewModel, то есть как-то так: ViewModels > Memes > YobaViewModel.cs
Насколько хуёво будет опустить такой постфикс? ViewModels > Memes > Yoba.cs
Ведь то, что Some.cs это ViewModel, должно быть понятно из нэймспэйса, да и если опустить постфикс, то это даёт экономию в символах - можно сделать название типа длиньше.
>Ведь то, что Some.cs это ViewModel, должно быть понятно из нэймспэйса
Кому понятно? Неймспейсы написаны где то там в юсингах и поди разбери к кому относится.
В шарпе дроч на имена, там это очень важно. Важно приписывать Аsync, а реализация интерфейса ориентируется на имена свойств и методов. В какой-то степени на этом основана работа Visual Studio, ну и в принципе вот такой подход выбрали.
К примеру для бейсика в большинстве случаев именование не важно. Там не надо приписывать Аsync, а то, что метод поддерживает ожидание, видно из подсказок. Имена реализуемых свойств не обязательно должно совпадать с именем свойства интерфейса.
У всего есть свои плюсы и минусы. К примеру в шарпе достаточно через двоеточие приписать имя интерфейса и если имена совпадают, то на этом твои полномочия всё. В бейсике тебе придется реализовывать КАЖДЫЙ элемент интерфейса самостоятельно - ты должен найти соответствущее свойство и приписать Implements InterfaceName.PropertyName
Вот и решай какой стул приятнее.
если WPF
1 событие вообще может не произойти
2 и если произошло то может быть виртуализация и это не значит что он уничтожен
У меня какая-то хрень с биндингами. Привязал список, а когда я извлекаю итем модели и вставляю его в другое место списка, то на стороне вью удаляется экземпляр и создается новый (что ожидаемо). Как только я меняю свойство модели, то свойство почему-то меняется сразу в двух итемах - в текущем и в якобы удаленном.
Удаленный итем вью где-то висит мертвым грузом и я не понимаю как это уловить. Событие Unloaded происходит. Правда если в этом событии очистить дата контекст, то итем вроде как удаляется. Не уверен что проблема в нем, скорее всего это разрывает биндинги, привязанные к дата контексту.
Возможно виртуализация. У меня есть еще одна вьюшка, где применяется биндятся итемы панели, которая не поддерживает виртуализацию и вот там такой проблемы нет.
Нет никакой функции, как у GC, которая бы узнала какие кто ссылается на экземпляр? Пытался заюзать BindingOperations.ClearBinding но такое ощущение, что это не работает. И можно ли использовать Disposе, вроде как в MVVM это не очень правильно?
И еще маленький вопрос. Я связал три свойства A-B-C в двухстороннем режиме. И когда я меняю свойство C, то почему-то логи показывают, что порядок изменения свойств неожиданно идет в противоположном направлении т.е. начиная с A, затем B, затем C. Это нормально или логи не успевают регистрировать? Разницы между временем логгирования естественно нет.
Ну он визуально исчез из вью-списка и произошло событие Unloaded для данного итема. Поэтому я и написал "якобы". Но при этом срабатывает метод OnPropertyChanged с уникальным UID "удаленного" итема - из чего я понял, что экземпляр не удален.
А по поводу очистки дата контекста, это я не так выразился. Просто перестают обновляться свойства, а уничтожен ли экземпляр — неизвестно.
ты отдели мух от котлет
контрол выгружается (при этом он очистит свой датаконтекст) и OnPropertyChanged он не кидает, а ловит разве что
>OnPropertyChanged он не кидает, а ловит разве что
Я так и написал. Я его использую для ловли изменения свойства.
И несмотря на то, что визуально контрол исчезает из списка, OnPropertyChanged ловит изменение свойства этого контрола.
>при этом он очистит свой датаконтекст
А по факту, пока я вручную дата контексту не присвою null, OnPropertyChanged будет ловить изменения.
Пикрил - примерный лог.
без кода этот разговор ни о чем.
кто знает как ты там подписываешься на вьюмодель. Даже если забыть про сильную подписку или слабую (которая все равно будет работать пока не придет GC), то например из твоего лога никак не видно как у тебя вдруг на старых итемах стал титле "A"
Второй день уже ебус с этой ошибкой. Какого хуя он не инжекстится .
Вот относительно ViewModel хз. Мне кажется, это подписи нужны для новичков. Любой класс может быть вьюмоделью, если он INPC, какой смысл это приписывать? Но я не знаю дают ли имена в продакшене.
Что касается примеров пикрил, то первый наименее удачный вариант. Во-первых там какая-то тавтология из ViewersOverviewes. Второй и третий слишком абстракные, все что нам сообщается, что это детальная вьюмодель, но вьюмодель чего?
В первом я бы удалил одно из слов Viewers или Overview.
Дак они все устаревшие. Сейчас дотнет 7, а через полгода уже будет 8. По ним ничего не вышло ещё и выйдет через 2-3 года только.
Разве роль не должна быть отдельным классом наследуемым от IdentityRole<T>?
Ну вообще делят так.
1 папка ViewModels/Views/Controllers то есть основное деление по типу (внутри могут быть сгруппированы по фиче) - позволяют расположить это в разных сборках. Когда пишешь на хамарин то у тебя вьюхи там отдельно и это жизненно необходимо.
2 Основная группировка по фиче - вьюмодели и вьюхи лежат рядом в папке Feature (где модель спорный вопрос - ибо может быть и рядом если у тебя плагин какой, так и в другой сборке чтобы таки отделять). Так удобнее, но как бы нет изоляции вьюмоделей от вьюх, что не позволяет менять виды. Но вот вопрос в том - надо ли...
>>682470
>Мне кажется, это подписи нужны для новичков
Подписи нужны для удобства. Adapter, Proxy, *Service и так далее - дают прямую подсказку зачем нужен этот класс. вьюмодель ничем не отличается. А где он там лежит - вообще не имеет значения, потому что неймспейс обычно не виден при использовании имени класса. Да, бывают длинные имена, но тут выбор меньшего из двух зол - и выбор очевиден.
Не очевиден? Допустим ты читаешь чужой код на гитхабе, в диффе, или даже в IDE и видишь класс User. Удачи тебе выяснять что это на самом деле вьюмодель. Тебе придется читать блок using что мало поможет, в IDE ладно ты можешь навести мышь и узнать неймспейс...но и он тебе мало поможет если используется feature структурирование проекта.
Есть один метод который работает с сетью и в котором на весь метод расположен try/catch. Сеть может отвалиться и тогда создастся эксепшн. Я хочу сделать перезапуск этого метода через n секунд. Если я вызову в этот метод в catch то насколько я знаю создастся еще один "экземпляр" этого метода в памяти и вообще получится аля рекурсия. Повешать try/catch выше на вызов этого метода тоже шляпа потому что я вызываю этот метод множество раз из разных участков кода.
Пока что единственное что я придумал это поставить метку в начале и в catch перемещатся через goto.
Существует ли какой-то более элегантный способ?
Я тебе выше написал, что каждую новую версию надо учить специально. Сишарп - это не джава, где 30 лет обратной совместимость. Тут каждый год всё меняют.
Я может плохо тебя понимаю, ты о синтаксисе говоришь или экосистеме в целом?
Батарейки постоянно меняются, иногда с обратной совместимостью, но часто и нет с здоровыми мануалами по миграции
Синтаксис только дополняется, иногда фичами которые на столько фачсты что люди поднимают версию языка если не получается поднять версию кора
мимо
В сишарпе 8.0 ввели понятие ссылочных типов, не допускающих null, которые выглядят также как старые ссылочные типы, допускающие null. Так что это не дополнение, а замена.
>Не жалуйся только потом что тебя отпиздят за углом галеры
наоборот, будут считать гуру который знает как испольовать goto (ведь обычный программист знает всего 1-2 случая где полезен goto, а тут такой мастер)
Наллабал референс тайпс это же просто сахар на уровне языка, на итоговый ил не влияет
Но пишешь ты не на иле, а на сишарпе, а значит вынужден учитывать все эти изменения.
Они опциональны, это сахар. Дополнение для языка являющееся лишь подсказкой которую иногда ещё и осознано глушить приходится null!
Без доп настроек string a = null даже не ошибка и компилер только предупреждение кинет
По факту юзер не всегда перетягивает выбранный итем. Поэтому нужно чтобы было событие типа PreviewSelectedItemChanged, возникающее при MouseDown, чего естественно хуй есть и естественно просто так это не реализовать. И естественно все туторы об этом умалчивают.
Я просто не могу имаджинировать что за ублюдок создал TreeView. Это говно, будем честны, не создано для MVVM никак. Если собрать в кучу все время, которое я потратил на это говно, уж лучше бы я написал с нуля. Это за гранью добра и зла.
Пришлось наверитенить таких костылей, то теперь хрен разбершься от чего вот это >>682227
Возможно я избрал раковую стратегию, но либо консольный софт, либо asp+spa, а на все эти десктопные гуи просто кладу болт
Плевать вьюхам на MVVM. Их дело поддерживать систему биндингов, а то что тебе хочется там логику разделять - до этого им дела нет.
У тебя выбор: либо смотреть курс Александра Шевчука, сертифицированного специалиста Microsoft, либо читать метанит, который написан рандом челом из интернета, который даже свой сайт написал на РНР, но учит людей сишарпу.
какая разница на чем написан сайт. там и про ассембплер есть - писать сайт на ассемблере?!
ты должен был начать с этого
https://github.com/punker76/gong-wpf-dragdrop
а не с нуля писать.
По итогу во всех проектах установлено nullable disable. И большинство не просто не знают как с ними правильно работать, а даже и не подозревают, что в шарпе подобное есть.
Спасибо, да я уже сделал, просто накопился бугурт. Тут понимаешь, нужно сделать с определенным визуальным стилем и функционалом, поэтому все готовое не всегда подходит.
Я сам сделать не против, если бы реализовали БАЗУ.
Короче, в диспозе заюзал BindingOperations.ClearBinding для всех поптисок внутри контрла. Я немного не понял как это работает — я пытался изнутри контрола очистить биндинг снаружи, типа
BindingOperations.ClearBinding(this, myControl.DataContext)
а надо чистить биндинги на DataContext.
Проблему так и не установил, пока обошелся диспозом.
Подписка на самого себя не вызывает утечек памяти, если хендлер ничего постороннего не удерживает (а на пике не удерживает) - раз
Лямбду не отпишешь - два. Ну да получишь немного напряга GC из за циклической ссылки, но спичек что ли мало
ну кто знает что там у тебя
у меня когда я прикручивал лайфтаймы к контролам, то особо отмечено что с виртуализацией "Recycling" все нужно делать вручную - там бредятина с событиями смены DataContext и Unloaded
TreeView не изучал - не было нужды
Да я сам не знаю что у меня. Я уже как-то сомневаюсь, что вот эти три подписки (пикрил, нижние строчки) автоматом удаляются, а они у меня буквально для каждого итема. Я их как раз юзал, чтобы реализовать Preview Select.
это подписка на самого себя же. Их нет нужды отписывать.
Смотря как он у тебя авторизуется. Если, например, через jwt, то Id можно прописывать в нем и брать его оттуда при авторизации.
У меня jwt. При генерации токена я вкладываю в него айдишник. Каждый раз парсить его наполучение айдишника получается ? Методы со скрина возвращают всегда null почемуто.
Почему ид ты из какого то левого менеджера берёшь а остальные нормально из клаймов.
В любом случае есть дебаг вью
Все , я нашел ошибку. Если кто еще столкнется с этим, то при генерации токена надо прописывать claims: List<claims>. У меня было тупо claims.toString();
1. у тебя добавилось еще две буквы к и так длинному тексту.
2. когда у тебя в папке будет храниться большой список из подобного
ViewModelOfOldSchoolEOTSpammerBitard.
ViewModelOfKfftgsdfg.
ViewModelOfSdddfgg.
ViewModelOfWfftgsdfdg.
... то сложно будет искать нужное — ибо глазу вычленить искомое из середины текста сложнее, чем из начала.
3 (ключевая причина). у тебя список в IntelliSense будет упорядочен не так как надо. Тут ты можешь возразить, мол, у тебя наоборот будет группировка, но IntelliSense прекрасно справляется с фильтрацией, если начать писать "ViewModel". НО, когда ты начнешь писать код, то автодополнение тебе ничем не поможет — оно будет дописывать совершенно не то, что ты хочешь и в один момент твой пердак порвется в колчья. Чем уникальнее начало названия, том меньше придется писать при работе с автодополнением (это мои наблюдения).
Я уже заебался конкретно, нихуя не работает, как офнуть tls в winhttphandler знает кто?
Tls/ssl в фреймворке это вообще очко ебаное. Есть проект который в нагрузку к фреймворку ещё и на вин 7 должен работать и это ебучая анальная эквилибристика с сетью.
Если можешь то беги
Да сука, мне нужно всю эту хуйню настроить чтобы как раз в будущем избавиться от ебаного легаси говна, а эта хуйня мне сука пишет
Bad gRPC response. Response protocol downgraded to HTTP/1.1.
про сортировку и подсказку тебе написали
но и вообще выглядит как дичь
зы: кто там капчу делает? че мелочишься? делай 1000 черных букв на черном фоне и выброси все слова, оставь только слова с потолка типа кувырк. Ну чтобы наверняка.
почему визуальный родитель должен удаляться если ты обнуляешь дочерний?
Появляется диалог с ошибкой CLR20r3, System.Threading.Thread Abort.
Пытался трассировать всеми известными мне способами:
System.Windows.Forms.Application.ThreadException System.Windows.Forms.Application.SetUnhandledExceptionMode(UnhandledExceptionMode.CatchException);
AppDomain.CurrentDomain.UnhandledException
но ничего не получил, 0 инфы (лог просто обрывается, пытался выводить в диалог но он просто не отображается.)
Как еще можно попытаться локализовать проблему, узнать бы какое исключение валит и где.
Есть класс типа ClassVasyana<TDva, TOdin>.
Надо чтобы он стал ClassVasyana<TOdin, TDva>.
В стандартной студии такого рефакторинга нет.
Как это сделать? Может есть какое бесплатное расширение?
Платных расширений типа решурпер я себе позволить не могу.
>OldSchoolEOTSpammerBitardViewModel
>ViewModelOfOldSchoolEOTSpammerBitard
А кто-нибудь вообще из числа программистов догадывается, что такой нейминг, мягко говоря, не удобно читать?
Что мешает делать пробелы нижним подчеркиванием?
Вроде размеры мониторов позволяют, не?
Раньше, до 15 века, писари-монахи тоже не были знакомы с таким изобретением как пробел, а может быть бересту экономили. А может просто боялись перечить авторитету предшественников, боялись вякать, мол, тут так заведено, не я эти правила придумал, не мне их менять, я простой монах, маленький и никчемный, там лучше знают как удобнее.
Но вот уже как 500 лет человечеству знакомы пробелы.
Ну как, знакомо большинству. Но только не программистам. У них особый нейминг, не как у людей. Подчеркивающий, что они наверное лучше и умнее (нет).
Вот кто-нибудь реально может объяснить такой дегенеративный нейминг? Почему его до сих пор не искоренили волевым решением, хотя бы в рамках отдельных проектов?
Или же может у меня с глазами что-то не так, проблема во мне, а большинство людей нормально воспринимает вот это ViewModelOfOldSchoolEOTSpammerBitard своими могучими глазами?
1. Нейминг был важен, когда кодили в блокноте. Сейчас IDE и даже сраный гитхаб все тебе подсветит.
2. Шарп отлично компилируется с любым неймингом. Лишь бы программисту было удобнее читать.
Вот мне как программисту и удобно иметь один нэйминг которого все придерживаются. От майков до васянов
ВьюМодел в конце и да, удобно т.к. их обычно не 1 и не 10
Это не camelCase, а PascalCase, потому что автор языка паскалист
Я думал "спрятать" сложность имени в нэймспэйсы (тысячи их), типа ...ViewModels.Bitard.OldSchool.EOTSpammer, но меня обосрали мне сказали, что я неправ.
Но я просто самоучка без опыта, так что, скорее всего, просто нихуя не понимаю и не пойму похоже. Хотя смысл дописывать ViewModel (Command, Service, Store) кажется понимаю, но у меня пока получаются только длинные имена и я хуею с них.
>ViewModels.Bitard.OldSchool.EOTSpammer
Проблема тут в том, что неймспейсы обычно никто явно не пишет, их подключают через юзинги, и часто их много изается в пределах одного файла.
Соответственно, имена классов могут начать конфликтовать.
Использовать везде полные имена с включением неймспейса - многословно.
Использовать имена неймспейсов при указании имени класса избирательно - неконсистентно.
Поэтому в итоге используются просто длинные имена классов.
У меня в проекте автоматически создался файл App.config и в интернете только о нём вся информация. А мне нужен другой файл и из него вытаскивать значения
>догадывается, что такой нейминг, мягко говоря, не удобно читать?
подчеркивание тоже отстой. лучшее это camelCase
Но на самом деле это дело привычки в конкретном языке. пишу на языках с разными типами неймингов. Не смешиваю и проблем нет.
Попытки притащить чужой нейминг в любой из языков выглядят чужеродно.
>Но я просто самоучка без опыта, так что, скорее всего, просто нихуя не понимаю
Угу. Просто когда ты в соло пилишь свой проект или даже в попенсорце на расслабоне, то все твои идеи кажутся такими охуенными и "почему остальные такие долбоебы и не делают так же". А вот когда попадаешь в реальный проект где всем на твои фантазии похуй и над проектом работает команда где у каждого свои задачи, и у всего есть сроки и цели, то начинаешь поинмать, что некоторые вещи то делаются не просто так и почти у всего есть свой смысл.
>лучшее это camelCase
почемуЖеТогдаЗдесьТыНеПишешьТак?ВсеПрограммистыШарписты,ПоймутИОценятВедь.
я ж вроде ясно написал, что не приемлю "тянуть свой любимый нейминг в чужой монастырь"
шарп - ПишуТак
питон - пишу_так
котлин - пишуТак
двач - пишу так ИБО ТУТ ТАК ПРИНЯТО
Что мешает сделать класс обертку:
class B<TOdin, TDva> : A<TOdin, TDva>
?
Так в старых местах - ты ничего не поломаешь, а в новых - будешь нужный порядок женерик-аргументов соблюдать.
Давайте представим, что я делаю игру.
И вот я - бака, который хочет абстрагироваться от апи для рисования графики.
Как это должно выглядеть?
Видится мне, что это должно выглядеть примерно как:
Папочка Graphic, в ней подпапочки directx, opengl, vulkan в папочке Graphic - я делаю класс Renderer и кучу примитивов: спрайт, полигон, текстура и т.д.
В своем приложении я использую эти вот абстракции.
Но вопрос какой. Я должен же как-то "движку" сказать, какой API использовать. И вот тут уже сложно становится.
Самое простое решение видится, это статический класс GraphicConfig, который при старте приложения - инициализирует все че там надо. И второй класс GL_PrimitivProvider, который будет провайдить нужные графические примитивы.
Но чет чем больше я об этом думаю, тем больше мне кажется, что как-то не туда я думаю.
>Я должен же как-то "движку" сказать
Нет, не должен.
Рисование графики - это библиотечный функционал.
Он должен работать с любым допустимым API.
Конкретный API выбирается на клиенте.
Оба предложенных тобою способа приемлемы.
В общем случае решается через DI.
Значит выделяешь себе день. Затариваешься пивком, закусью. Включаешь любимое музло и ручками переделываешь. В итоге имеешь приятное ощущение опьянения, чувство от проделанной работы и того насколько твой пет-проект охуенен.
Ну. Просто я даже с трудом могу представить, как такой рефакторинг должен работать на самом деле.
Вот давай прикриплейд. Что должно произойти при применении такого рефакторинга который ты хочешь.
Где-то в коде будут конверторы с конкретными типами.
Их порядок должен поменяться в объявлении.
Будут какие-то методы, которые будут принимать конверторы в качестве аргумента, в них тоже порядок должен поменяться.
Имхо дохуя хочешь, но можешь попробовать регулярками основные сигнатуры поменять
1920x1080, 0:03
И что? Каждые два года всё переписывать на новый дотнет?
У меня книжка по версии дотнета 2.1, а по новой молодежной 7.0 книжки ещё не вышли. Как я должен вообще учить сишарп, если они старые версии ломают, а по новым инфы ещё не вышло? Замкнутый цикл просто!
Почему на голанге я могу взять любой код 10 летней давности и он работает на новой версии голанга, а тут 2 года прошло и ничего не работает? В джаве вообще по 20 лет сидят на старых версиях и всё работает. Один сишарп особенный и ему надо вот прям последнюю версию.
Как в продакшене вообще работают? Каждый год переписывают всё на новые версии дотнета? Что-то сомневаюсь. Бизнес такой ерундистики не потерпит.
При чём тут код? Ты до кода даже не дошёл. Твой голанг 10-летней давности будет ебать тебе мозг вендорингом и GOPATH.
>>684872
Ты троллишь, или не в состоянии открыть и прочитать?
https://learn.microsoft.com/en-us/dotnet/core/tools/dotnet-new-sdk-templates#web-options
Я пробовал и ничего такого не было. Всё работает. А всё потому, что голанг имеет полную обратную совместимость.
Но зачем ее читать? Надо прийти в тред шарпа и начать вонять, как неудобно сделать одну команду.
Вот попробовал бы кто-нибудь собрать проект для плюсов написанный в 2003м сейчас. Уууу, там такое-то приключение каждый раз(потому что охуенно же пилить абсолютные пути до всего, да? потому что охуенно - нахуячить каких-то непонятных флагов, которые выпиливают в дальнейшем, охуенно тащить ноунейм либы, которые сдохли и даже бинарей не найдешь больше). Да или что-то из жавы, которая, охуеть как обратносовместима, но чтобы собрать - поебись разбираться, где там Gradle, где там Maven, где там Ant, кто в Netbeans собирал, о, а тут кто-то либу использовал от челов которые сдохли, ищи теперь бинари той либы и прокидывай. Но эт хуйня же все. Вот выполнить одну команду в cli - ПИЗДЕЦ, СЛОЖНО.
Ну я использую в дотнет 7 код еще с дотнета 1.1
Все работает
А еще использую в дотнет 7 скомпилированнын либы с дотнет 4.8
Несмотря на тот что кор как бы не продолжение старого нета
А от асп такого не жду, потому что это отдельный фреймворк просто от вендора.
ПРОЧИТАЙ, ЧТО НАПИСАНО:
>> to create a project that targets a framework earlier than the SDK that you're using, you might be able to do it by installing the NuGet package for the template. Common, web, and SPA project types use different packages per target framework moniker (TFM). For example, to create a console project that targets netcoreapp1.0, run dotnet new install on Microsoft.DotNet.Common.ProjectTemplates.1.x.
Код из книжки Фримана не подходит для 7.0. Там даже изначально совсем другие шаблоны генерируются и концов не найдёшь куда что писать.
О каких нугетах речь, если команда dotnet new list выдаёт ошибку. 2.1 не создаёт даже консольных приложений. Скорей всего там не SDK, а только runtime заложен.
Ты троллишь чи как?
У тебя на первом скриншоте явно есть 2,1 как сдк.
Или ты не знаешь что нугеты это просто пакеты, среди которых могут быть и инструменты для разработки, вроде ef'овских, для создания миграций, тулзы для нанофреймворка чтобы прошивать девайсы и много чего еще?
Тебе буквально надо сделать команду:
dotnet new install нугет с темплейтами для netcore2.1
https://www.nuget.org/packages?q=Microsoft.DotNet.Web.ProjectTemplates
А ты троллишь бесполезными советами
не читал фримана, потому и проблем не имею
вообще это дичь - брать древний дотнет только потому что книжка есть. Возьми другую книжку блин.
>Код из книжки не подходит
>совсем другие шаблоны
>куда что писать.
Этот вкатун сломался даже не начав кодить, несите следующего.
Маялся весь день с проблемой, но в целом разобрался.
1) Проблема в том, что на убунте 22.04 новые библиотеки для SSL, а дотнеты к ним привязаны и из-за этого отказываются работать.
2) Ради эксперимента поставил убунту 18.04, накатил дотнет 2.1 и всё завелось сразу без танцев с бубном, просто потому что там старые библиотеки для SSL.
> А ты сразу знал куда и что писать?
Зачем тебе знать куда и что писать?
Давай я встряну.
Вот я пошел в вуз. Нас учили кодить на плюсах.
Ну так вот. Второй курс - родаки ебут мозги, что не работаешь. Ок-да. Идем искать работу.
На работе - просят прикрутить JWT. Гуглишь че это вообще такое и как его прикрутить.
Просят сделать круд-контроллер для таких-то моделек. Гуглишь че такое круд, че такое модельки, что такое еф и как это все прикрутить.
Просят сделать фильтр по пермишинам для авторизации. Гуглишь че такое фильтр, че такое пермишины, как их прикрутить.
Просят переписать чужой круд контроллер на асинк-эвейты. Гуглишь че за асинк-эвейт, переписываешь.
Какие еще нахуй книжки? Камон? Я за уже 10 лет работы кодером - ни одной не прочитал, если не считать K&R, SICP, совершенный код, идеальный программист, и "Введение в системы баз данных" от Дейта. И вот эти-то книги я прочитал в вузе, потому что их требовали.
ясно. у тебя там все строго - пускают только на двач. другого интернета ( в котором ДОХРЕНА инфы обо всем на свете - бери да изучай) просто нет.
>А ты сразу знал куда и что писать?
когда только рождался этот асп.нет кор то там еще была проблема что копируешь код, а он не запускается потому что нужен какой то неймспейс который не пойми где лежит, что ставить с нюгета. Потом с этим устаканилось и появились метапакеты и все стало проще. Но ты не ищешь легких путей ясно.
>А ты сразу знал куда и что писать?
Дело не в этом я в принципе не оперирую такими понятиям "куда писать код"
А дело тут в косности твоего мышления.
Вы, вкатыши, с какого-то фига решили, что существуют какие-то 'шаблоны', в которых поняв 'куда нужно писать' ваш говнокод, вы магически научитесь программировать/разрабатывать. А потом придя в реальный проект, начинаете охуевать, "а чего тут не как в книжке написано", "а-а-а, клятый микрософт опять все поменял".
Лул. Прям с твоего описания - вспомнил чела который со мной вкатывался.
И вот че обидно. Сам дядька был типа прикольный. 38 лет, решил сменить работу таксистом на кодера. Прошел курсы. Общительный. Внешне - вроде старался.
Реальная задача: Пользователь на форме указывает файлик csv такой-то структуры, надо обработчик сделать, который должен достать данные, привести к нашей модели и сохранить в бд.
Три месяца. Три месяца чел не мог сделать. При этом - если спрашивал, то как-то странно, в духе: а как делегат пробросить туда, а надо ли делать интерфейсы и в таком духе.
Конечно, там сверху навалилось, что микросервисы, докеры и все это вот, видимо сложно сразу все переварить. Но ХЗ.
Вообще. Немного обидно за дядьку. Мне он нравился. Но как слышал, он попросился в тестеры. Там полгода посидел, прошел еще курсы и таки в сбер съебался. Надеюсь у него все ок в конечном итоге.
Даже Рихтера не читал?
>Рихтера не читал?
Всегда считал советы читать эту книгу новичками каким-то жирным троллингом, типа сначала выучите ассемблер, основы электротехнику и линейную алгебру, а только потом начинайте красить кнопки.
Для новичков она тяжела и ничем им не поможет решать возникающие у них проблемы.
Для опытных она бесполезна, т.к. во-первых давно устарела, во-вторых, в документации от МС и исходниках всё написано намного подробнее и современнее.
Степан Береговой сказал, что эта книга лучший вариант для старта
https://www.youtube.com/watch?v=BG4nnMR7uTs
Вообще, какой вывод можно сделать? Получается линукс не подходит для сишарпа. Вся эта кроссплатформенность сделана только, чтобы заливать веб-приложения в докер-контейнер. А среда разработки по-прежнему остаётся только Винда.
На винде можно поставить все дотнеты: фреймворки, кор 2.1, 3.1 и новые 5-7. И всё работает и коробки. Просто в вижле ставишь нужную галочку.
Книга издана в 2017 году.
Видос 2021-го года.
Совет из видео протух уже в момент его создания.
>Получается линукс не подходит для сишарпа.
Как будто бы для любого другого языка тебе не придется ебстись с зависимостями, библиотеками и т.д.
Вся кроссплатформенность работает только в самых популярных и распространенных вариантах. Шаг в сторону, другая версия, другое ядров, другая сборка и ты уже сосешь хуйцы.
Линукс ни для чего не подходит. Эта ебань создана любителями пердолинга настроек для таких же ебнутых красноглазиков.
>>685539
>А среда разработки по-прежнему остаётся только Винда.
Нет.
Особенно бесит такое читать не в IDE, а где-нибудь в вебе, где явно не видно, что это экстеншн, и какая у него логика.
Удивляют в связи с этим настойчивые пропосалы сообщества шарпистов сделать в новых версиях дотнета экстеншн проперти, индексаторы и прочий ад, и чтобы всё это ещё могло интерфейсы реализовывать экстеншинами.
Насколько это вообще нормально, зрело, чисто и по-синьорски использовать экстеншены в коде?
> Накатывать виртуалку с шин11 и там программировать?
Ты заебал уже весь тред жиром заливать. Два мастадонта под шарпы это студия и джеты, есть софт попроще по типу монодева или эклипаса. Все из перечисленных кроме стадии есть нативно под прыщи
Если майки такие пидарасы то что ты тут делаешь? Продолжаешь жрать кактус?
> учить ASP.NET?
Тебе даны божественные мсдн и гитхаб а ты выёбывешься. И к слову асп.нет уже сто лет как сдох и закопан вместе с фреймворком
Это не жир. Сами микрософты предлагают ставить виртуалки с виндой и вижлой на линукс:
https://www.youtube.com/watch?v=7ylEKe3F6po
Нигер такого не бывает, все методы нужные
Как сказать блядскому потоку чтобы все бросил и возвращался немедленно?
На фреймворке абортом наверное можно попробовать, на коре аборт выпилен, а интерапт не спасает если поток на той стороне, например, в вайл тру хуярит. Токены вообще не работают, потому что пользовательский код может болт положить на проверку отмены. Какие еще варианты?
>Особенно бесит такое читать не в IDE
А нахуя ты читаешь код не в IDE ? Это такой вид мазохизма, типа "у меня есть шуруповерт, но я буду закручивать шурупы отверткой" ?
>Насколько это вообще нормально, зрело, чисто и по-синьорски использовать экстеншены в коде?
Нормально. Большинство кода в продакшене сейчас состоит из одних экстеншенов с кучей лямбд.
Никак, если ты даже абортнешь тред с таской то можешь зацепить и другие таски на том же треде
Только через костыли ебаные.
Можно поебаться с подпроцессами. Написать маленький бинарник-загрузчик сборок и положить его рядом с основной программой, дальше запускать бинарник в отдельном процессе и вызывать Process.WaitForExit(таймаут) и Process.Kill().
Либо запускать новый тред и пользовательский код в нём, а после таймаута не останавливать его и запускать следующий в надежде, что предыдущий не будет жрать много ресурсов и когда-нибудь сдохнет.
Ну я стараюсь не пачкать тредпуловские потоки об эту таску.
>>685995
>Либо запускать новый тред и пользовательский код в нём, а после таймаута не останавливать его и запускать следующий в надежде, что предыдущий не будет жрать много ресурсов и когда-нибудь сдохнет.
Сейчас так и работает.
Но хотелось бы чтобы чистилось все после каждой длл. AppDomainов нет, зато есть AssemblyLoadContext, который даже метод анлоад имеет на себе. Осталось придумать велосипед, чтобы поток вернуть.
С отдельным процессом еще есть вариант, да. Туда передать стейт, а потом прокидывать сигнал обратно, что все дон или таймаут. Возможно самый правдоподобный способ.
Вроде еще есть вариант через кастомный SynchronizationContext что-то сообщить потоку.
Если хочешь бабла, то:
На бэк: .Net6 (и выше), ASP.Net Core, EF Core (и/или Dapper)
На фронт: реакт или ангуляр. Можно потом еще блейзора сверху навернуть, но это уже больше для себя и если зайдет.
Если для души: то Unity (Я х.з. какая у них там сейчас версия шарпа/моно в ходу). Но там мало бабла и выгорание.
Но будет >пик
пытался уже и efcore под 5.0.2 переустановить как советуют в интернете, удалить .vs и все bin и obj, перезапустить студию и попробовать снова, а хуй там.
Во первых, прекрати страдать хуйней и поставь уже 22-ю студию, она гораздо пизже 19-й.
Во вторых команды которые вводишь и сообщения об ошибках показывай.
Та какие комманды, просто пытаюсь идентити добавить через интерфейс и оно грит There Was An Error Running The Selected Code Generator
Тащемта разобрался, обновил ef до 5.0.17 и оно заработало
Единственная гораздость в ней - 64 битность
В остальном куча годных расширений перестало работать
А без фронта не возьмут? Меня от реакта подташнивает. Вчера 200 страниц фримана осилил, в принципе пока всё понятно
А как ты установил дотнет 2.1?
private string name;
public string Name
{
get{ return name; }
set{ name = value; }
}
Тот кто писал захотел абстрагироваться от приватного поля и дать всё на откуп сеттеру который может что то сделать с значением по пути.
Конкретно тут вопрос больше зачем явно прописывать приватное поле если оно не нужно
Новичком вряд ли. Даже у опытных очень часто требуют знание каких-нибудь фронтовых фреймворков. Чтобы разраб как минимум мог понимать, что там под капотом, залезть внутрь понять и отдебажить. При необходимости, что-нибудь подправить или какой-нибудь мелкий компонент написать.
Вакансий где 100% бэк относительно мало, а для новичков их практически нет.
А вот на собесе тебе этот вопрос и зададут. И спросят, почему нужно делать именно так (установка приватного поля через публичный проперти в конструкторе) и каким буквам SOLID-а, это соответствует.
Сможет ли бывшая JS-макака освоить C#?
Сложность в том что владелец огрызка это умственно отсталое ебанько, соответсвенно кодить с такой тупой башкой проблематично.
Это легально вообще?
То то EF имеет функционал прямой записи в приватные бэкинфилды. Видать говнокодеры )
System.Windows.Data пишет только в окно интерпретации, если происходят какие-то ошибки привязки.
лови чем угодно же
создаешь свой листенер и подписываешься
if DEBUG
PresentationTraceSources.DataBindingSource.Listeners.Add(new BindingErrorTraceListener());
PresentationTraceSources.DataBindingSource.Switch.Level = SourceLevels.Error;
#endif
Ты путаешь возможность и необходимость. Так-то в шарпе и goto в наличии есть, но это не значит, что его нужно использовать хоть где-то.
Помнится как-то на почившем Лурке была статья про goto.
Как по мне - признак говнокода, нежелание юзать методы нормального человека. Но норм примеров гото я не видел за 4 года учебы и 3 года стажа
Как я понял, new BindingErrorTraceListener() я должен сделать кастомным,
там я методе WriteLine пользуюсь своим логгером и пишу в текст.
Но тут две проблемы.
1. WriteLine принимает стринговый месседж и я не знаю как отлавливать разные уровни сообщения.
Допустим внутри WriteLine у меня такое: Log.Error(message);
Соответственно, если я запишу:
PresentationTraceSources.DataBindingSource.Switch.Level = SourceLevels.Information;
То у меня все месседжи будут помечены как Error, даже если они таковыми не явялются.
2. Ошибка выводится дважды. В серилоге у меня настроено два места вывода - текстовый файл, и окно интерпретации. Соответственно один из дефолтных листенеров тоже пишет в окно интерпретации.
Внутри списка два листенера
Listener: DefaultTraceListener
Listener: LoggingTraceListener
Мне надо один из них удалить? А если там пишется что-то еще? Сечас я сделал костыль, типа логгер записывает на уровне дебага (т.к. в окно интерпертации попадает всё начиная с Error), но текст помечается как ошибка Log.Debug("[ERR System.Windows.Data] " + message);
Но чет хуйня какая-то.
две надуманные проблемы
1 а зачем ловить Information? Ты ж ошибки просил ловить. В общем то только ошибки и нужны.
2 outout что ли? ну туда сам бог велит писать. Как бы оно для этого и придумано. (тем более что у впф даже консоли нет куда можно было бы еще вывести). В конечном использовании продукта никакого output не будет же.
Но даже если туда срет дважды, то смотри пункт 1 - то есть пофиксил ошибку и все чисто красиво.
Первый пункт меня не особо напрягает. Решил просто просить.
>Но даже если туда срет дважды, то смотри пункт 1 - то есть пофиксил ошибку и все чисто красиво.
А как это может пофиксить? Смотри, серилог имеет два варианта вывода сообщения, у каждого свой левел
.WriteTo.Debug с LogEventLevel.Error - вывод в окно интерпертации
.WriteTo.File с LogEventLevel.Debug - вывод в текстовый файл
В итоге у меня в окне интерпретации сначала выскочит это
System.Windows.Data Error: 4 : Cannot find source for binding with reference ...
Затем это
[ERR 13:22:31:530 System.Windows.Data] "Cannot find source for binding with reference ...
В текстовом файле, соответственно, будет только последняя строка
Первую строку срет какой-то дефолтный листенер, а вторую — серилог из моего листенера.
никак ты это не пофиксишь. лично я не знаю как отменять дефолтный вывод. И сильно удивлюсь если это возможно ибо это противоречит самой идее отладки.
разве что попросишь серилог не какать туда сообщения от этого листенера.
>В этом и есть основной смысл
Ну да, это имеет смысл, когда дочерний контрол находится в том же XAML документе, что и родительский, тогда я могу использовать что-то вроде этого
<UserControl x:Name="Parent" d:DataContext="{d:DesignInstance Type=t:Main_ViewModel}">
. . . <Grid x:Name="Child" DataContext="{Binding Child_ViewModel}" >
. . . </Grid>
</UserControl>
Здесь Child учитывает контекст данных родителя и видит всю внутрянку Main_ViewModel.
А если я делаю еще один UserControl и вставляю его с грид? В дата контекст UserControl лезет неведомая залупа, которую он не ожидает видеть внутри. Он делался отдельно от всей этой параши, он не знает куда его всунут и что туда прилетит. Как мне установить защиту в таком случае?
Что я делал раньше? Внутри юзерконтрола создавал свой собственный проперти, который и названием и типом сообщал что он хочет получить в себя, и уже он перенаправлял инфу в контекст данных. В итоге получается так, что в контекст данных сначала прилетает какая-то залупа, вызывающая тонну ошибок привязки, а уже потом данные нужного типа.
А, я сам обосрался. Отмена.
Вот же долбоеб.
У меня когда проперти обновляется, то я из метода OnPropertyChanged кидаю данные в дата контекст, вместо того,чтобы дата контекст связать с проперти
DataContext="{Binding RelativeSource={RelativeSource Self}, Path=TestProperty}"
Тогда автоматический биндинг датаконтекста к родительскому датаконтексту разрывается.
Вместо того, чтобы обратиться по имени к предку, будет пройдена вся цепочка? А если я вырежу дочерний контрол и снова вставлю? При первых тестах, привязки слетели.
Сомнительная хуйня.
>В дата контекст UserControl лезет неведомая залупа, которую он не ожидает видеть внутри
значит раз он не знает ничего, то ему и нечего быть там куда его запихивают
>Он делался отдельно от всей этой параши, он не знает куда его всунут и что туда прилетит
Не его проблема знать что прилетит. Он знает про то, про что знает - и уже забота впихивающего контролы куда попало впихнуть и нужное контролу.
>>688641
Лично я не знаю как себя ведет DataContext контрола если вставить его из кода в другой контрол, но ожидаю что он унаследует DataContext места куда вставлен (в момент вставки, то есть смены родителя) и привязки обновятся. Но я не проверял и не сталкивался - я не знаю зачем об этом вообще думать и что то делать в коде такого рода, а именно создание контролов и ручное распихивание.
Зашел в debug, и у меня почему-то не активны отладка и запуск без отладки. Не нажимаются. С чем связано?
Новое приложение создал чисто консольное на винде и заработало, спасибо
А то автор туториала хуярит в vscode, а я чет хочу продолжить в студии писать, но расширений таких же нету
Норм пацаны в студии только непосредственно сам шарп код в студии хуярят. Ну может еще джейсончики по быстрому если поправить. Всю остальную xml, yaml и т.д. муть лучше отдельно в VSCode делать, так быстрее и удобнее.
Понял, спасибо
>значит раз он не знает ничего, то ему и нечего быть там куда его запихивают
Он знает, но пользователь не знает. Все что он видит - DataContext типа object. Он либо должен лезть в мой код моего юзер контрола, либо я должен на лбу у него написать, какого рода хуйню ожидает мой контрол в качестве данных.
Внутри на уровне xaml у меня нет никакой защиты от неверных данных и нет никакого способа подсказать, что юзерконтрол ожидает.
>Не его проблема знать что прилетит.
А кто знает? Пользователь не знает, контрол не знает. Зачем придумали строгую типизацию, интерфейсы? Почему бы не пихать все в Object?
Вопрос такой: как у C# с IoT? конкретно интересует взаимодействие с умными розетками и роботами-пылесосами, хочу с определенной периодичностью через крон-выражения их запускать, есть такая возможность?
ок, спасибо, теперь хотяб пойму куда копать
Чому оно не создает юзера и просто говорит мне, что usernotfound
Но тут возникла другая проблема — ебаный попап.
В чем суть: в попапе есть Panel, которая выполняет функцию отображения списка в стиле плиток, эта панель биндится к нашему любимому дата контексту. Дело в том, что при сворачивании попапа (т.е. .IsOpen = false;) регистрируется диспоз итемов списка, но сами итемы не удаляются из панели. И если снова развернуть попап, то висят те же экземпляры.
НО, если я перед сворачиванием попапа перемещу Panel куда нибудь во временную переменную, то у меня в DataContext приходит null и итемы не только диспозятся, но и сама панель очищается. Соответственно, когда я помещаю панель обратно в попап, то присходит персвязывания с дата контекстом, который не пуст и итемы спавнятся заново как и должно быть.
Шо за хуйня? Что этот попап себе позволяет? Когда я делал тривью, то у меня при разворачивании ноды создавались суб-ноды, а при сворачивании - удалялись. Тут же какая-то хуйня на полшишечки. Связано ли это с тем, что у панели отсутствует виртуализация? И как с этим бороться?
Есть вопрос касательно jwt аутентификации.
Вот есть авторизация через jwt и нужно, что бы она всегда вызывалась, но не кидала ошибку unauthorized. То есть может быть запрос с токеном и без токена, но если пришел токен мы его проверяем. Придумал общее решение указывать два атрибута [Authorize(моя_схема)] и [AllowAnonymous] и проверять по контексту его аутентификацию. Это работает для обычного контроллера, но если мы используем какой либо пакет который сам выставляет и конструирует ендпоинты то это уже не работает. Собственно можно ли без атрибутов такое сделать ?
Если ты просто добавишь жвт но не поставишь его по умолчанию то читаться он будет всегда независимо от атрибутов
Регни обработчики и поставь брэйки. Если залетит то ты накосячил с интерпретацией данных.
К примеру так ловил протухший жвт в эллоуанонимус методах (логика некоторых зависела от того аутентифицирован юзер или нет) что бы юзера заставить рефрешнуть токен
>но пользователь не знает
>Пользователь не знает, контрол не знает
программист знает - ведь именно он знает что контролу надо в DataContext. Это видно после первого пробного запуска. А если он не знает, то пусть на завод идет.
>Почему бы не пихать все в Object
Потому в WPF активно пихается. Там очень много рефлексии и поэтому о проблемах типов узнаешь в рантайме.
>Дело в том, что при сворачивании попапа (т.е. .IsOpen = false;) регистрируется диспоз итемов списка, но сами итемы не удаляются из панели. И если снова развернуть попап, то висят те же экземпляры.
да, есть такое
во-первых, он кривой. приходится использовать нагугленное вроде NonTopmostPopup
во-вторых, он при закрытии вызывает событие unloaded у содержимого, но само готовое содержимое просто прячется, то есть ведет себя как collapsed и при втором открытии никакого повторного связывания DataContext не происходит.
А значит минимум тебе нужно
а) у попапа при закрытии чистить DataContext=null
б) при открытии устанавливать DataContext иначе при втором открытии у тебя будет пусто.
>при открытии устанавливать DataContext
Имеется ввиду ручной биндинг, типа "new Binding ... бла, бла, бла ... SetBinding"? А с ним нет проблем типка как с ручной подпиской, которую потом надо удалять при диспозе?
> DataContext=null отличается ClearBinding?
биндинг это одна привязка. DataContext - источник привязок и он каскадно обнулит все биндинги
искать нужный биндинг в Child попапа - дело неблагодарное.
то есть содержимое попапа при закрытии никуда не девается (считай collapsed) и смотрит на тот же вьюмодель со списком. И далее нет разницы - обнулишь ли ты датаконткст или вьюмодель со списком изменишь - это затронет биндинги.
> с ним нет проблем типка как с ручной подпиской, которую потом надо удалять при диспозе?
Разве надо? Не надо
Предположим пикрил цепочку связей датаконеткстов.
Точка С в цепочке — это попап. Понятно, что D, E, F обновятся, при этом связь продолжит существовать, но что произойдет со связью B-C? Она разорвется?
Я не понимаю поведение биндингов когда в их работу что-то вмешивается. Они продолжают существовать, но не работают из-за разницы данных, или биндинги уничтожаются?
>Разве надо? Не надо
Ну есть же сильная и слабая подписка. При слабой подписке типа то что делается в WPF <Button Click="Button_Click" /> все очистится само собой, а сильная подписка может мешать сборщику мусора.
Из хорошего, что понравилось Управление памятью Коксы и у Сидристого в DotNetBook парочка годнейших глав встретились. Ну Рихтер, разумеется. Еще какую-то пробовал начинать, но бросил, ни названия ни автора не запомнил, помню только, эта книга когда-то в шапке этого итт треда фигурировала.
>Предположим пикрил цепочку связей датаконеткстов.
Нет цепочки датаконтекстов. Есть наследование
1 ничего не делаешь и неявно наследуешь контекст что у родителя
2 делаешь новый контекст из родительского путем DataContext="{Binding на что то в родительском
При смене DataContext все контролы которые не определили свой контекст получают этот новый контекст (наследование). Все биндинги становятся неактуальными (источника биндигов больше нет, пришел новый). Mode=OneTime не имеет значения, ведь меняется не свойство куда привязан биндинг, а вообще весь источнк и биндинг к несуществующему более источнику лишен смысла. А значит и биндинг который рождает новый датаконтекст для группы 2 тоже пересоздается заново на новом контексте, тем самым затрагивая и вторую группу
Даже такой биндинг
{Binding RelativeSource={RelativeSource AncestorType=ItemsControl}, Path=DataContext.<prop>
должен реагировать на смену DataContext
(хотя я и не проверял ни разу, а вдруг нет, я не очень понимаю как себя ведут такие вот биндинги с путем на уровень ниже. Возьми и проверь)
Биндинги, которые не завязаны на меняемый DataContext (с его наследованием) - им похер на его изменение.
>При слабой подписке типа то что делается в WPF <Button Click="Button_Click" /> все очистится само собой,
Это сильная подписка. Это эквивалент this.Click+=Button_Click в конструкторе. Просто такая подписка не приводит к утечке памяти.
Слабая подписка - она в биндингах, например. И так то выглядит страшно, потому WPF дает хелперы для таких подписок (которые работают через рефлексию в силу анальной сути event в шарпе - ну то есть через жопу все)
https://learn.microsoft.com/en-us/dotnet/desktop/wpf/events/weak-event-patterns
Да собственно тем и отличаются. Обычные пилят всякие sql решения и всякие аналоги. Облачники ебутся с облачными сервисами и интегрируют их в предприятие (и поддерживают потом)
Так это девопсы тогда. Разрабам самих сервисов, обычно похую где их поделия крутятся, на железе, в контейнере или облаке. Максимум они у себя конфиги настраивают под то, что скажет девопс и все.
Девопсы вроде cloud инженеры.
Я вот просто у питонщиков подсмотрел MkDocs. Вроде норм. Но типа блин. Все равно немного инородно.
Может быть знаете что-то такое же удобное, но ближе к шарпу?
А как мне эту наследственную связь восстановить, если я тому же дата контексту C присвою null? Я имею ввиду состояние, когдя я мог бы обнулить дата контекст B, и это бы обновило C, D, E, F.
Если я просто скопирую из B в С, то обновятся D, E, F. Но если я изменю B, то это никак не повлияет на дочерние элементы т.к. в С будет тупо ссылка на вьюмодель.
Остается только создание ручной привязки, так? Или есть какой-то еще вариант?
>Пацаны, а че у вас используется чтобы вести дев-документацию?
Ее осуждают. Типа возможность вести питоновскую документацию снижает энтузиазм писать понятный код, внятно именовать параметры, делать предсказуемое поведение и прочее.
да тупо в code-behind popup.DataContext = ... перед открытием и после закрытия.
можешь попробовать сделать атачед проперти, который сохранит контекст и будет его восстанавливать.
>Если я просто скопирую из B в С, то обновятся D, E, F. Но если я изменю B, то это никак не повлияет на дочерние элементы т.к. в С будет тупо ссылка на вьюмодель.
ты лезешь в абстракции "яйца и бабушка". То есть вроде верно, но не нужно.
Я не знаю как там у тебя - обычно то проблемы нет. Есть вьюмодели, есть зависимый попап. При выборе допустим другого SelectedItem данные для попапа перестраиваются.
Ок, возможно у тебя это крайне тяжелые операции и они должны быть lazy до реального открытия и очищены после закрытия. Значит в code-behind на события открытия закрытия достаем вьюмодель из DataContext и просим ее подготовить (заполнить список плиток) и очистить потом данные (очистить список плиток). Вьюмодель просто будет менять свое состояние, а обо всем остальном позаботятся биндинги. Можно оформить как бехавиор или атачед если очень хочется. И в общем то так не меняется DataContext потому и "разрыва связи" не будет.
>popup.DataContext = ...
Что именно?
popup.DataContext = popup_parent.DataContext?
1. Тогда у меня будет храниться ссылка на экземпляр вьюмодели. А теперь представь, что в дк базового предка поступает новый экpемпляр вьюмодели, а в попапе останется старый. И в моем случае это важно.
2. Если я что-то сделаю с дк родителя (как мне захотелось сделать это с попапом), а контекст дочерних элементов не обновится, а потом ищи почему не работает.
А что если контент попапа тупо переместить во временную переменную и потом вернуть обратно? Изначально у меня так и было. Надо посмотреть про атачед проперти.
ну вот и не мучай жопу, а при закрытии попапа попроси вьюмодель очистить данные (хоть банальное Items,Clear() и все вьюхи итемов отвалятся)
что то делать при открытии - это если тебе нужно.
атачет пропа - просто способо оформить "по красоте", а не является необходимостью.
>>690415
> Ее осуждают
И как тогда другим разработчикам передавать всякие договоренности?
Ну, типа решили мы что надо время в UTC хранить. Или там, что никаких Json.Net. Что енумы передаем и храним в базе как строки. И т.д. Каждому вновьприбывшиму - все это рассказывать? Так веть 100% чет забудешь, а обнаружишь только при PR'е или вообще в проде.
В readme пишешь.
Если дохуя большой продукт то можно поднять wikijs с бидиректом в гит
>Ее осуждают. Типа возможность вести питоновскую документацию снижает энтузиазм писать понятный код, внятно именовать параметры, делать предсказуемое поведение и прочее.
Вот питонисты, это последние ребята на которых я бы ориентировался. Эти долбоебы сделали одно из самых хуевых решений в дизайне ЯП, только из-за того, что им лень было пару скобок поставить. Ясен хуй, что им доки лень будет писать.
Стандартом минимум является xml-документация. Хотя бы api в веб сервисах или публичные интерфейсы в библиотеках должны иметь xml описание. Т.е. то, что можно прокинуть в OpenApi.
Остальное на усмотрение мейтенеров и соглашений команды.
Если же иметь в виду полную документацию к сервису, то все зависит от владельца сервиса, что и как у кого настроено.
Стандартные варианты:
- jira + confluence
- redmine
- youtrack
- какие-нибудь кастомные вики сервисы
- тупо в гуглдоках
- вики в репе (гитлаб, гитхаб, битбакет)
- еще какая-нибудь хуйня.
Каждый из этих способов позволяет (при наличии прямых рук у админа/девопса) достаточно плотно связать доки и базу знаний с кодом (ветки, коммиты, файлы и т.д.), при этом держа их отдельно. Ну и работать будешь ты с тем, с чем тебе скажет работодатель. Что-то свое можно пропихнуть, только если на проекте ничего нет, либо твой вариант будет в разы лучше.
Система docs-as-code (в том виде когда доки хранятся непосредственно в коде/репе проекта), обычно редко применяется. Т.к. в большинстве случаев доки должны шариться не только среди разработчиков, но и тех у кого нет или не должно быть доступа к коду. Поэтому их разделяют.
Еще один вариант который часто применяется - юнит тесты. Т.е. помимо тех тестов которые контролят код, добавляется блок который создан исключительно для демонстрации возможностей проекта/библиотеки. Достаточно удобная штука на мой взгляд.
Алсо, для своих петов рекомендую использовать самый простой способ (помимо xml-доков) - обычный markdown. По факту это просто текстовые файлы, которые будут нормально отображаться в любом git сервисе (гитлаб, гитхаб и т.д.), их легко можно читать где-нибудь в браузере или VSCode, либо заюзать обсидиан.
>только из-за того, что им лень было пару скобок поставить
Нужно код писать, а не выражаться затейливо
Угу и именно по этому им пришлось придумывать свой Pepe8, потом сраться из-за него. Это не говоря о том, что часть питонистов мечтают вернуть скобочки взад.
Для заметки. Сам по себе язык неплох, я его пробовал. Но решение сделать элемент форматирования (причем такой неоднозначный), частью синтаксиса языка - одно из самых ублюдочных решений в истории дизайна языков программирования.
Есть. Но либо в виде аутсорса, либо по очень хорошему знакомству и рекомендациям. Стандартные говнопроекты, которые можно было бы спихнуть на биржу, на WPF практически никто не делает. А к серьезным левого человека с улицы подпустят.
>этому им пришлось придумывать свой Pepe8
Да. Потому что скобочки - далеко не все особенности кода где можно наделать говна. И автоформатерам нужно на что-то опираться. Но зато меньше возможности говна наделать в скоупах
>- одно из самых ублюдочных решений
Сколько людей столько и мнений.
Больше всего-то триггерит именно что студия опять же упорно пытается сохранять не в UTF, а в кириличнской кодировке, а потому - на выходе получаю, что другими редакторами если открывать - вижу ромбики(((
А куда ты его кладешь? Он должен лежать или вместе с солюшеном, или в каталоге проекта, тогда вижла его автоматом должна подтягивать при загрузке проекта. Если он там и лежит, то попробуй напрямую добавить его в солюшен. Solution > Add > Existing Item
Сам по себе файл у тебя вроде норм.
>>649578 (OP)
Аноны, помогите разобраться с добавлением новой строки в dataGridView.
Есть таблица с определенными столбцами, хочу реализовать следующее: после заполнения текстовых полей и нажатия кнопки добавить, в таблицу будет добавляться новая строка и заполняться соответствующие ячейки новой строки.
Легко и просто реализовал это в Qt C++, а здесь нихуя не получается.
Надо что-то вроде аналога insertRow. А может как-то по-другому.
Спасибо, не надо. Сам разобрался. Оказалось еще проще.
Или мне перекатывать? Тогда будет аниме в шапке. Вы этого хотите?
Ну ладно. Ждем.
https://github.com/zhuxb711/RX-Explorer/issues/198
Чел, возьми да полистай историю коммитов, он же написал что фиксанул.
Костыль он конечно присрал, но хотя бы понятно в чём проблема
Чел, там же все написано. Переводчиком что-ли пользоваться не умеешь?
бiмп
уносите этого порватку...и перекатывайте тред.
> Костыль он конечно присрал, но хотя бы понятно в чём проблема
Я полистал, в том то и дело. Ничего похожего на решение так и не обнаружил.
https://github.com/zhuxb711/RX-Explorer/commit/c39c14411313ff4fca445c80d19aeca742672911
Судя по списку изменений именно в этом коммите должно быть исправление, но я не вижу строки, которые фиксят ошибку.
Думаю дело может быть в https://github.com/zhuxb711/RX-Explorer/commit/7053edb39765c27c42e6cc7a908f06620f4edcf8
начал ковырять шарп кун
Неправильно. Линку - это просто сахарок, чтобы ты мог запросы единообразно составлять при работе с разными источниками данных и соответственно колекциями.
Ты можешь вообще его не использовать.
Допустим, ты пишешь библиотку, которая в памяти генерирует картинки. На кой хуй тебе там линку?
Чел. Вот все что есть в линку
https://learn.microsoft.com/ru-ru/dotnet/api/system.linq?view=net-7.0
Ессно, что если ты чет отсюда тащишь - у тебя будут ошибки.
Сам по себе - линку это такая хуйня, для того чтобы единообразно писать запросы. Возникла во времена, когда все любили ЭссКуЭль, и не любили велосипедить под всякие XML, грабберы HTML и прочее придумывать.
Ну так вот. Майки в то время почесли голову: все любят ЭссКуЭль, давай запихнем в язык ЭссКуЭль подобную хуйню.
Собственно и ввели:
var razpolbanniePezdii =
from p in pezdii
wher p.State == "Раздолбана"
select p;
Чтобы с этим вот работать дальше - пришлось наворотить всякие методы расширения.
Никто тебе не мешает без линку сделать:
IEnumerable<Pizda> GetRazplobanniiePezdii(IEnumerable<Pizda> pezdii)
var enumerator = pezdii.GetEnumerator();
while(enumerator.GetNext()){
if(p.State == "Раздолбана" ) yield return p;
}
}
Многие вещи таки именно в линку синтаксисе - выразительнее и проще делаются.
Типа вот если тебе объединить две коллекции разнотипные и потом - выдать результирующий объект. Экстеншинах - это такой уебищный синтаксис, что я ебал. А на линку - красивенько-удобно.
Единственный минус линку, в том, что нельзя сделать так:
IEnumerable<IPosibleOwner> dogs =
from x in dogTypes
from y in person
where y.Like == x.Name
select new {y.id, y.Name, Prefer = x }
Приходится городить класс еще или сейчас рекорд. А было бы удобно, чтобы был анонимный тип, но с интерфейсом. Пусть и с ограничениями.
Просто я пока столкнулся с парой банальных задач с массивами цифр и, что бы их решить надо массив конвертнуть в IEnumerable (а это уже часть Linq, как я понял), потом сделать необходимые махинации (поиск/сортировка/ревёрс и т.д), а потом надо опять конвертнуть в массив и вернуть значение. И в связи с этим вопрос возник, такой флоу - это норма для шарпов.
езжать
я уже поехавший нахуй
> конвертнуть в IEnumerable
никакого конверта нет, все шарповые коллекции по дефолту реализуют интерфейс
> это уже часть Linq, как я понял
не правильно понял
> потом надо опять конвертнуть в массив и вернуть значение
почитай про материализацию результатов ienumerable и когда она может происходить
Ну я на всякий случай спросить. Спасибо!
>.Net Core 3.1
>.Net 6
>Asp.Net Core
Они не взаимозаменяемы?
За список спасибо, возьмусь пока за SQL
>IEnumerable
Это интерфейс. Если начнешь гуглить, то тебе так нассут в уши, шо долго будешь отходить.
Когда ты дальше начнешь учить шарп, то рано или поздно ты столкнешься с такой проблемой, что у тебя будет несколько разных классов, которые по своей сути одинаковые, но для каждого придется писать свой собственный метод и это очень неудобно.
К примеру есть массивы, есть списки, есть коллекции. Мы понимаем, что что-то в них всех есть одинаковое — что-то, что присуще им всем, например количество элементов внутри, или свойство получения итема по индексу. Но когда мы начнем делать условный метод сортировки, то мы не можем знать что в этот метод подадут: массив, или список, или что-то еще. Даже если знаем, то не всегда получается соблюдать один тип, и рано или поздно нам придется писать метод сортировки отдельно для массива и отдельно для списка. А если у тебя таких типов сразу 10 или 100? Для каждого писать отдельный метод? Ебануться можно.
Умные ребята придумали интерфейсы. Если рассмотреть это совсем просто, то это некий свод правил для класса. Интерфейс как бы говорит "я не знаю что за класс ты там собираешься делать, но у него должны быть методы Count, IndexOf, Max, Min и т.д.". Таким образом твой класс как бы унифицируется. Обычно говорят, что класс реализует интерфейс, т.е. реализует список требований интерфейса.
Array реализовал интерфейс IEnumerable
List реализовал интерфейс IEnumerable
Поэтому мы можем их привести к интерфейсу IEnumerable, как бы абстрагируясь от всего лишнего, и получить метод Count (которого у Array нет, а через интерфейс есть). Теперь мы можем создать ровно один метод сортировки, который принимает IEnumerable и пихать в него и массив, и список, и все что угодно, что реализовало интерфейс IEnumerable.
Понятно? Это не конвертация. Мы не создаем что-то новое.
Линкью требует IEnumerable просто из-за универсальности, чтобы ты мог применить это и к массивам, и к спискам, и к коллекциям один и тот же метод. Только и всего.
Ты вот это дерьмо отбрось и для начала попробуй создать обычный метод который тупо циклом проходит по всем итемам и выводит его на экран.
Но есть одно условие: метод должен обрабатывать как для Array, так и для List.
В не лезь в залупу (простите за каламбур), тебе рано линкью. Столкнись с проблемой, а потом возвращайся, будем тушить твою жопу.
Глядя на картинку складывается ощущение, что IEnemerable это другой тип, или это тот же самый Array, но абстрагированный?
Да хули тут обсуждать? Анон не знает что такое наследование, интерфейсы. Что это ему даст? Набор заклинаний.
Ну вот навоял. С перва думал, что у Array и List у обоих свойство Length есть, а нихуя, у List есть Count, но с ним надо ещё 1 вычитать.
public static void Iter(IEnumerable<int> item)
{
var enumerator = item.GetEnumerator();
while (enumerator.MoveNext())
{
Console.WriteLine(enumerator.Current);
}
}
>>695568
>>695565
Ладно, ладно. Просто не привык к такому поведению метода. Мы, жаваскриптизёры, одноклеточные, имейте терпение.
> у List есть Count, но с ним надо ещё 1 вычитать.
У всех надо вычитать т.к. индекс начинается с 0.
>А не, я перебирал i < list.Count() мне выкинуло ошибку, что i вне ренжи списка. Багануло, видимо.
Это не баг.
Count и Length это не максимальный индекс, это подсчет количества итемов в списке. А так как индекс массивов и списков начинается с нуля, то здесь {0, 1, 2, 3, 4} Count и Length будет равно 5, а максимальный индекс равен 4, что на единицу меньше.
Ок, как решать эту задачу без изворотов? Тайпскирпт научил меня одной мудрости если драка не избежна...,
void Iter<T extends (общий тип для Array и List)>(T item){
}
У вас так же можно определять тип аргумента, что бы можно было разные типы использовать или у вас другой способ, или у вас вообще нельзя, что бы один аргумент мог быть разных типов?
>А хули мне запрещено разные типы в функцию передавать? Потому что они внезапно разные. Откуда методу знать, что класс типа HuiPizda такой же как класс типа VrotEbis?
Вот для этого и служат интерфейсы — они сообщают, что у обеих классов есть интересующий метод или свойство.
> Не замел сразу Count у массива.
Потому что твой метод смотрит на массив через призму IEnumerable, который ты указал в параметре
public static void Iter(IEnumerable<int> item)
> Count есть и у массива и у листа
Опять мимо, это МЕТОДЫ не листа/массива а экстеншен к enumerable со всеми неприятными вытекающими (хотя есть некоторые оптимизации внутри)
Да, можно. Это дженерики. Ты написал практически так, как это есть в шарпе. Но это не работает для перечислений типа массива или списка. Для этого нужно юзать интерфейсы. Дженерики нужны немного для другого.
В твоем случае это выглядит так
void Iter<T>(IEnumerable<T> item){
}
Здесь дженерик позволяет сделать универсальным тип итемов массива. Если у тебя будет на входе массив не int, а что-то string к примеру.
Ужас, какой пылесборник. Надо быть осторожным, когда реализуешь IEnumerable - все эти расширения могут просто не сработать.
>collectionoft
Повезло, что в шарпе можно объявить переменную прям в сравнении.
В бейсике нужно отдельной строкой объявлять.
Сама реализация создания нового файла происходит в "создатьБДToolStripMenuItem_Click".
https://hastebin.com/share/ufatadiweb.php
> С одной стороны куча работы
Если исключить всякие битриксы и унылые проекты типа магазинов, останется не так уж и много.
Бери Шарп. После него на пыху переключиться будет вопросом синтаксиса (учится за неделю) и фреймворка типа ларавеля (учится за 2 недели). Остальное все равно смежные области типа SQL, докеров и прочего говна. Все равно не узнаешь куда тебя кривая уведет. Я вообще с джавы начинал вкатываться, а вкатился тайпскриптером сишарпистом лол.
не смешно. А что смешного?
Какая проблема знать шарп и любой другой (или 2+) языка?
а никакой. Тот же фулстек знает шарп и богомерзкий жс (а еще и тайпскрипт сверху) - и ничего, жив (только страдает ибо фронтенд говно)
так что знать шарп и хотя бы питон (пхп же ужас) - изи.
Бамп.
Начни с изучения синтаксиса. Советую этого индуса
https://www.youtube.com/playlist?list=PLAC325451207E3105
Туториал старый но после него новые фичи на лету схватывать будешь. После этого БД смотри. Реляционные, нереляционные и почитай про SOLID. Дальше уже разберешься
Советую Metanit. Лучший учебник всех времён и народов.
Бамп. Ну пиздец же ошибка, я даже хуй знает как её решить. Ничё не помогает. Ну помогите.
Ну или взаимодействие с каким-то апи.
А может ты сам будешь делать практику с шараги? После прочтения того что ты скинул только вымыть руки и остаётся
Почему используется If + return вместо switch/case.
Ну придется создать переменную count для возвращения, ну и что?
namespace Solution
{
using System;
using System.Net;
class Kata
{
public static bool is_valid_IP(string IpAddress)
{
return IPAddress.TryParse(IpAddress, out var parsedIp)
&& IpAddress.Split('.').Length == 4;
}
}
}
Лол, кек, чебурек.
Велосипеды только в плюсах любят.
Ну это база, это знать надо. Но ведь это примитивщина, если в ход пойдет более сложный текст, то оно не спасет от кодинга задачи до пенсии.
Так можно в дженериках делать
void Test<T>() where T: class
{
. . . var result = new T();
}
Но можно ли без дженериков обойтись или If-ов?
Нашел
public object GetInstance(string strNamesapace)
{
. . . Type t = Type.GetType(strNamesapace);
. . . return Activator.CreateInstance(t);
}
суть статической типизации - тип должен быть известен на этапе компиляции, а не вот это всё.
Рефлексия может всё, но на этапе компиляции тебе придется указать тип object и потом в рантайме с этим жить.
Еще там есть dynamic но все же тут вам не пхп
>но на этапе компиляции тебе придется указать тип object
Сразу же после создания экземпляра, я сделаю каст к интерфейсу и дальше буду делать нужные мне делишки, ну или не буду делать, если каст неудачный.
Мне нужна команда (ICommand), поэтому не могу сделать дженерик метод Execute<T>, иначе будут траблы с WPF биндингами. Я буду вынужден сделать целиком дженерик класс, а это пизда, это говно хуй куда впихнешь и хуй откуда выпихнешь. Там столько геморроя, что ну его в пизду.
ни у кого проблем нет, а у него есть. вечно с тобой так
Что-то подсказывает мне, что база с таким именем уже есть. Или у тебя какого-то файлика не хватает.
Читабельнее.
Понимаю что это на уровне Покаяна Беспруфовича Неполживого, но мне впадлу пиздеть, это не /б/
Понимаю что это на уровне Покаяна Беспруфовича Неполживого, но мне впадлу пиздеть, это не /б/
public class MyGenericClass<T> where T : IElement, new()
Я просто спросить
>А потом деанон?
А что беззубый двач может сделать в 2023-м году? Особенно в тематических тредах, где все друг друга знают чуть ли не по имени и фамилии.
Нельзя потому что интерфейс никак не связан с конструктором
Хер его. Я бы создал, но по анимам я не шарю)))
И если можно подскажите какой-нибудь удобный текстовый вариант
Да просто на сайте майков все как-то непоследовательно
Начал читать "C# Для чайников", но столкнулся с тем, что около половины не понимаю/понимаю плохо, но да похуй, не в этом суть.
Вопрос вот в чем, шарпы используются в вебе, играх и приложениях. Душа у меня к вебу вообще не лежит, ближе к играм или приложениям(желательно играм), насколько сложно найти работу и сколько примерно займет изучение БАЗЫ для этогоу среднестатистического вкатуна?
Это копия, сохраненная 29 июня 2023 года.
Скачать тред: только с превью, с превью и прикрепленными файлами.
Второй вариант может долго скачиваться. Файлы будут только в живых или недавно утонувших тредах. Подробнее
Если вам полезен архив М.Двача, пожертвуйте на оплату сервера.