Drive your career as React Developer with Symphony Solutions!
×Закрыть

C# для неслабаков

Cделаю тему для обсуждение новых рюшечек и финтиклюшек с#

Нашел отличный видос с оригинальным подходом в донесении информации в усталый мозг программиста
www.youtube.com/watch?v=6hgCbOUp-Rs

LinkedIn
Допустимые теги: blockquote, a, pre, code, ul, ol, li, b, i, del.
Ctrl + Enter
Допустимые теги: blockquote, a, pre, code, ul, ol, li, b, i, del.
Ctrl + Enter

создал канал в тележке, буду и туда постить новости про DotNet, Rust и новую технику
t.me/techspider13

Может тут че интересное найдешь ithare.com

ThinkPad T540P. Больше 5 лет работает.

Не, у меня больше 5 лет.
Intel® Core™ i7-4700MQ CPU @ 2.40GHz × 8
Пока норм справляется, начинку для роутера компилит за 40 минут, раньше за 20 компилил.

Зачем, если этот работает?

он потребляет в 3 раза больше электроэнергии
не дай Ахметке на себе подзаработать

тогда лучше переехать в Канаду)

Давайте делиться наиболее прикольными темами для нановижлостудии
imgur.com/XU9z5TH.png

ищу проект удаленно, 20-30 часов в неделю, хорошие знания в asp.net core, c#, ef core

Кто-нибудь пользовался этой штукой? какая польза от нее?

www.stevejgordon.co.uk/...​re-dotnet-worker-services

Languages & Runtime: .NET Community Standup — April 9th 2020 — All Things C# with Mads Torgersen

www.youtube.com/watch?v=fIXujTOA6BE

Кто знает хорошие репозиторий паттерны для сложных запросов, с большим количеством фильтров
--------
нашел довльно простой паттерн, но не подойдет для моего случая
ASP.NET Core Web API — Repository Pattern
code-maze.com/...​re-web-development-part4

Не потрібні репозиторії з складними фільтрами (якщо не пишеш сайт-конструктор запитів). Не варто виносити на рівень вище те, що вміє робити EF і SQL, і писати всемогутній dal, який задовільняє всі абстрактні потреби, а не під конкретні запити.

Tye is a tool that makes developing, testing, and deploying microservices and distributed applications easier. Project Tye includes a local orchestrator to make developing microservices easier and the ability to deploy microservices to Kubernetes with minimal configuration.

github.com/dotnet/tye

условие вывести на экран слово hello и имя, которое вводит пользователь. ЧТО НЕ ТАК?

#include <stdio.h> <conio.h>


int main() {
   // printf() displays the string inside quotation
   printf("Hello,");
   return 0;
}
void main() {
clrscr()
   
   printf("/n*****");
  printf("/n***yra*");


   getch();
}
ЧТО НЕ ТАК?

не делает то что нужно по условию :)

потестировал код средней сложнсти с# vs rust
c# gist.github.com/...​87109d4661d3349d9588cf34a
rust gist.github.com/...​5cdacc29220e2ef214b03bed4
в релизе с# 6s — rust 3.4s, разница в 1.7 раза

А если сравнить 8ой Шарп с Нынешними Крестами и Растом?

Як можна зрівнювати гостре, релігійний символ і іржу?

Уточняю: Какая разница в производительности между такими ЯП: С#, C++, Rust ?

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

А где код средней сложности? :)

поменяй мышку, она глючит и не попадает в линку

Не знаю что для тебя «код средней сложности», но фрагмент который ты якобы тестируешь крайне искусственный для C# и имеет мало общего с усреднённой реальностью поскольку не предусматривает сценариев связанных со сборкой мусора. В реальности ты такого практически не встретишь. Кстати бенчмарки для кода который работает в виртуальной машине так не пишутся и включать консольный вывод в код который бенчмаркается — моветон, но это все уже отдельная история.

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

Немного в другом порядке чтобы понятнее было:

а зачем мерять работу мусорщика?

Надо мерять не работу сборщика мусора а сценарии которые могут ее вызвать,
потому что это один из главных факторов который влияет на производительность приложений работающих в рантаймах со сборкой мусора. Положение усугубляется тем что многие разработчики даже не отдают себе отчет когда это может происходить и как может влиять на latency. Взять вот к примеру тебя, судя по твоим комментариям ты не до конца понимаешь что твой вывод в консоль производит несколько аллокаций памяти в куче на каждой итреации (боксинг для значений простых типов которые ты выводишь плюс аллокации связанные с string.Format). Что уж говорить про чуть более сложные случаи где аллокации возникают посвеместно и каждая потенциально может быть тригером сборки мусора. Поэтому сценарии где этого нету это скорее редчайшая экзотика.

