Сейчас await в C# упрощает работу с асинхронным кодом. Вы просто используете этот оператор с асинхронным методом и ждете потом, когда этот метод вернет значение. Но бывают случаи, когда асинхронный метод передает множество данных. Когда мы загружаем большой файл по сети, его данные поступают постепенно и хочется видеть этот процесс, а не финальный результат.
В 7-й версии C# это станет возможно. Можно будет писать что-то типа:
foreach await (var something in asyncData) { }
Сейчас во время интервью часто можно услышать вопрос – чем отличается интерфейс от абстрактного класса или просто класса. И ответ достаточно простой – у интерфейса не может быть реализации методов. Классы должны реализовывать все методы своих интерфейсов. Это не полный и не идеальный ответ, но достаточный.
Начиная с C# 7 (может 7.1) этот ответ станет неверным. В нем можно будет у интерфейсов писать реализацию по умолчанию, которую потом классы смогут переопределять. Microsoft показывает такой интерфейса:
Сейчас идет .NET конференция, которая немного оказалась в тени из-за презентации Apple. Интернет больше обсуждает iPhone XS и XR и решает, какой из них купить, а в это время Microsoft рассказывает о том, что ждет .NET в будущем.
После последнего моего видео, в котором я говорил, что девушки на моей прошлой работе писали код в vim или в Notepad++ в очередной раз почему-то народ начал сравнивать - что лучше и в чем лучше писать.
Блин, пишите в чем вам удобнее. Из моего опыта те, кто умеет писать в блокноте, точно понимают предмет, потому что без этого в блокноте просто написать невозможно.
Если человек пишет в IDE, то тут уже не факт, что он знает внутренности. Тут я уже встречал как реально хороших специалистов, так и тех, кто умеет только перетаскивать компоненты по формам.
Практически в каждой компании, с которой или где я работал пишут собственный уровень доступа к данным. Это какая-то прослойка, которая отвечает за маппинг данных и которой выгружает и загружает данные. Это нормально и вариант подобной прослойки с использованием Dapper я показывал в своей электронной книге по большим сайтам.
В книге я показал простой пример, в котором простой базовый класс является промежуточным уровнем и создает простую, но все же абстракцию от данных.
Примерно такую же идею я часто вижу в других компаний, но более сложную. Но очень часто я вижу одну и ту же ошибку – методы обновления данных обновляют абсолютно все колонки. Даже если вы изменяете только одну колонку, промежуточный уровень требует, чтобы вы вытащили из базы данных или предоставили все колонки. Если что-то не предоставить, то эта колонка обнулится.
Новый вопрос от читателя о том, что выбрать для мобильной разработки - межплатформенный язык или заточенный под платформу:
Я как понял ты занимаешься разработкой ПО под мобилы, вопрос: мне необходимо освоить это ремесло, я умею хорошо писать на C#, мне лучше использовать xamarin и убить двух зайцев, или лучше сначала написать на java под андроид, а потом изучить и написать под IOS?
Недавно получил по e-mail вопрос, на который коротко ответил уже, но потом решил более развернуто написать уже здесь на блоге:
Привет, Михаил много ли логики пишешь на Transact-Sql? Как думаешь хорошая идея писать sql-процедуры на c#? В sql-е есть такая возможность.
В самом SQL не так уж и много возможностей, а вот в Transact-SQL действительно можно написать многое. Но я не пишу логику на Transact-SQL. Я могу написать какие-то простые вещи в самом крайнем случае, но только в крайнем.
Я не люблю писать тесты для чужого кода, когда код написан плохо, использует очень много зависимостей и когда он не объектно-ориентированный. Это скучно, грустно и не интересно.
Много говорят о тестах, но до сих пор почему-то больше говорят, чем делают. А ведь если сразу же писать свой код и тесты, то код получается лучше, красивее и менее бажный.
Есть разные мнения по поводу того, когда нужно писать тесты. Очень часто слышу, кто тесты нужно писать еще до того, как вы начали писать реальный код. В реальности я больше встречаю случаи, когда тесты пишут в самом конце или не пишут вовсе, потому что не хватает времени.
Недавно я написал заметку, в которой описал магическое выполнение запроса, которое поставило меня в ступор http://www.flenov.info/blog/show/Magicheskaya-problema-proizvoditelynosti. В этой заметке я не раскрою все тайны тормозов, потому что я так и не могу понять, почему тогда простое добавление перехода на новую строку меняло план выполнения, а реальное изменение запроса типа добавления and 1=1 или другие модификации оставляли запрос медленным. Даже OPTION (recompile) не влияла. Именно символ новой строки менял план выполнения. Скажу только, что на следующий день этот трюк не работал и запрос оставался медленным даже после добавления новой строки.
Итак, краткая история. Если просто выполнять запрос в SQL Server Management Studio, то он выполняется быстро:
Мне часто приходится решать проблемы с производительностью и последние два дня борюсь с запросом, который мне просто вынес мозг.
Запрос большой и строится динамически, поэтому я запустил сайт, подключился к нему дебагером и выцепил из кода SQL запрос. Запускаю его в SQL Server Management Studio, и он выполняется за 4 секунды максимум. Но когда абсолютно этот же код выполняется в коде сайта, он работает более минуты.
Я потратил целый день на то, что менял запрос в разные стороны, добавлял OPTION (RECOMPILE) на случай, если проблема с планом выполнения, танцевал вокруг компьютера и ничего не помогало.
Я дебагил каждую строчку кода в надежде понять, может там есть какие-то параметры при запуске запроса, которые могут убить производительность, но там ничего не было. Сравнил типы всех переменных, все совпадает. Производительность может падать, если тип параметра не совпадает с типом данных в базе, но нет, все отлично.
Потом я решил запустил профайлер и выцепить запрос оттуда, и его там показали следующим образом: