.NET Разработчик
6.51K subscribers
427 photos
2 videos
14 files
2.04K links
Дневник сертифицированного .NET разработчика.

Для связи: @SBenzenko

Поддержать канал:
- https://boosty.to/netdeveloperdiary
- https://patreon.com/user?u=52551826
- https://pay.cloudtips.ru/p/70df3b3b
Download Telegram
День пятьсот пятьдесят второй. #ЧтоНовенького
Новые Функции в Visual Studio для Повышения Продуктивности. Начало
Команда Roslyn представляет новые функции для повышения продуктивности в Visual Studio 2019.

1. Автодополнения IntelliSense для форматов DateTime и TimeSpan.
Эта обещает быть чрезвычайно полезным, потому что мы все знаем, как сложно запоминать форматы даты и времени. Поместите курсор в строковый литерал DateTime или TimeSpan и нажмите (Ctrl+Пробел). Вы увидите варианты завершения и объяснение, что означает каждый символ. См. рис.1 ниже.

2. Добавление заголовка файла позволяет легко добавлять заголовки к существующим файлам, проектам и решениям с помощью EditorConfig. Добавьте правило file_header_template в файл .editorconfig и установите нужный текст заголовка. Затем поместите курсор в первую строку любого файла C#. Нажмите Ctrl+., чтобы вызвать меню «Быстрые действия и рефакторинг», и выберите «Добавить заголовок файла» («Add file header»). См. рис.2 ниже.

3. Диалоговое окно изменения сигнатуры метода теперь позволит добавлять параметры. Поместите курсор на сигнатуру метода и Ctrl+., чтобы вызвать меню «Быстрые действия и рефакторинг», и выберите «Изменить сигнатуру» («Change signature»). Откроется окно, где вы можете нажать «Добавить» («Add») для добавления параметра. При этом откроется новое диалоговое окно «Добавить Параметр» («Add Parameter»). См. рис.3 ниже. Оно позволяет задать тип и имя параметра, а также сделать параметр обязательным или необязательным со значением по умолчанию. Кроме того, вы можете задать значение в вызывающем коде (по желанию использовав именованный аргумент для этого значения), либо ввести переменную TODO. Переменная TODO поместит «TODO» в вызывающий код, чтобы вы могли обойти все вызовы метода и передать нужное значение в каждом случае. Для необязательных параметров есть возможность пропустить изменения в вызывающем коде.

Источник: https://devblogs.microsoft.com/dotnet/learn-about-the-latest-net-productivity-features/
День пятьсот пятьдесят третий. #юмор
Примерно так же надо задавать вопрос на Stackoverflow)))
День пятьсот пятьдесят четвёртый. #ЧтоНовенького
Новые Функции в Visual Studio для Повышения Продуктивности. Окончание
Начало

Исправления и рефакторинг кода - это предложения по изменению кода, которые компилятор предоставляет с помощью значков лампочки и отвертки. Чтобы вызвать меню быстрых действий и рефакторинга, нажмите Ctrl+. или Alt+Enter. Команда Roslyn представляет новые возможности исправления и рефакторинга кода в Visual Studio 2019:

- Добавление явного приведения (Add explicit cast). Позволяет добавить оператор явного приведения, если неявное приведение выражения невозможно. См. рис. 1 ниже.

- Упрощение условного выражения (Simplify conditional expression). Делает условные выражения более чёткими и краткими. См. рис. 2 ниже.

- Преобразование в дословную/обычную строку (Convert To Verbatim/Regular String). Позволяет в одно нажатие преобразовать строку из обычной в дословную и наоборот. См. рис. 3 ниже.

- Добавление атрибута «DebuggerDisplay» (Add ‘DebuggerDisplay’ attribute). Предложение появляется, если поместить курсор на имя класса. Позволяет программно закреплять свойства в отладчике кода. Добавляет атрибут отображения в отладчике в начало класса и генерирует автоматический метод, который возвращает ToString(). Метод можно отредактировать, чтобы вернуть значение свойства, которое вы хотите закрепить в отладчике. См. рис. 4 ниже.

- Генерация операторов сравнения (Generate comparison operators). Генерирует шаблонный код с операторами сравнения для типов, реализующих IComparable. См. рис. 5 ниже.

- Генерация операторов IEquatable (Generate Equals(object)). Добавляет реализацию IEquatable, а также операторы равенства и не равенства для структур. См. рис. 6 ниже.