консоль мало влияет на разницу в скорости

Вообще голословно наивное утверждение, и не только потому что не указана мера этой разницы (о какой допустимой latency идет речь) и привязка к технологии (вывод в консоль в CRL скорее всего совсем не то что вывод в консоль в Rust), но главным образом потому что вывод в консоль в подавляющем большинсве случаев не является частью алгоритма и соотвественно исключается из него как ненужный черный ящик который может исказить результаты тестов. Твой пример в этом случае показателен — ты не только включил в тестируемый алгоритм вывод в консоль (который в .NET это как миниму вызов OS API), но добавил совершенно ненужные аллокации связанные с интерполяцией строки которые дополнительно к расходам на выделение памяти могут стать тригером сборки мусора (см. выше) в любой неожиданный для тебя момент времени в реальном приложении. Поэтому практика исключения консольного вывода из бенчмаркинга еще и важна как элемент защиты от дурака.

тут чисто был интерес как раст и решетка генерируют код для цикла, переходов и пару мат функций

Для чистого теста сгенерированного кода тебе не следовало включать в него вызовы библиотечных функций потому что они это черный ящик для бенчмаркинга. Но даже в этом случае следует понимать разницу в последствиях для производительности между AOT (Rust) и JIT (CLR) компиляцией и учитывать это в тестах, например делать дополнительный warmup. А вообще лучше использовать готовые проверенные временем инструменты которые умеют делать эти вещи из коробки, такие как BenchmarkDotNet, а не создавать доморещенные неправильные бенчмарки.

Та нормально він написав все. Console.WriteLine сто разів викликається всього і ні на що не впливає. І там, і там масиви, ніяких специфічних класів, колекцій, навіть foreach’а нема. Немає ніби і боксінгу/анбоксінгу ніде. Не треба високомірничати про доморощені. На компіляцію IL кода в машиний теж час не витрачається, можна перший раз викликати ті методи до запуску таймеру, нічого не зміниться.

Та нормально він написав все.

Це серйозний аргумент!

Console.WriteLine сто разів викликається всього і ні на що не впливає.

А як не сто а більше буде викликатися? До речі якщо ти не помітив я писав про загальноприйняту практику бенчмаркінгу і чому вивід в консоль в бенчмарку це погано.

Немає ніби і боксінгу/анбоксінгу ніде.

«Немає ніби» це тільки в у віртуальному світі твого невігластва, а взагалі є.

На компіляцію IL кода в машиний теж час не витрачається

Це тому що ти так вирішив чи є більш вагомі аргументи?

Не треба високомірничати про доморощені.

А краще послухати мудрих порад і може навчитися чогось.
Я звик речі називати своїми іменами, а те що я побачив ніяк на нормальний бенчмарк не тягне і детально пояснив чому. А взагалі дилетанство я бачу дуже сильно поширюється в інженирії останнім часом і в мене виникає багато питань коли людина яка іменує себе developer і мала би мати інженерне мислення неуважно читає і оперує якимись категоріями рівня чувака з авто базару («та нормально», «ні на що не впливає», «немає ніби»).

Я обов’язково послухаю мудрих порад, коли їх хтось напише. А так, ми ж практики, а не загальновизнані теоретики. І на асемблері писали, і в тому, що цикл і в rust, і в скомпіленому JIT методі шарпу, це CMP/JNZ не сумніваємось, а от що замість одного MOV для взяття елементу масиву в захищеному IL коді — це вже питання. І скоріш за все станемо шукати відповідь про різницю в швидкості в інлайн функціях rust, а розглагольствуваня про вплив garbage collector’а і методики бенчмарків залишимо методистам ;)

Не знаю що ти хотів цим сказати і ти можеш залишати що хочеш і кому хочеш — це твоє особисте право як і право не використовути best practices, зрештою це ж і твої проблеми.

і в тому, що цикл і в rust, і в скомпіленому JIT методі шарпу, це CMP/JNZ не сумніваємось

Якщо хочеш потеоретизувати на цю тему то можу тобі сказати що CMP і JNZ різні бувають і розмір різний мають і відповідно можуть мати різну кількість тактів і різні компілятори це можуть по різному оптимізовувати, а деякі взагалі можуть робити loop unrolling оптимізацію і у випадку повного анролінгу ніяких CMP/JNZ не буде, сюрприз, сюрприз.

