немного наброшу в защиту тайпскрипта :D. Да, совершенно верно, типы там существуют только в момент компиляции, в рантайме можно огрести. Но в каких случаях? 1) отказ следования регламентам, 2) грязный внешний мир. Последнее создаст проблемы и в c# (хотя вы и упадёте раньше, но проверять туже нуляюельнлсть всё равно обязаны сами). А с регламентами всё очень неплохо: если им следовать (например не писать any вместо known, чекать типы перед кастом, и т.д.), то помимо уверенности приходит и очень интересный бонус: в тайп скрипте на самом деле очень навороченная система типов, фактически у вас в руках целая математика типов, с которыми можно общаться как со множествами, например выбирая их перксечения, суммы, разницы или даже деления. Эти множества можно трансформимровать, например, вы можете гарантировать что у вас функция, принимающая объект одного типа, должна вернуть объект другого типа, но с изменёнными именами или типами полей. Так, например в RxJs есть набор функций, которые могут принять объект с полями-обсервейбалами любых типов, а в сабскрайбе будет возвращаться объект с теми же полями, но уже результатами подписки (т.е. {a$: Observable, b$: Observable} => {a: number, b: string}). Или же можно задать аргумент, который строго требует передачи проперти заданного типа для некоторого объекта и т.д. В c# же для создания подобных конструкций зачастую приходится прибегать к контрактам и чекать их в рантайме, что невелирует приемущества строгой типизации. Повторюсь, что нарушить в тайпскрипте подобные ограничения типов можно, но они обычно требуют явного написания в коде специальных конструкций, которые вполне можно заблокировать на уровне линтера
Да, только для event в WinForm. Это единственное исключение. Вообще, MS довольно неплохо вкладывается в развитие WinForms. Могла бы давно уже поддержать Task в событиях контролов.
@@tt0nix а почему именно в WinForm ? у меня допустим много где есть подобные интерфейсы public interface IRFID : IDevice { event Action DetectCard; event Action RemovedCard; } и кроме как делать асинхронную (чтоб потом вызвать асинхронно последующие таски) войдовскую подпись у меня нет больше возможностей. и такое работает в простых сервисных приложений под линукс. может я что-то пропустил в мире .Net и есть другие способы создавать события ?
Благодарю за детальный разбор! У меня возник такой вопрос: На моем SafePal кошельке хранится USDT и у меня есть seed фраза. (alarm fetch churn bridge exercise tape speak race clerk couch crater letter). Как мне перевести их на Binance?
@@tt0nix они же поменяли неймспейсы, плюс наверняка что-то убрали, что-то сломали, все это брейкинг ченджес. Многие расширяют тесты, например, чтобы интеграционные запускать с нюансами, все это может пострадать. А что по сути на выходе? Тесты продолжают работать...
Да, всем не угодишь. Если эпизод для вас слишком длинный, поставьте его на паузу и продолжите слушать на следующей неделе. Наши темы никак друг с другом не связаны и выходим мы через неделю. Поэтому эффект получится тот же самый как часовой выпуск каждую неделю. А вот если мы будем делать короткие выпуски, то у тех людей кто любит поподробнее и подлиннее никакого решения не будет. Чтобы угодить большинству, приходится писать длинные.
Отлично! 🎉
немного наброшу в защиту тайпскрипта :D.
Да, совершенно верно, типы там существуют только в момент компиляции, в рантайме можно огрести. Но в каких случаях? 1) отказ следования регламентам, 2) грязный внешний мир.
Последнее создаст проблемы и в c# (хотя вы и упадёте раньше, но проверять туже нуляюельнлсть всё равно обязаны сами).
А с регламентами всё очень неплохо: если им следовать (например не писать any вместо known, чекать типы перед кастом, и т.д.), то помимо уверенности приходит и очень интересный бонус: в тайп скрипте на самом деле очень навороченная система типов, фактически у вас в руках целая математика типов, с которыми можно общаться как со множествами, например выбирая их перксечения, суммы, разницы или даже деления.
Эти множества можно трансформимровать, например, вы можете гарантировать что у вас функция, принимающая объект одного типа, должна вернуть объект другого типа, но с изменёнными именами или типами полей.
Так, например в RxJs есть набор функций, которые могут принять объект с полями-обсервейбалами любых типов, а в сабскрайбе будет возвращаться объект с теми же полями, но уже результатами подписки (т.е. {a$: Observable, b$: Observable} => {a: number, b: string}). Или же можно задать аргумент, который строго требует передачи проперти заданного типа для некоторого объекта и т.д.
В c# же для создания подобных конструкций зачастую приходится прибегать к контрактам и чекать их в рантайме, что невелирует приемущества строгой типизации.
Повторюсь, что нарушить в тайпскрипте подобные ограничения типов можно, но они обычно требуют явного написания в коде специальных конструкций, которые вполне можно заблокировать на уровне линтера
Очень позитивный выпуск, всех с наступающим!!!
С новым годом!
23:24 но ведь для event Action Field, async void простительно делать
Да, только для event в WinForm. Это единственное исключение.
Вообще, MS довольно неплохо вкладывается в развитие WinForms. Могла бы давно уже поддержать Task в событиях контролов.
@@tt0nix а почему именно в WinForm ?
у меня допустим много где есть подобные интерфейсы
public interface IRFID : IDevice
{
event Action DetectCard;
event Action RemovedCard;
}
и кроме как делать асинхронную (чтоб потом вызвать асинхронно последующие таски) войдовскую подпись у меня нет больше возможностей.
и такое работает в простых сервисных приложений под линукс.
может я что-то пропустил в мире .Net и есть другие способы создавать события ?
@@maxm1079 ну а почему бы не заюзать
event Func DetectCard;
event Func RemovedCard;
или я не совсем верно понял ваш кейс
Благодарю за детальный разбор! У меня возник такой вопрос: На моем SafePal кошельке хранится USDT и у меня есть seed фраза. (alarm fetch churn bridge exercise tape speak race clerk couch crater letter). Как мне перевести их на Binance?
С xUnit мы имеем дело снова с апгрейдом, который заставляет переколбашивать код в непропорциональных размерах относительно ценности самого апгрейда.
В каком конкретно месте новая версия конфликтует с вашим существующим кодом?
@@tt0nix они же поменяли неймспейсы, плюс наверняка что-то убрали, что-то сломали, все это брейкинг ченджес. Многие расширяют тесты, например, чтобы интеграционные запускать с нюансами, все это может пострадать. А что по сути на выходе? Тесты продолжают работать...
НЕ может быть причин съехать на джс )
Менеджеры такие затейники, ещё и не на то пересаживают :)
Ребят, всё клёво, но просто долгие подкасты, хочется покороче
согласен, 2 часа на такие темы слишком много
Мне нравятся долгие выпуски. Если что-то не интересно, пропускаю к следующему тайм-коду.
Вот уж правда, всем не угодишь, мне тоже нравятся длинные, а не короткие) короткие можно в Яндекс -пересказе прочитать))
Да, всем не угодишь.
Если эпизод для вас слишком длинный, поставьте его на паузу и продолжите слушать на следующей неделе. Наши темы никак друг с другом не связаны и выходим мы через неделю. Поэтому эффект получится тот же самый как часовой выпуск каждую неделю.
А вот если мы будем делать короткие выпуски, то у тех людей кто любит поподробнее и подлиннее никакого решения не будет. Чтобы угодить большинству, приходится писать длинные.
@@tt0nix Жгите!
Всегда будут те, кому что-то пришлось не по нраву
.NET рынок не входит даже в топ пять по количеству вакансий. Он просядет ещё больше из-за вытеснения его Go в микросервисах
Пичаль (
Ссылку можно на статистику?
Ну и го, это язык для тех кто с трудом пхп осилил. Мы развивались и при пхп, выростим и при других.
@@tt0nix статистика вакансий на hh. Статистика рейтинга языков на тиобе и стековерфлоу
@@tt0nix hh. Go эффективно решает то, для чего и был создан