All streams
Search
Write a publication
Pull to refresh
5
0.2
Send message
В линкпаде не получится сохранять результаты, они выводятся в окно типа консоли. Здесь же в результате получится чередование кода и его результатов, которую также можно разбавить текстом с пояснениями — и вот уже готовая презентация, например.
Если мне не изменяет память, как раз с поддержкой от Microsoft там не очень здорово. Они вроде свой MAUI (Multi-platform App UI) намерены развивать.
Не знал про такое, спасибо! Век живи век учись =)
А еще не забыть о том, високосный год встречается не каждые 4 года, например 1900 и 2100 невисокосные года.
В нашей компании тоже минувшим летом организовали обучение по трем направлениям — фронтенд (ангуляр), бэкенд (.net, ms sql, etc.) и devops. Вызвался вести семинары (бэк) вместе с еще одним коллегой, и ничуть не пожалел.
На первом занятии собралось 15 человек, правда половина из них почти сразу отвалилось. Но по окончании двух месяцев занятий (по плану собирались раз в неделю, но почти каждую неделю проводили по два занятия) осталось пятеро человек, которые демонстрировали то что успели сделать, и в итоге четырем направили оффер. Двое уже работают с нами в команде.
Понравилось, когда обучаешь людей новым интересным для них вещам, видишь позитивный отклик.
Справедливости ради, среди таких личностей я бы и не ожидал увидеть много интеллектуалов, особенно подкованных в части IT-технологий
Думаю, минусы оттого, что Ваш комментарий не содержит ничего по теме статьи, лишь жалобу про ограниченный профиль. Оппонируйте, или выскажите свою мысль, которая будет развивать представленные в статье тезисы.
Мы на своём проекте договорились следовать конвенции FindUser(int id) — поиск по идентификатору, если не найден — вернуть null; GetUser(int id) — получить юзера по известному идентификатору. И во втором случае уже при неудачной попытке будет выброшено исключение.
Вспоминаю историю, как в какой-то стране (вроде Великобритании) на съездах устанавливали отбойники, которые из-за трамплинообразной формы провоцировали опрокидывание автомобиля в случае наезда на них на скорости.
Из-за того, что статистику анализировали на основе координат ДТП, долгое время проблема оставалась невыявленной, а власти не спешили признавать проблему — ведь «горячих точек» на карте не было, аварии были распределены по множеству съездов и перекрестков.
Часто использую VS Code как «продвинутый блокнот», и частым сценарием является вставка и форматирование json-ответов, для удобного просмотра их содержимого: вставить в новый документ, переключить язык документа на json (Ctrl-Shift-P -> Change lang mode), форматирование json (Alt-Shift-F).

Недавно нашёл способ пропустить второй шаг, установив дефолтный языковой режим для нового документа настройкой

"files.defaultLanguage": "json"

stackoverflow.com/questions/35904221/change-vscode-default-language-for-new-files
Полагаю, нужно разграничивать цели, для которых можно использовать такой подход.

Например, для кода с бизнес-логикой extension-методы очень редко используются — их трудно мокать, как уже упомянули выше. Да и в целом такой код иногда нуждается в полиморфизме, то есть переопределении логики для классов-наследников.

Для инфраструктурного кода методы расширения — это очень мощный инструмент, который позволяет писать более декларативный код без необходимости изменения классов, с которыми он работает (а иногда к ним может вообще не быть доступа, например для классов из сторонних библиотек). Поскольку такой код обычно не содержит бизнес-логики, то вопрос с юнит-тестами не стоит так остро.

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

В предыдущих примерах при отсутствии файла appsettings.json приложение выбросит исключение

Если для создания хоста приложения (в файле Program.cs) используется метод CreateDefaultBuilder, то файл «appsettings.json» уже добавлен с опциями «optional: true» и «reloadOnChange: true»:

Исходный код метода CreateDefaultBuilder
public static IWebHostBuilder CreateDefaultBuilder(string[] args)
{
  var builder = new WebHostBuilder();

  if (string.IsNullOrEmpty(builder.GetSetting(WebHostDefaults.ContentRootKey)))
  {
    builder.UseContentRoot(Directory.GetCurrentDirectory());
  }
  if (args != null)
  {
    builder.UseConfiguration(new ConfigurationBuilder().AddCommandLine(args).Build());
  }

  builder.ConfigureAppConfiguration((hostingContext, config) =>
  {
    var env = hostingContext.HostingEnvironment;

    config.AddJsonFile("appsettings.json", optional: true, reloadOnChange: true)
        .AddJsonFile($"appsettings.{env.EnvironmentName}.json", optional: true, reloadOnChange: true);

    if (env.IsDevelopment())
    {
      var appAssembly = Assembly.Load(new AssemblyName(env.ApplicationName));
      if (appAssembly != null)
      {
        config.AddUserSecrets(appAssembly, optional: true);
      }
    }

    config.AddEnvironmentVariables();

    if (args != null)
    {
      config.AddCommandLine(args);
    }
  })
  .ConfigureLogging((hostingContext, loggingBuilder) =>
  {
    loggingBuilder.Configure(options =>
    {
      options.ActivityTrackingOptions = ActivityTrackingOptions.SpanId
                        | ActivityTrackingOptions.TraceId
                        | ActivityTrackingOptions.ParentId;
    });
    loggingBuilder.AddConfiguration(hostingContext.Configuration.GetSection("Logging"));
    loggingBuilder.AddConsole();
    loggingBuilder.AddDebug();
    loggingBuilder.AddEventSourceLogger();
  }).
  UseDefaultServiceProvider((context, options) =>
  {
    options.ValidateScopes = context.HostingEnvironment.IsDevelopment();
  });

  ConfigureWebDefaults(builder);

  return builder;
}



github.com/dotnet/aspnetcore/blob/7e9e03b70124784b1de5564c573bd65cdaccbfcc/src/DefaultBuilder/src/WebHost.cs#L173
значит один год уже прошёл

В том-то и дело, что не прошел — нумеруя год единицей, мы говорим что он первый. В прямом смысле — самый первый год (относящийся к нашей эре).
Насколько я помню из нумизматики, тогда (в начале XVIII века) года вовсе буквами обозначали. Например
АѰЕ
обозначало 1705.
Если кому интересно, можно погуглить «год буквами на монетах»
Так нет такого «нулевого года», именно об этом речь. Когда человек рождается, он проживает первый год.
Сейчас на дворе две тысячи двадцатый год, то есть прошло от начала эры только 2019 полных лет.
Судя по всему, считали эры от начала царствования императоров, а от Р.Х. начали считать только 5 веков спустя:
ru.wikipedia.org/wiki/От_Рождества_Христова
Просто по иронии, когда Вы указали на ошибку, в Вашем примере, тоже закралась опечатка, вместо
list.Add(1);

должно быть
tmp.Add(1);

Иначе просто не скомпилируется.
А мне было интересно почитать, размышления на тему того, как человек оказывается в чужой среде.
Согласен: если речь идёт о функции, которая принимает object и сверяет его тип на соответствие конкретным типам, такой код явно пахнет.

Но в случае, например, Union-типов, когда на входе у нас, например, `Customer | Error`, можно обработать ошибочный сценарий в функциональном стиле при помощи паттерн-матчинга. Эх, вот бы наконец завезли в C# Union-типы…
А в восьмой версии языка добавили и switch expressions:

static string Display(object o)
{
    return o switch
    {
        Point p when p.X == 0 && p.Y == 0 => "origin",
        Point p                           => $"({p.X}, {p.Y})",
        _                                 => "unknown"
    };
}


Источник

Information

Rating
2,916-th
Registered
Activity