а от що замість одного MOV для взяття елементу масиву в захищеному IL коді — це вже питання

А що ж тобі заважає подивитися?

а розглагольствуваня про вплив garbage collector’а і методики бенчмарків залишимо методистам

Це не розглагольствуваання, а повсякденна реальність якщо ти працюєш з критичними для latency вимогами (для мене це принаймні так). Для крудошльопства це не конче, але часто це закінчується тим, що кличуть в кінці кінців інженерів щоб якось виправити ситуацію бо попередні виконавці були не в змозі оцінити ціну тих абстракцій і практик які вони використовували і міряли все «на око» або «лишали методистам».

«Немає ніби» це тільки в у віртуальному світі твого невігластва, а взагалі є.

Закинул его код в sharplab, посмотрел IL в релизе, нет команд box/unbox.
В его коде нет.

System.Console.WriteLine($"[ {i}] снято с  жирных счетов #{surplus}");,
System.Console.WriteLine($"elapsed {sw.Elapsed}");

Точняк, Ctrl+F с первого разу не показал)

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

Якщо викинути флоатну математику powf з одного і Math.Pow з іншого, і в шарпі замінити масив на unsafe float* час виконання стає однаковим. При чому перше важливіше. А цикли вони і в Африці цикли, тільки чорні і з еболою ;)

А цикли вони і в Африці цикли, тільки чорні і з еболою ;)

Ти бачу ще й великий жартівник, тільки я б на твому місці добре думав перед тим як бовкати подібні тупі жарти. Щодо циклів, вони різні бувають в залежності від оптимізації, адресації і data locality.

Ну да... ну да... так що ж все-таке впливає на швидкість програми, що була наведена для порівняння з версією на rust ?JIT компіляція з гарбадж колектором, чи short jmp ? А, я ж вже підказав, так не чесно буде. При чому не читав при цьому нікому лекцій.

А що, ти думаєш, що хтось має робити якісь висновки з твого посту з двох речень половина яких це бридотний жарт і без наведення бенчмарку? Тоді ти ше тупіший ніж здаєшся з першого погляду.

Походу уже спрятал))

у гистов почемуто урл поменялся
новый 6256d995cdacc29220e2ef214b03bed4

Когда становишься таким большим и умным, то практичность (использовать гит вместо копи паста «тряпок» из своего сундучка ) уходит на второй план
youtu.be/GlyL1jY8P3A?t=1700

Телеги по Шарпу:
t.me/DotNetRuChat
t.me/dotnettalks
t.me/codeblog_csharp
Кому надо заходите туда и спрашивайте что вам нужно.
Народу много, ждать ответа долго не нужно, что довольно таки удобно.

Building a Blazing Fast Object-to-Object Mapper in C# with .NET Core 3.1
www.twilio.com/...​t-mapper-c-sharp-net-core

ASP.NET Core MVC 3.x — AddMvc(), AddMvcCore(), AddControllers() and other bootstrapping approaches

www.strathweb.com/...​bootstrapping-approaches

Немножко порадовало за си решеточку

Ultra low latency Java in the real world
youtu.be/BD9cRbxWQx8?t=1315

интересный комент

OrderBy при попытке перечисления вычитывал исходную последовательность во внутренний массив и сортировал его.
В новой версии, если весь результат не нужен, то применяется частичная сортировка, у которой сложность N + K log K, где N — размер исходной последовательности, а K — запрашиваемый кусок отсортированной.
ПС. .OrderBy(...).Max() все таки сортируем целиком. Оптимизация касается методов Take, First, Last

Сделал небольшую прогу, которая логирует генерируемый скл в консоль,
github.com/...​netcore-mysql-logging-app
селекты какие то странные, кто может подскзаать, сильно они проседают в производительности, если писать вручную?

info: Microsoft.EntityFrameworkCore.Infrastructure[10403]
      Entity Framework Core 2.1.2-rtm-30932 initialized 'BtctalkContext' using provider 'MySql.Data.EntityFrameworkCore' with options: None
warn: Microsoft.EntityFrameworkCore.Query[10103]
      Query: '(from Forum f in DbSet<Forum> select [f]).FirstOrDefault()' uses First/FirstOrDefault/Last/LastOrDefault operation without OrderBy and filter which may lead to unpredictable results.
info: Microsoft.EntityFrameworkCore.Database.Command[20101]
      Executed DbCommand (10ms) [Parameters=[], CommandType='Text', CommandTimeout='30']
      SELECT `f`.`fid`, `f`.`level`, `f`.`name`, `f`.`parent_fid`, `f`.`title`
      FROM `forums` AS `f`
      ORDER BY `f`.`fid`
      LIMIT 1

