.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
День девяносто третий. #TipsAndTricks
Использование ключевого слова explicit для явного приведения типов бизнес-логики
Ключевое слово explicit позволяет вам создать оператор явного приведения типа для вашего класса, что может быть полезно при реализации некоторых бизнес-правил. Этот оператор вызывается при выполнении приведения типов. В примере ниже ключевое слово explicit используется для обозначения оператора явного приведения в типе MyEntity, который будет вызываться при попытке приведения типа ExternalEntity к типу MyEntity:
class Program 
{
static void Main(string[] args)
{
ExternalEntity entity = new ExternalEntity()
{
Id = 1001,
FirstName = "Dave",
LastName = "Johnson"
};

MyEntity convertedEntity = (MyEntity)entity;
}

class MyEntity
{
public int Id { get; set; }
public string FullName { get; set; }
public static explicit operator MyEntity(ExternalEntity externalEntity)
{
return new MyEntity() {
Id = externalEntity.Id,
FullName = externalEntity.FirstName + " " + externalEntity.LastName
}
}
}

class ExternalEntity
{
public int Id { get; set; }
public string FirstName { get; set; }
public string LastName { get; set; }
}
}

Источник: https://www.freelancer.com/community/articles/top-16-c-programming-tips-tricks
This media is not supported in your browser
VIEW IN TELEGRAM
День девяносто четвёртый. #ЧтоНовенького
Новинки VS2019 для Повышения Продуктивности
1. Языковая Поддержка Regex
Любое регулярное выражение в ваших файлах C# или Visual Basic теперь имеет подсветку синтаксиса, диагностируется компилятором и включает подчёркивание ошибок и всплывающие подсказки. Эта поддержка парсинга регулярных выражений может распознавать строки, передаваемые в конструктор регулярного выражения, либо строки, которым непосредственно предшествует комментарий, содержащий строку language=regex. Функционал языка на данный момент включает классификацию выражений, сопоставление скобок, подсветку ссылок и диагностику компилятором.

Источник: https://devblogs.microsoft.com/dotnet/visual-studio-2019-net-productivity/
День девяносто пятый. #ЧтоНовенького
Новинки VS2019 для Повышения Продуктивности
2. Инструменты Правки Кода и Рефакторинга
В Visual Studio 2019 добавлены наиболее востребованные функции правки кода и рефакторинга. Многие из них были разработаны сообществом программистов. Подсказки по рефакторингу доступны при нажатии Ctrl+. или Alt+Enter. Среди них:
1. Преобразование цикла foreach в LINQ (см. ниже)
2. Добавление нужных директив using при копировании/вставке.
3. Преобразование анонимного типа в класс.
4. Преобразование локальной функции в метод.
5. Преобразование кортежа в именованную структуру.
6. Анализ "мёртвого кода" на неиспользуемые непубличные члены класса с возможностью их удаления.
7. Генерация метода деконструкции.
8. Добавление ключевого слова await там, где оно подразумевается, но не вызывает предупреждения компилятора.