- Генерация конструктора со свойствами (Generate constructor in <QualifiedName> (with properties)). Предложение появляется, если поместить курсор на экземпляр типа. Позволяет добавить в соответствующий тип конструктор нужной сигнатуры и необходимые свойства. См. рис. 7 ниже.

- Исправление случайных присвоений и сравнений (Assign/Compare to '<QualifiedName>.value'). Позволяет исправить операцию присвоения или сравнения, когда имена поля класса и параметра конструктора совпадают. Исправление добавляет “this.” в нужную часть операции. См. рис. 8 ниже.

Источник: https://devblogs.microsoft.com/dotnet/learn-about-the-latest-net-productivity-features/
День пятьсот пятьдесят пятый. #DotNetAZ
Dotnet A-Z. 5
В этой серии постов рассмотрим наиболее распространённые понятия в .NET в алфавитном порядке.

Mono
Mono - это кроссплатформенная реализация .NET с открытым исходным кодом, которая в основном используется, когда требуется небольшая среда выполнения. Это среда выполнения, которая поддерживает приложения Xamarin на Android, Mac, iOS, tvOS и watchOS и ориентирована в первую очередь на приложения, чувствительные к размеру исполняемого файла.
Mono поддерживает все опубликованные в настоящее время версии .NET Standard. Исторически Mono реализовывал более крупный API .NET Framework и эмулировал некоторые из самых популярных возможностей Unix. Иногда он используется для запуска приложений .NET, которые полагаются на эти возможности в Unix. Mono обычно используется совместно с JIT-компилятором, но он также имеет полноценный AOT-компилятор, который используется например в iOS.
Документация Mono

.NET
Общий термин для .NET Standard и всех реализаций .NET. Термин всегда пишется всеми заглавными буквами.
Документация .NET

.NET Core
Кросс-платформенная, высокопроизводительная реализация .NET с открытым исходным кодом. Включает в себя Core Common Language Runtime (CoreCLR), Core AOT Runtime (CoreRT, находится в разработке), библиотеку базовых классов Core BCL и набор средств разработки Core SDK.
Документация .NET Core

.NET Core CLI (Интерфейс Командной Строки)
Кросс-платформенный набор инструментов для разработки приложений .NET Core.
Обзор .NET Core CLI

.NET Core SDK (Набор Средств Разработки)
Набор библиотек и инструментов, позволяющих разработчикам создавать приложения и библиотеки .NET Core. Включает .NET Core CLI для создания приложений, библиотеки .NET Core и среду выполнения для создания и запуска приложений, а также исполняемый файл dotnet (dotnet.exe), который выполняет команды CLI и запускает приложения.
Обзор .NET Core SDK

.NET Framework
Реализация .NET, работающая только в Windows. Включает общеязыковую среду выполнения (CLR), библиотеку базовых классов и библиотеки фреймворков приложений, такие как ASP.NET, Windows Forms и WPF.
Документация .NET Framework

.NET Native
Цепочка инструментов AOT-компиляции. Компиляция происходит на машине разработчика аналогично тому, как работают компилятор и компоновщик в C++. Компилятор удаляет неиспользуемый код и тратит больше времени на оптимизацию. Он извлекает код из библиотек и объединяет их в исполняемый файл. В результате получается один модуль, представляющий всё приложение.
UWP была первой платформой приложений, поддерживаемой .NET Native. Теперь поддерживается создание нативных консольных приложений для Windows, macOS и Linux.

.NET Standard
Формальная спецификация API .NET, доступных в каждой реализации .NET. Спецификацию .NET Standard в документации иногда называют библиотекой. Но поскольку библиотека включает в себя реализации API, а не только спецификации (интерфейсы), называть .NET Standard «библиотекой» неправильно.
Документация .NET Standard

Источник: https://docs.microsoft.com/en-us/dotnet/standard/glossary
День пятьсот пятьдесят шестой. #ЗаметкиНаПолях
Асинхронный Mетод без async в C#
Недавно я изменил сигнатуру метода действия контроллера следующим образом:
public async Task GetRecordAsync(int id) => await repo.GetAsync(id);
на
public Task GetRecordAsync(int id) => repo.GetAsync(id);

Во время код-ревью члены моей команды быстро заметили это и поставили под сомнение удаление ключевых слов async и await. Сначала я согласился, что это выглядит сомнительно. Даже после объяснения, которое приведено ниже, может быть полезно их вернуть, чтобы другие на этом не спотыкались.

Итак, мы можем безопасно опустить async/await, поскольку вызывающий метод GetRecordAsync в конечном итоге возвращает то же, что и вызываемый, repo.GetAsync. Вместо того, чтобы наш метод ожидал завершения задачи и возвращал результат, он передаёт эту работу вызывающей стороне.

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

