113828

8 заданий по C#, которые могут попасться на собеседовании

Изучаете C#? Проверьте, готовы ли к трудоустройству.

1. Напишите программу для сложения всех чётных чисел в массиве

Как надо:

Вариантов много, вот 2 самых простых:

static long TotalAllEvenNumbers(int[] intArray) {
 return intArray.Where(i => i % 2 == 0).Sum(i => (long)i);
}

или

static long TotalAllEvenNumbers(int[] intArray) {
  return (from i in intArray where i % 2 == 0 select (long)i).Sum();
}

Есть несколько ключевых моментов:

1) Используете ли вы конструкции, позволяющие написать код в одну строку?

2) Рассматриваете ли вы ситуацию с переполнением. Например, реализация intArray.Where (i => i% 2 == 0) .Sum () может быть легко написана в одну строку, но тогда высока вероятность переполнения Способы решения задачи выше не исключает такой проблемы, но вероятность её возникновения не высока. Будет хорошо, если вы уточните ожидаемый размер массива.

2. Каков будет результат короткой программы ниже?

class Program {
 static String location;
 static DateTime time;

 static void Main() {
   Console.WriteLine(location == null ? "location is null" : location);
   Console.WriteLine(time == null ? "time is null" : time.ToString());
 }
}

Ответ:

На выходе будет:

location is null
1/1/0001 12:00:00 AM

Обе переменные неинициализированы, но String со ссылочным типом, а DateTime — с типом значения. В качестве типа значения для DateTime устанавливается значение по умолчанию в полночь 1/1/1, а не null.

3. Является ли сравнение time и null в выражении if валидным? Почему?

static DateTime time;
/* ... */
if (time == null)
{
/* do something */
}

Ответ:

Можно подумать, что компилятор будет жаловаться, когда переменная DateTime сравнивается с нулем. Однако компилятор действительно допускает это, что может потенциально привести к ошибкам headfake и pull-out-your-hair.

В частности, оператор == будет передавать свои операнды в разные допустимые типы, чтобы получить общий тип, который он может затем сравнить.

double x = 5.0;
int y = 5;
Console.WriteLine(x == y);  // outputs true

Однако это может привести к неожиданному поведению, как это происходит при сравнении DateTime и null. В этом случае, как DateTime, так и null могут перейти к Nullable <DateTime>. Поэтому можно сравнивать два значения, но результат всегда будет ложным.

4. Напишите код на C# для вычисления окружности, без изменения класса circle

public sealed class Circle {
 private double radius;
 
 public double Calculate(Func<double, double> op) {
   return op(radius);
 }
}

Один из верных ответов:

circle.Calculate(r => 2 * Math.PI * r);

Поскольку у нас нет доступа radius поля объекта, объект сам должен посчитать окружность, с помощью inline.

Менее красивое решение (извлекаем из объекта значение радиуса и затем выполняем вычисление с результатом):

var radius = circle.Calculate(r => r);
var circumference = 2 * Math.PI * radius;

В любом случае, основная цель задания, посмотреть, как вы работаете с calculate.

5. Каков результат работы программы ниже? Поясните свой ответ

class Program {
 private static string result;

 static void Main() {
   SaySomething();
   Console.WriteLine(result);
 }

 static async Task<string> SaySomething() {
   await Task.Delay(5);
   result = "Hello world!";
   return “Something”;
 }
}

Что изменится, если поменять await Task.Delay(5); и Thread.Sleep(5)?

Ответ на первый вопрос: программа просто выведет пустую строку (а не «Hello world!»). Это связано с тем, что result будет неинициализирован при вызове Console.WriteLine.

Большинство программистов ожидают, что функция будет выполняться от начала до конца или до return. Это не относится к функциям async. Они выполняются только до первого await, а затем возвращаются к вызывающему объекту. Функция, вызванная await (в данном случае Task.Delay), выполняется асинхронно, а строка после оператора ожидания не сигнализируется для выполнения, пока Task.Delay не завершится (через 5 миллисекунд).

Вызов await Task.Delay (5) позволяет текущему потоку продолжать работу, и если всё в порядке, возвращать его в пул. Это основное преимущество механизма async / await. Это позволяет CLR обслуживать больше запросов с меньшим количеством потоков в пуле.

В C # есть конструкции, которые значительно облегчают задачу программирования асинхронных методов, а программист, который знает о них, будет создавать более совершенные программы.

Что касается второго вопроса, если await Task.Delay (5); был заменен Thread.Sleep (5), программа выдаст Hello world !. async без хотя бы одного await в нем работает точно так же, как синхронный метод; то есть он будет выполняться от начала до конца или до return. Вызов Thread.Sleep () просто блокирует поток, добавляя 5 миллисекунд к времени выполнения метода SaySomething ().

6. Какой результат выдаст программа ниже?

delegate void Printer();

static void Main()
{
     List<Printer> printers = new List<Printer>();
     for (int i = 0; i < 10; i++)
     {
          printers.Add(delegate { Console.WriteLine(i); });
     }

     foreach (var printer in printers)
     {
          printer();
     }
}

Ответ:

Эта программа выведет число «10» десять раз.

И вот почему: delegate добавляется циклически, однако параметр i передаётся по ссылке. Поэтому, по окончании цикла i равно 10, и при каждом запуске delegate будет выводиться работать с этим значением

7. Сравните структуры и классы в C#. Что они имеют общего? Как они отличаются?

Ответ:

Классы и структуры в C# имеют несколько общих черт, а именно:

  • Являются составными типами данных
  • Могут содержать методы и события
  • Могут поддерживать интерфейсы

Но есть ряд различий. Вот сравнение:

Классы:

  • Наследование поддержки
  • Ссылочные типы
  • Ссылка может быть нулевой
  • Могут занимать больше памяти

Структуры:

  • Не поддерживают наследование
  • Типы значений
  • Передаются по значению (например, целые числа)
  • Не могут иметь нулевую ссылку (если не используется Nullable)
  • Нет места в памяти для instance

8. Напишите программу на C#, которая преобразует получаемые данные о расстоянии в километрах в метры и выводит результат

Решение:

<code class="language-cs hljs"><span class="hljs-keyword">using</span> system;
class abc
{
    <span class="hljs-keyword">public</span> <span class="hljs-keyword">static</span> Void <span class="hljs-title">Main</span>()
    {
        <span class="hljs-keyword">int</span> ndistance, nresult;
        Console.WriteLine(<span class="hljs-string">"Enter the distance in kilometers"</span>);
        ndistance = convert.ToInt32(Console.ReadLine());
        nresult = ndistance * <span class="hljs-number">1000</span>;
        Console.WriteLine(<span class="hljs-string">"Distance in meters: "</span> + nresult);
        Console.ReadLine();
    }
}</code>

Это лишь 8 заданий, которые, как нам кажется было бы полезно уметь решать. Но чтобы пройти собеседование этого недостаточно. Чтобы приблизиться к цели, посмотрите эти материалы:

Источник: Toptal.com

ЛУЧШИЕ СТАТЬИ ПО ТЕМЕ

matyushkin
18 марта 2020

ТОП-10 книг по C#: от новичка до профессионала

Отобрали актуальные книги по C#, .NET, Unity c лучшими оценками. Расположил...
admin
09 мая 2018

Логические и математические задачи с собеседований

Разомнем мозг! В этой статье собраны логические и математические задачи, ко...