Источник: https://devblogs.microsoft.com/dotnet/visual-studio-2019-net-productivity/
This media is not supported in your browser
VIEW IN TELEGRAM
К уже существующим методам рефакторинга циклов, включающим преобразование LINQ в foreach, цикла for в foreach и наоборот, добавлена возможность преобразования цикла foreach в запрос или метод LINQ.
День девяносто шестой. #ЧтоНовенького
Новинки VS2019 для Повышения Продуктивности
3. Чистая загрузка решения
Когда решение закрывается, его состояние сохраняется, чтобы, когда в следующий раз вы его откроете, Visual Studio смогла восстановить все открытые файлы, свёрнутые/развёрнутые папки проектов в Solution Explorer (Проводник Решения) и т.п. Это отлично, но иногда лучше открывать решение в чистом (пустом) состоянии: без открытых файлов и со всеми свёрнутыми папками в Проводнике Решения.
Эта функциональность добавлена в Visual Studio 2019 и может быть включена в двух отдельных флажках. Откройте из меню опций Projects and Solutions > General (Проекты и Решения > Общие).
Снимите флажок с пунктов Reopen documents on solution load (Открывать документы при загрузке решения) и Restore Solution Explorer project hierarchy (Восстанавливать иерархию проекта в Проводнике Решения). Кроме прочего, решения в такой конфигурации будут загружаться быстрее, потому что пропускается шаг восстановления состояния.
День девяносто седьмой. #ЧтоНовенького
Новинки VS2019 для Повышения Продуктивности
4. Git pull по ссылке
Если вам нужно постоянно работать с git и обновлять код из репозитория, вы скорее всего сталкивались с ситуацией, когда вы изменяете код, забыв обновить локальную копию. Это ведёт к возникновению конфликтов слияния и другим проблемам. Единственным способом сделать git pull в прошлом было использование Team Explorer, командной строки или стороннего инструмента.
Теперь команде pull в Team Explorer можно назначить горячие клавиши. Зайдите в умный поиск (Ctrl+Q) и введите “keyboard”, чтоб найти страницу опций Environment > Keyboard. Там найдите в списке команду Team.Git.Pull. Затем вы сможете назначить любые горячие клавиши этой команде и нажать кнопку OK. Например, Ctrl+Shift+P.
Чтобы автоматически выполнять команду git pull при загрузке решения, попробуйте бесплатное расширение Git Pull https://marketplace.visualstudio.com/items?itemName=MadsKristensen.GitPull
День девяносто восьмой. #ЧтоНовенького
Новинки VS2019 для Повышения Продуктивности
5. Очистка Кода для C#
Поддержание кода хорошо отформатированным и с соблюдением стилей – это то, чем славятся очень немногие. Новый инструмент Code Cleanup (Очистка Кода) – отличный помощник в этом.
Чтобы выполнить очистку кода, выберите меню Code Cleanup на нижней границе окна редактирования и нажмите Configure Code Cleanup (Настроить Очистку Кода).
В этом диалоге выберите все нужные "фиксеры" по одному из списка доступных внизу и нажмите стрелку вверх, чтобы перенести их в список используемых вверху. Нажмите OK.
Теперь все фиксеры будут применяться каждый раз, когда вы используете Code Cleanup. Нажмите Ctrl+K, Ctrl+E, чтобы запустить очистку. В результате будет хорошо отформатированный документ с набором применённых стилей, таких как пропущенные скобки или модификаторы.
День девяносто девятый. #ЧтоНовенького
Новинки VS2019 для Повышения Продуктивности
6. Просмотр содержимого Циклической Вставки
Каждый раз, когда вы копируете (Ctrl+C) что-то в Visual Studio, скопированное попадает в Циклическую Вставку. Нажатие Ctrl+Shift+V позволяет вам проходить по элементам циклической вставки и вставлять выбранный элемент. Бывает очень полезно хранить несколько элементов в буфере обмена одновременно, а затем вставлять их в нужных местах.
В Visual Studio 2019 Циклическая Вставка теперь показывает всплывающее окно визуального предпросмотра содержимого при нажатии Ctrl+Shift+V. Это упрощает навигацию по истории скопированных элементов и выбор нужного элемента для вставки.
День сотый. #Оффтоп
В праздники не получается ни работать, ни особо учится (хотя планов подтянуть то да сё всегда полно). Поэтому чтобы время вдали от компа не тратить попусту, начал читать эту книженцию прямо с телефона. В ней советы по профессиональному росту. Далеко не все подходят для России, и, по собственному опыту скажу, что далеко не всегда начальство по заслугам оценит ваше рвение. Но многие советы дельные и вполне универсальные для всех.
День сто первый.
Понимаю, что многие ко мне, возможно, пришли с канала CodeBlog. Но всё-таки не могу не поделиться последним стримом про IT сертификацию, в частности про сертификацию в Microsoft. Автор канала к лету планирует пройти сертификацию по C#, так же, как и я. Обещает отдельную серию видео про это ближе к лету. Буду ждать.
https://www.youtube.com/watch?v=S3b-Lwljjew
This media is not supported in your browser
VIEW IN TELEGRAM
День сто второй. #ЧтоНовенького
В последнее время всё большую популярность набирают системы машинного обучения. Теперь и в .NET появилась возможность создавать подобные приложения. Недавно был выпущен ML.NET 1.0. Это бесплатный кросс-платфоменный фреймворк с открытым кодом, разработанный для поддержки машинного обучения в приложениях .NET.
ML.NET позволяет создавать модели машинного обучения, используя C# или F# в таких сценариях, как анализ мнений, классификация проблем, прогнозирование, рекомендации и многое другое.
ML.NET был изначально разработан внутри Microsoft Research, и эволюционировал в важный фреймворк, используемый многими продуктами Microsoft, такими как Windows Defender, Microsoft Office, Azure Machine Learning, PowerBI и др.
Помимо релиза ML.NET 1.0 в качестве предрелизных версий выпущены такие инструменты как Automated machine learning (AutoML), ML.NET CLI и ML.NET Model Builder, которые делают построение моделей машинного обучения простым как нажатие правой кнопки мыши!
https://dot.net/ml
День сто третий. #ЗаметкиНаПолях
Метод nameof
Метод nameof используется для получения простого строкового имени переменной, типа или члена типа. Например:
string text;
WriteLine(nameof(text)); // "text"
WriteLine(nameof(person.Address.ZipCode)); // "ZipCode"

