Enterra
Компания
35,31
рейтинг
24 сентября 2014 в 10:10

Разработка → Задачник.NET

Этот пост предназначается всем любителям платформы .NET и языка C#. Думаю, многие встречали на просторах сети разнообразные задачки на понимание тех или иных особенностей платформы или языка. Я большой любитель подобных задачек и головоломок. Они помогают глубже понять определённые области и повысить собственные программистские навыки. Однажды я решил сделать подборку подобных задачек, чтобы можно было показывать другим людям и обсуждать нюансы работы с .NET/C#. Когда задачек накопилось достаточное количество, появилась новая мысль — оформить мою подборку в виде книжки. Вашему вниманию предоставляется текущий вариант этого сочинения под названием «Задачник.NET».

Cover
Читать online
Скачать PDF-версию
Исходные коды на GitHub

Данная книга представляет собой сборник задач на знание платформы .NET и языка программирования C#. Дабы у читателя и автора не возникло недопонимания, сразу хочется сказать, чем не является эта книга:
  • Эта книга не является универсальным способом проверить ваше знание платформы .NET. Это не сборник задач для собеседования. Если вы легко прорешали все задачки, то это не значит, что вы замечательный .NET-программист. А если вы встретили много новых для себя вещей, то из этого вовсе не следует, что вы плохо знаете .NET.
  • Эта книга не является подборкой новых, ранее нигде не виданных задач. Многие примеры можно встретить в литературе, в вопросах на StackOverflow, в программистских блогах. Просто потому, что они уже давно стали классическими.
  • Эта книга не является ориентированной на тех, кто уже считает себя Senior .NET Developer и хочет узнать много нового.

Так чем же тогда является эта книга? Задачник.NET — это попытка собрать в одном месте разные интересные практические задания на знание платформы. Скорее всего, наибольшую пользу извлекут для себя .NET-разработчики, которое ещё просто не сталкивались с теми или иными областями. Задачи разбиты на главы, так что можно читать не всё подряд, а только вопросы из тех областей, которые для вас представляют интерес. В этой книге вы не найдёте глубоко философских вопросов типа «Что такое класс?» или «Зачем нужен полиморфизм?». Большая часть заданий представляет собой фрагмент C#-кода, для которого необходимо определить результат работы. Каждый вопрос снабжён ответом с описанием того, отчего .NET ведёт себя именно так.

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

Я догадываюсь, что многие могут начать возмущаться: «А вот в такой-то задачке такая-та штука написана не совсем корректно!» или «А почему задачек так мало?». Поэтому обращаю ваше внимание, что это первый рабочий вариант. На текущем этапе мне хотелось бы получить немного фидбека: нужно ли вообще такое сочинение? Если нужно, то в каком направлении его лучше развивать, про какие области здорово было бы написать? У меня в черновиках накопилось много интересных заданий (которые я пока не успел красиво оформить и включить в задачник) как для уже существующих глав, так и для будущих. В первую очередь планируются главы про многопоточность, WPF и жизненный цикл объектов.

Для каждого задания в конце книги имеется ответ. Часть ответов снабжена кратким описанием того, почему же происходит именно так. На текущий момент подробные объяснения приводятся только для вопросов в главах «Математика», «Значимые типы» и «Строки». Ответы также планируется пополнять и совершенствовать, ведь порой в них и содержится основная полезная информация.

Немного о технической части. Читать обычные книги в классическом формате удобно не всем, поэтому было решено сделать online-версию с помощью GitBook. Как бонус — имеются ePUB и MOBI версии. Но pdf на GitBook верстается просто безобразно. Поэтому я вооружился LaTeX-ом и сверстал нормальную pdf-версию.

Буду рад конструктивным отзывам о моём небольшом сочинении. Также приветствуются новые задачки в любой форме: можете присылать их мне или же присоединяться к разработке на GitHub.
Автор: @DreamWalker
Enterra
рейтинг 35,31
Компания прекратила активность на сайте

