Инновации и инсайты в мире Java из первых уст. Новая конференция Java Fest — 21 марта >>
×Закрыть

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

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

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

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

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