info: Microsoft.EntityFrameworkCore.Database.Command[20101]
      Executed DbCommand (3ms) [Parameters=[], CommandType='Text', CommandTimeout='30']
      SELECT `f.Topics`.`tid`, `f.Topics`.`fid`, `f.Topics`.`created`, `f.Topics`.`reliable`, `f.Topics`.`responses`, `f.Topics`.`title`, `f.Topics`.`updated`, `f.Topics`.`viewers`
      FROM `threads` AS `f.Topics`
      INNER JOIN (
          SELECT `f0`.`fid`
          FROM `forums` AS `f0`
          ORDER BY `f0`.`fid`
          LIMIT 1
      ) AS `t` ON `f.Topics`.`fid` = `t`.`fid`
      ORDER BY `t`.`fid`

Когда этот ваш C# уже начнёт перенимать фичи от более новых языков?

Даже в PHP8(который был не так давно динамически типизированым, на минуточку) уже собираются сделать union types т.е. можно засовывать прямые объединения типов которые никак не связаны. Даже в консервативную джаву впихивают гринтреды в виде файберов, на которых наконец можно сделать хорошую многопоточность. Про синтаксические фишки уже молчу — инференция параметров дженериков есть уже почти везде(нет, с написаными параметрами дженериков код не становится понятнее, только больше размером). И кучу иного.

union types

В чисто статическом языке, коим является C#, это не нужно, и ведёт только к запутыванию кода.

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

Хорошая многопоточность уже реализована в TPL (полная независимость от аппаратных потоков, в большинстве случаев потоки даже не используются), кроме того есть мнение, что fibers на этом фоне уже не дают преимуществ.
docs.microsoft.com/...​ibers?redirectedfrom=MSDN
«In general, fibers do not provide advantages over a well-designed multithreaded application. However, using fibers can make it easier to port applications that were designed to schedule their own threads.»

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

Не уверен, что правильно тебя понял, но вообще-то в C# это давно есть.
docs.microsoft.com/...​/generics/generic-methods

Если из типов аргументов метода компилятор может определить дженерик-параметры метода, то их можно не писать.

В чисто статическом языке, коим является C#, это не нужно, и ведёт только к запутыванию кода.

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

over a well-designed multithreaded application.

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

Джаваскриптом щось запахло, а ну-ка, що там у нас в цій змінній. В TypeScript це самою парадигмою народжено «ми вам зробимо JavaScript з типізацією, але можна й без неї, якщо хочете», ну от, тим, хто хоче без неї може й потрібен ProcessError(any_object)

Джаваскриптом щось запахло, а ну-ка, що там у нас в цій змінній.

Джаваскрипт и не sealed классы имеют много общего. Ничего полезного с Exception вообще без узнавания того что это за эксепшн сделать нельзя если мы точно знаем что у нас тут есть определённые виды эксепшнов соединённые тем самым определением, с этим мы уже можем что то делать полезное. Этот момент с одним размытым общим типом одинаковый что в джаваскрипте, что в С#. Юнион это ещё один более продвинутый способ изложить предположения о том что собирается вернуть функция.

Ще як можна, безліч коду так і виглядає catch(Exception e), з логуванням меседжу, стектрейсу, етс., що прийнятно там, де може бути від StackOverflowException до різних IO і т.п., обробка яких абсолютно нічим не відрізняється в контексті.

Ще як можна

всё что ты делаешь, это пользуешься Exception классом. Если кастишь к какому то типу в рантайме — это привет js if error.code === «foo».

Нічого я не кастую, створив SensorStolenException, використав Exception, нічого іншого мені не потрібно. Завдяки простому і зрозумілому наслідуваню. А не інтерсекції «чогось» з «чимочь», чи перевірок «а що це тут таке ?»

Тогда отдельный тип

SensorStolenException

не нужен.

Ну прям таки, в C# самі назви типів нащадків Exception несуть 90% інформації про те, що сталось, завжди логуються, виводяться ASP.NET в браузер в дебаг моді, і т.п. А додаткові проперті, які код, що перехоплює може використовувати, а може ні. А своя функціональність по мапінгу зовнішніх там ероркодів в Message. До того ж я не знаю, чи захоче код, що перехоплює, виділяти цей тип Exception, для специфічної логіки обробки, і тоді він буде його приводити до конкретного типу, а може не буде.

Тогда получается, что у вас C# script.

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