Примеры Использования
1. Валидация параметров:
void f(string s) {
if (s == null) throw new ArgumentNullException(nameof(s));
}
2. Ссылки ActionLink в MVC:
<%= Html.ActionLink("Sign up",
@typeof(UserController),
@nameof(UserController.SignUp))
%>
3. Реализация INotifyPropertyChanged:
int p {
get { return this.p; }
set { this.p = value; PropertyChanged(this, new PropertyChangedEventArgs(nameof(p)); }
}
4. DependencyProperty в XAML:
public static DependencyProperty AgeProperty = DependencyProperty.Register(nameof(Age), typeof(int), typeof(C));
5. Запись в журнал:
void f(int i) {
Log(nameof(f), "method entry");
}
6. Атрибуты:
[DebuggerDisplay("={" + nameof(GetString) + "()}")]
class C {
string GetString() { }
}

Примечания
Аргументом для nameof должно быть простое имя, полное имя, доступ к членам, базовый доступ с заданным членом или доступ к this с указанным членом. Выражение аргумента идентифицирует определение кода, но никогда не вычисляется.
Так как аргумент должен быть синтаксическим выражением, существует несколько запрещенных элементов:
- предопределенные типы (например, int или void),
- обнуляемые типы (Point?),
- массивы (Customer[,]),
- указатели (Buffer*),
- полные псевдонимы (A::B)
- несвязанные универсальные типы (Dictionary<,>),
- идентификаторы препроцессора (DEBUG),
- метки (loop:).

Сведения о сигнатурах, например "Method1 (str, str)", получить невозможно. Чтобы это сделать, можно использовать выражение (Expression e = () => A.B.Method1("s1", "s2")) и извлечь MemberInfo из результирующего дерева выражения.

Источник: https://docs.microsoft.com/en-us/dotnet/csharp/language-reference/keywords/nameof
День сто четвёртый. #TipsAndTricks
Использование Списка Задач (Task List). Начало
Используйте Список Задач для отслеживания комментариев, включающих ключевые слова, такие как TODO, BUG или HACK, либо собственные ключевые слова, а также создавайте ярлыки, чтобы быстро переходить к нужной строке кода.
Открыть окно Списка Задач можно через меню Вид > Список Задач (View > Task List), либо нажав Ctrl+\,T.
В окне списка задач можно отсортировать список, нажав на заголовок столбца. Удерживая Shift, можно добавлять столбцы к сортировке. Также можно добавлять и удалять столбцы через выпадающее меню "Показать Столбцы" (Show Columns). Порядок столбцов можно менять перетаскиванием их за заголовок. Начиная с VS 2017 можно производить поиск по списку задач в поле в правом верхнем углу окна, а также фильтровать по местоположению задач (Всё решение/Текущий проект/Открытые документы/Текущий документ).

Источник: https://docs.microsoft.com/en-us/visualstudio/ide/using-the-task-list
День сто пятый. #TipsAndTricks
Использование Списка Задач (Task List). Продолжение
Токены и комментарии
В список задач попадают комментарии из вашего кода, помеченные специальными токенами:
// TODO: текст комментария
По умолчанию в Visual Studio включены следующие токены: HACK, TODO, UNDONE и UnresolvedMergeConflict. Они регистронезависимы. Кроме того вы можете создавать свои токены:
1. Откройте настройки из меню Tools > Options, выберите Task List из папки Environment.
2. Введите имя токена в поле Name, например, BUG. Выберите приоритет из выпадающего списка Priority и нажмите Add.

Источник: https://docs.microsoft.com/en-us/visualstudio/ide/using-the-task-list
День сто шестой. #TipsAndTricks
Использование Списка Задач (Task List). Окончание
Ярлыки
Ярлык – это закладка в коде, которая отслеживается в Списке Задач. Иконка ярлыка отличается от обычной закладки. Двойной щелчок на строке ярлыка в Списке Задач откроет соответствующий файл и строку кода.
Чтобы создать ярлык, встаньте на нужную строку кода, выберите в меню Edit > Bookmarks > Add Task List Shortcut (Правка > Закладки > Добавить Ярлык Списка Задач) или нажмите Ctrl+K, Ctrl+H.
Для перемещения по ярлыкам в коде выберите ярлык в Списке Задач, а затем выберите Next Task (Следующая Задача) или Previous Task (Предыдущая Задача) из выпадающего меню.

Источник: https://docs.microsoft.com/en-us/visualstudio/ide/using-the-task-list
День сто седьмой. #ЗаметкиНаПолях
LINQ. Начало
LINQ предоставляет возможности выполнения запросов на уровне языка и API функции высшего порядка для написания выразительного и декларативного кода.

Варианты использования:
1. Запрос:
var linqExperts = from p in programmers
where p.IsNewToLINQ
select new LINQExpert(p);
2. API интерфейса IEnumerable<T>:
var linqExperts = programmers
.Where(p => p.IsNewToLINQ)
.Select(p => new LINQExpert(p));

Синтаксис API обычно более лаконичен. Однако иногда имеет смысл использовать синтаксис запроса. Он позволяет использовать предложение let, которое дает возможность объявить и инициализировать переменную в области выражения и применять ее в последующих частях выражения. Аналогичный API-код, скорее всего, будет трудночитаемым.
Поэтому использовать синтаксис запроса имеет смысл, если
- в существующей базе кода уже используется синтаксис запроса;
- необходимо объявить переменные внутри запроса;
- вы предпочитаете синтаксис запросов, который не отвлекает внимание от остального кода.

Преимущества LINQ
1. Выразительность
Код, использующий LINQ, является весьма удобным, так как он создает равные условия как для достижения цели, как и для написания кода, сохраняя при этом логику. Еще одним преимуществом является краткость кода. Большие части базы кода можно сократить на треть.
2. Упрощение доступа к данным
Использование значительной части существующего ПО связано с обработкой данных из определенного источника (баз данных, JSON, XML и т. д.). Часто для этого требуется изучать новый API по каждому источнику данных. LINQ упрощает эту задачу путем абстрагирования общих элементов доступа к данным в синтаксис запросов, который имеет один и тот же вид независимо от выбираемого источника данных.

Продолжение следует…

Источник: https://docs.microsoft.com/en-us/dotnet/standard/using-linq
День сто восьмой. #ЗаметкиНаПолях
LINQ. Продолжение
Основные примеры
1. Ключевые компоненты — Where, Select и Aggregate:
// Фильтрация списка (выбор овчарок из списка собак)
// API
var shepards = dogs.Where(dog => dog.Breed == DogBreed.Shepard);
// Запрос
var queryShepards = from dog in dogs
where dog.Breed == DogBreed.Shepard
select dog;

// Отображение списка объектов типа A в список объектов типа B
// API
var cats = dogs.Select(dog => dog.TurnIntoACat());
// Запрос
var queryCats = from dog in dogs
select dog.TurnIntoACat();

// Суммирование длин строк из набора
int sumOfStrings = strings.Aggregate(0, (s1, s2) => s1 + s2.Length);

2. Спрямление списка списков:
// Преобразование списка собачьих питомников в единый список собак из всех питомников
var allDogsFromKennels = kennels.SelectMany(kennel => kennel.Dogs);

3. Объединение/пересечение двух наборов с пользовательским блоком сравнения (используется объект, реализующий IEqualityComparer<T>, для сравнения объектов между собой):
// Получаем всех короткошёрстных собак из двух питомников
var shortHairedDogs = kennel1.Dogs.Union(kennel2.Dogs, new HairComparer());

public class HairComparer : IEqualityComparer<Dog> {…}

// Получаем волонтёров, работающих в обоих благотворительных обществах
var volunteers = humaneSociety1.Volunteers.Intersect(humaneSociety2.Volunteers, new VolunteerTimeComparer());

4. Упорядочение набора:
// Получаем пути движения, упорядоченные сначала по отсутствию платных участков, затем по времени в пути
var results = DirectionsProcessor.GetDirections(start, end)
.OrderBy(direction => direction.HasNoTolls)
.ThenBy(direction => direction.EstimatedTime);

5. А этот метод расширения использует отражение, чтобы вывести набор открытых свойств экземпляра, имеющих те же значения, что и у другого экземпляра:
public static class PropExtensions
{
public static IEnumerable<PropertyInfo> PublicEqualProps<T>(this T self, T to, params string[] ignore) where T : class
{
if (self == null || to == null)
return null;

// Выбирает свойства с одинаковыми значениями, не входящие в ignore, в набор свойств
var equalProps = from property in typeof(T).GetProperties(BindingFlags.Public | BindingFlags.Instance)
where !ignore.Contains(property.Name)
let selfValue = property.GetValue(self, null)
let toValue = property.GetValue(to, null)
where !Equals(selfValue, toValue)
select property;

return equalProps;
}
}
Найдём одинаковые свойства двух экземпляров класса Person:
var male = new Person { 
Age = 41,
FirstName = "John",
LastName = "Smith",
Male = true
};
var female = new Person {
Age = 41,
FirstName = "Jane",
LastName = "Smith",
Male = false
};
foreach(var prop in male.PublicEqualProps(female))
Console.WriteLine(prop.Name);
Вывод:
Age
LastName

Полный список примеров можно скачать здесь https://code.msdn.microsoft.com/101-LINQ-Samples-3fb9811b

Продолжение следует…

Источник: https://docs.microsoft.com/en-us/dotnet/standard/using-linq
👍2
День сто девятый. #ЗаметкиНаПолях
PLINQ
PLINQ или Параллельный LINQ – это движок параллельного выполнения выражений LINQ. Другими словами, обычное выражение LINQ может быть легко распараллелено в любое количество потоков. Это достигается через вызов метода AsParallel(), предшествующий выражению.
Рассмотрим следующий пример:
public static string GetAllFacebookUserLikesMessage(IEnumerable<FacebookUser> facebookUsers)
{
var seed = default(UInt64);
Func<UInt64, UInt64, UInt64> threadAccumulator = (t1, t2) => t1 + t2;
Func<UInt64, UInt64, UInt64> threadResultAccumulator = (t1, t2) => t1 + t2;
Func<Uint64, string> resultSelector = total => $"Facebook has {total} likes!";

return facebookUsers.AsParallel()
.Aggregate(seed, threadAccumulator, threadResultAccumulator, resultSelector);
}
Этот код разделит facebookUsers между системными потоками по мере необходимости, суммирует общее количество лайков в каждом потоке параллельно, суммирует результаты, вычисленные каждым потоком, и выдаст полученный результат в строке (см. диаграмму ниже).
Параллелизуемые задания, использующие ресурсы ЦП, которые можно легко выразить через LINQ (другими словами, чистые функции без побочных эффектов) являются отличными кандидатами для PLINQ. Для работы с заданиями, которые имеют побочный эффект, рекомендуется рассмотреть возможность использования библиотеки параллельных задач.

Источник: https://docs.microsoft.com/en-us/dotnet/standard/using-linq