Комментарии (23)

  • 0
    В задаче CaseInComparison ошибка — забыли ToUpper() для b в коде string.Compare(a.ToUpper(), b).

    И маленькая хотелка — нет ровно никакого смысла делать перегрузку страницы по нажатию «решение» в онлайн версии, можно просто скрывать/показывать элемент. Сейчас постоянные перегрузки раздражают.

    Edit: как-то пропустил, что онлайн версия сгенерена автоматом. Имхо, очень просто написать свою, более удобную для подобного контента.
    • 0
      Спасибо за замечание — поправил.

      Хотелка очень разумная. Не подскажете, как это на базе GitBook реализовать?
    • 0
      Свою генерилку написать можно, но несколько подкупает готова инфраструктура GitBook — автоматическая генерация на базе репозитория, версии для читалок, удобный доступ и всякие статистики. Быть может потом перейду на собственную генерацию, но для старта это был самый простой вариант.
  • +1
    Очень интересные задачи из раздела LINQ, почерпнул для себя новые идеи, буду их использовать.
    У меня тоже накопилось множество задачек, но я их предпочитаю выкладывать в «интерактивном» виде. Пользователь читает условие задачи, пишет программу для её решения. Система её компилирует и прогоняет по тестам. Если набрал больше 50% — можешь переходить к следующей задаче. Не знаешь как решить — смотри видео-решение. Я разрабатывал и применял эту систему в пту, так вот школьникам очень нравится такой интерактив, дети решали задачи даже на чужих уроках. Сейчас в базе 128 задач: videosharp.info/console.
    • +1
      Посмотрел ваш сайт, достаточно интересно. Но у нас с вами немного разные направления. Практически для всех заданий из моего задачника достаточно просто запустить код, чтобы узнать ответ. Поэтому интерактив-то особо не требуется. И целевая аудитория — не школьники, которых нужно мотивировать, а разработчики, которые сами хотят разобраться детальней в особенностях платформы.
  • 0
    CorruptedString можно решить по-другому:
    Console.SetCursorPosition(0, Console.CursorTop -1);
    Console.WriteLine(«aaaaa»);
    • 0
      В задании подразумевается, что пользовательский код находится до строчки
      Console.WriteLine("Hello");
      
      Вопросики намекают на это, но я распишу задание чуть подробней.
      • 0
        Но тогда все еще проще:
        Console.WriteLine(«aaaaa»);
        return;
        • 0
          А если вы находитесь не в void-функции? Но направление ваших мыслей я понял, передалю задание так, чтобы подобные фокусы не считались.
  • 0
    Предлагаю еще задачи.

    Что будет, если в Delegate.Target попадет объект значимого типа?

    Классическая задача про значимый Enumerator списка
    var list = new List {1, 2, 3};
    while(list.GetEnumerator().MoveNext())
    Console.WriteLine(list.GetEnumerator().Current);

    • 0
      Спасибо за мысль про делегаты. Подумываю сделать отдельную главу про делегаты и события.

      А про Enumerator вопрос у меня есть: ValueTypes/Enumerator.
      • 0
        Это вам спасибо. Узнал, что раньше строковый массив StringBuilder копировался при вызове ToString. Может раньше и StringBuilder.Append был отдельный для StringBuilder. Я как раз об этом писал в своем блоге недавно.
  • –2
    Заметил еще, что не хватает задач на внимательность. Типа
    var str = «1234qwer»;
    str.Repalce(«1234», «rewq»);
    Console.WriteLine(str);
    Опять же задача про неизменяемость строк.
    • +3
      Хм… Надо подумать… Задачек на внимательность по программированию и так в этом мире хватает. Мне бы хотелось сделать такой задачник, в котором каждая задачка могла бы чему-то научить. Какой-то особенности платформы или нюансам транслирования C# в IL. Задачки «на внимательность» можно придумывать пачками, но я не уверен, что ими стоит наполнять конкретно эту книжку.
  • 0
    Спасибо за интересные задачки!

    ps. А какое объяснение LifeAfterYield? :)
    • +1
      Всё просто
      foreach раскрывается в следующий код: (условно)
      var e = Foo().GetEnumerator();
      while (e.MoveNext())
          Console.Write(e.Current);
      

      State Machine в Foo раскрывается в следующий код GetEnumerator: (условно)
      return new StateMachine { State = -1 };
      

      И в следующий код MoveNext:
      switch (this.State)
      {
          case -1:
              this.State = 0;
              this.Current = 1; // трансформация из yield return 1;
              return true;
          case 0:
              Console.WriteLine("Foo"); // трансформация из аналогично кода
              this.State = 1;
              return false;
          default:
              return false;
      }
      

  • 0
    Кстати про делегаты, есть вот такая задачка:
    private delegate void Test(string text);
    private void Test1(string text)
    {
    	Console.WriteLine("Test1 prints" + text);
    }
    private void Test2(string text)
    {
    	Console.WriteLine("Test2 prints" + text);
    }
    
    void Main()
    {
    	const string text = "test";
    	var op = Test2 - (Test2 + new Test(Test1));
    	op(text);
    }
    
    
    • 0
      Спасибо за идею!
  • 0
    Самая первая ссылка в посте (с www) отдает 404.
    • +1
      Спасибо за замечание, поправил.
  • 0
    Ссылка на PDF мертвая :(
    • +1
      Всё починил.
      Система ссылок несколько раз менялась, в паре мест забыл проставить новые варианты.
  • 0
    Задача 3: «ValueTypes:Enumerator» в ответах:
    фразу "А значит, при каждом обращении к методу
    x.Items.MoveNext() мы будем работать не с оригинальным енумератором, а с его
    копией..."
    сразу и не понял. Я Долго пытался выяснить -> к чему иметь оригинальный экземпляр Enumerator?
    Пока не дошел, что код var var x = new { Items = ....} это кортеж с неизменяемыми полями.
    И оказывается что речь идет о том, что при вызове x.Items.MoveNext() происходит создание временного экземпляра структуры(точнее копирование полей в анонимную область в стеке являющую собой структуру Enumerator), у которой и вызывается MoveNext(), у которой успешно изменяется состояние(позиционируется на первый элемент), но дальше она не используется, символьной ссылки на нее нет.
    И каждый раз в начале цикла одна и та же область в стеке заново переписывается readonly экземпляром от x.Items, сбрасываясь тем самым.
    Написал сюда, может кому-то поможет быстрее понять эту задачу.

Только зарегистрированные пользователи могут оставлять комментарии. Войдите, пожалуйста.

Самое читаемое Разработка