Те, кому надо юнион типы, подключают в .net солюшин F# проект и спокойно вызывают из C#/F# с полной интероперабельностью туда и обратно в рамках одного солюшина и получают куда более няшный код чем на scala(например) для логики с нужными либами для инфраструктуры в С#;

Либ которые позволяют это адекватно делать на С# кот наплакал.

можно примеры 3-5 штук практических задач тезисно, что ты решаешь этим мгонопоточными-апи и в какой сфере?

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

Знаешь почему на скале никто не пишет?

В нашей стране может и нет, но в других пишут.

потому что никто не понимает, что написали другие

мне очень смешно, серъезно. Это как говорить что китайский никто не понимает потому что я не хочу его учить.

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

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

хороший баланс этих фич делает его популярным

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

как писать на IL под net core 2(сам не пробовал)
github.com/Konard/ILProj.git

можно просмотреть il код с помощью ilspycmd
поставить dotnet tool install ilspycmd -g
потом ilspycmd -il dll_path

кто нибудь настраивал sublime + omnisharp? чтото не могу настроить, чтобы работал автокомплит

Вопрос зачем?

+1 вы.. от вы...ов
а слабо такое in natural English + subtitles настримить?

C# для неслабаков

Хз, по лінку C# для нубів. Але непогане.

Сиплють як скажені, а ти відволікайся від своїх вінформ це все вчити для співбесід, питання чим інтерфейс відрізняється від абстрактного класу отримує другий подих.

абстрактный класс — это манекен
интерфейс — оджеда и аксессуары

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

Ой, ну аж неловко стало ;)))

Имхо интерфейсы-маркеры служат только как дополнение. Не скажу, хорошо это или плохо: устраивать проверки на «реализацию» пустых интерфейсов (по крайней мере это быстро), но тут дополнение в чистом виде. Поскольку отсутствует описание как всего класса, так и минимальной части. Если, конечно, такое дополнение имелось в виду

ну не согласен, в java к примеру интерфейс Cloneable.
A class implements the Cloneable interface to indicate to the Object.clone() method..
Интерфейс без методов описывает класс, как такой что его обьект можно клонировать, ведь без этой информации метод чисто выкинет исключение

Обычный интерфейс гарантирует, что класс реализует то, что задекларированно интерфейсом. Интерфейс-маркер не гарантирует ничего, поскольку он пуст. Все — на совести разработчика, включившего его в список «реализуемых». В С# просто проверка на «реализацию» раз в 10 быстрее, чем ковыряние в метаданных.

Ни разу их не юзал, хоть и видел. В шарпе для этих целей есть аттрибуты, а в TS вроде декораторы.

Один раз пришлось давным-давно. Что-то связанное с DTO было. А декораторы в TS — это функции, которые оборачивают то, что декорируют (конструктор класса, или свойство класса, или вызов метода класса) Декораторы выполняют какие-то дополнительные действия или заменяют основное. Так что в какой-то мере это жуткий антипатерн, но ооочень удобный ;)

Абстрактний клас дозволяє реалізувати методи-хелпери і пошарити між родиною. Інтерфейс дозволяє створити стандартизацію класів, і працювати зі стандартами, а не вільними реалізаціями. Інтерфейс — паспорт класу, без якого в цивілізованій системі клас не приймуть.

Можна міксити абстрактний клас з інтерфейсами. Тут я вже не в курсі вірування чи нормально створювати депенденсі по абстрактному класу, чи і йому необхідний свій інтерфейс.

чи нормально створювати депенденсі по абстрактному класу

Не нормально, если придется тестить класс который зависит от него — то как замокать не абстрактные методы?

Я маю на увазі депенденсі саме по абстрактному класу, а не дочірнім. А там нема значення які неабстрактні ще є. Звісно що коли треба дочку то вже дочці робити інтерфейс ЯДочкаАбстракту..

Так я тоже про зависимость от абстрактного говорю =) Абстрактный класс может иметь «non-abstract» методы, которые могут вызываться в зависимом.

а сэмпл можете показать? что для чего и как работает

Це так (хоча якісь мапери вручну написані, я б і без паспорту прийняв), я просто мав на увазі нафіга раптом інтерфейсам в C# 8 реалізація знадобилася.

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

Ты специально дал ссылку на одну из самых вредоносных идей (наследование)?

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

Нашел отличный видос с оригинальным подходом в донесении
информации

Оригинальный, в смысле на русском языке?

ежедневные новости про шарп blog.cwa.me.uk

о спс
а что за дядя этот автор? ну в см. компетенции его по факту

Подписаться на комментарии