Подробнее про работу async/await

Удаление ключевых слов async/await предотвращает создание конечного автомата. Это немного снижает накладные расходы на выполнение метода. Хотя я не удивлюсь, если компилятор достаточно умён, чтобы оптимизировать этот момент.

Ловушки отсутствия async/await
1. Отсутствие методов в трассировке стека
Рассмотрим следующую цепочку методов:
static async Task Top() => await Middle();
static Task Middle() => Bottom();
static async Task Bottom() {
await Task.Delay(10);
throw new Exception("Bottom Exception");
}

При вызове Top(), трассировка стека не будет включать вызов Middle():
System.Exception: Bottom Exception
at ConsoleApp1.Bottom()
at ConsoleApp1.Top()
at ConsoleApp1.Program.Main(String[] args)

2. Отмена Заданий при Использовании using
Код ниже приводит к ошибке TaskCanceledException:
Task<string> Using HttpClient() {
using var client = new HttpClient();
return client.GetStringAsync("https://1.1.1.1");
}
Это происходит потому, что объект HttpClient удаляется до того, как завершается асинхронный запрос, тем самым отменяя все текущие запросы.

Итого
В общем случая я бы не рекомендовал удалять async/await. Как говорится, преждевременная оптимизация - это корень зла. Можно рассмотреть удаление ключевых слов, если:
- Асинхронный метод - это просто звено в цепочке вызовов.
- Метод находится на «горячем» участке кода.

Источник: https://drakelambert.dev/2020/07/Asynchronous-Method-Without-async-in-C%23
День пятьсот пятьдесят седьмой. #Оффтоп #97Вещей
97 Вещей, Которые Должен Знать Каждый Программист
54. Долговечность Временных Решений
Почему мы создаём временные решения? Обычно возникает некоторая проблема, требующая срочного решения. Может внутренняя (например, нехватка нужного разработчикам инструмента), может внешняя, видимая конечным пользователям («костыль», исправляющий недостатки функционала).

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

Однако с временными решениями возникает проблема. Поскольку они есть, они так или иначе решают проблему, то нет необходимости делать что-то ещё. Всякий раз, когда руководитель расставляет задачи по приоритетам, многие из них будут более важны, чем надлежащая интеграция временного решения. Почему? Потому что оно есть, оно работает, и все смирились с его существованием. Единственным недостатком является то, что оно не следует выбранным стандартам и рекомендациям. Но, за редким исключением, это не воспринимается как трагедия.

Таким образом, временное решение остаётся. Навсегда. И если с ним возникнут проблемы, маловероятно, что будет решено переписать его в соответствии со стандартами. Скорее всего будет сделано быстрое временное обновление этого временного решения.

Это проблема? Ответ зависит от вашего проекта и от вашей личной заинтересованности в стандартах производственного кода. Когда система содержит слишком много временных решений, её энтропия или внутренняя сложность возрастают, а ремонтопригодность снижается. Однако это, вероятно, не главный вопрос. Помните, что мы говорим о решении проблемы. Оно вряд ли вам нравится - вряд ли оно вообще кому-нибудь нравится - но мотивации переделывать его немного.

Так что же делать, когда мы сталкиваемся с проблемой?

1. Избегать временных решений вообще.
Во многих случаях это просто невозможно. Есть актуальная проблема, которую нужно решить, а стандарты оказались слишком жесткими. Вы можете потратить немного сил, попытавшись изменить стандарты. Благородное, но утомительное занятие, кроме того, это изменение не принесёт результата в смысле решения вашей проблемы.

2. Повлиять на решения руководителя проекта.
Бизнес-процессы и процессы принятия решений зачастую консервативны и сопротивляются изменениям. Попытка может быть успешной в небольших проектах (особенно личных): вы просто решаете убрать беспорядок, никого не спрашивая. Также можно добиться успеха, если в проекте такой бардак, что дальше это терпеть невозможно, тогда обычно выделяется некоторое время на очистку проекта.

3. Если не делать ни первое, ни второе, всё останется, как есть.

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

Источник: https://www.oreilly.com/library/view/97-things-every/9780596809515/
Автор оригинала – Klaus Marquardt.
День пятьсот пятьдесят восьмой. #TipsAndTricks
5 Трюков с Immediate Window в Visual Studio. Начало 1-3
В Visual Studio есть окно, которое позволяет запускать и оценивать любой код - Immediate Window.

Например, можно написать System.Console.Write("Hello"), и откроется консольное окно с текстом "Hello". На первый взгляд, окно выглядит довольно тривиальным, но в нём скрываются некоторые интересные функции.

1. Вы можете отлаживать любые методы, вызываемые из окна Immediate.
Допустим, вы что-то отлаживаете, и метод возвращает странный результат. Возможно, вам захочется выполнить этот метод ещё раз, чтобы узнать, как вы получили этот результат, но вы уже прошли этот момент в коде. С Immediate Window это не проблема. Вы можете разместить точку останова в методе, который хотите отладить, и вызвать его в окне Immediate Window. Будет достигнута точка останова, и вы сможете отладить метод.
Замечание: если вы прошли нужное место в коде, вы также можете использовать функцию «Выполнить до курсора» (Ctrl+Shift+F10), чтобы вернуться к любой строке кода в Visual Studio (в той же области).

2. Правила доступа к методам не применяются.
В большинстве случаев всё, что вы пишете в окне Immediate, действует так же, как если бы вы написали это в коде. Разница в том, что правила доступа к членам класса не применяются для окна Immediate. Вы можете вызывать закрытые, защищённые и внутренние члены, которые недоступны из обычного кода.
Замечание: IntelliSense по-прежнему работает в обычном режиме, и в подсказках вы увидите только общедоступные члены.

3. Доступ к специальным переменным - $exception, $returnvalue и $user.
Visual Studio имеет некоторые специальные переменные на время отладки, и в окне Immediate могут отображаться их значения.
- $exception оценивает текущее выброшенное исключение. Переменная доступна в момент возникновения исключения, а также в блоке catch, если он есть. Это полезно в случаях, когда вы не добавили параметр Exception в блок catch.
- $returnvalue показывает возвращаемое значение текущего метода. Это очень полезно, если вы не присвоили это возвращаемое значение переменной. Обратите внимание, что для получения значения $returnvalue, вам нужно прервать выполнение на строке вызова метода, а затем перейти на следующую строку (с помощью F10). Либо, если вы вошли в метод (с помощью F11), то значение $returnvalue будет доступно при выходе из метода. Заметьте, что оно исчезнет, как только вы перейдёте к следующей строке кода.
- $user показывает текущего пользователя ОС и информацию о процессе. Сюда входит имя машины, привилегии процесса и некоторые другие детали, связанные с безопасностью.

Окончание следует…

Источник:
https://michaelscodingspot.com/visual-studio-immediate-window/
День пятьсот пятьдесят девятый. #TipsAndTricks
5 Трюков с Immediate Window в Visual Studio. Окончание 4-5
В Visual Studio есть окно, которое позволяет запускать и оценивать любой код - Immediate Window. Оно выглядит довольно тривиальным, но в нём скрываются некоторые интересные функции.
Начало

4. Оценка без побочных эффектов
Оценка выражения в окне Immediate Window может вызвать побочные эффекты: изменить значения переменных, привести к вызовам методов, которые могут взаимодействовать с базой данных, файлами или сетью. Всё так же, как в обычном коде. Такое поведение неочевидно и не всегда желательно.
Например, рассмотрим этот класс:
class MyClass {
public int number = 0;
public int Foo(int a) {
number++;
return a + 1;
}
}

Если оценить Foo() в окне Immediate Window, number увеличится, и состояние приложения изменится. Вы этого не хотите, вы можете этого избежать. Просто добавьте в конец выражения ", nse" (без побочных эффектов), и выражение будет оцениваться без изменения состояния приложения.

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

5. Оценка Make Object ID
Если вы наведете курсор на любую переменную во время отладки, вы увидите, что всплывающая подсказка содержит пункт «Make Object ID» («Создать идентификатор объекта»).
Make Object ID создает уникальный идентификатор для данного объекта, который начинается с $1 ($1, $2 и т.д.). Вы можете оценить это выражение в любое время в окне Immediate Window, независимо от текущей области отладки. После создания идентификатора объекта вы можете продолжить выполнение, дойти до другой точки останова и оценить $1, чтобы увидеть, как изменилось значение этого объекта и существует ли оно вообще в памяти. Под капотом Make Object ID создает слабую ссылку на объект, чтобы это не мешало сборке мусора.

Итого
В Visual Studio так много всего, что можно каждый день открывать для себя новые возможности. Как видите, окно Immediate Window позволяет использовать некоторые изящные приёмы. Некоторые из них также можно использовать в окне Watch.

Источник: https://michaelscodingspot.com/visual-studio-immediate-window/
День пятьсот шестидесятый. #юмор
Да, всё время так)))