Вопрос – Ответ
February 19, 2019

Вопросы на собеседованиях по C# и .Net. На позицию junior/middle. Часть 7.


!!НАШ БЛОГ ПЕРЕЕХАЛ!!

Мы создали свой сайт! Все материалы, опубликованные в этом блоге, переехали туда.

Наш новый сайт maddevelop.ru

А данную статью вы можете найти по ссылке ниже:

https://maddevelop.ru/Textbook/ViewSelectedArticle?textbookName=C%23&sectionName=%D0%A1%D0%BE%D0%B1%D0%B5%D1%81%D0%B5%D0%B4%D0%BE%D0%B2%D0%B0%D0%BD%D0%B8%D0%B5%20%D0%BF%D0%BE%20C%23%20%D0%B8%20.NET&subsectionName=%D0%A1%D0%BE%D0%B1%D0%B5%D1%81%D0%B5%D0%B4%D0%BE%D0%B2%D0%B0%D0%BD%D0%B8%D0%B5%20%D0%BD%D0%B0%20%D0%BF%D0%BE%D0%B7%D0%B8%D1%86%D0%B8%D1%8E%20junior%2Fmiddle&articleName=%237%20%D0%91%D0%BB%D0%BE%D0%BA%20%D0%B2%D0%BE%D0%BF%D1%80%D0%BE%D1%81%D0%BE%D0%B2%20(%D0%B2%D0%BE%D0%BF%D1%80%D0%BE%D1%81%D1%8B%2057-65)

P.S. движок teletype.in очень странно интерпретирует ссылку, и пришлось вставлять ее полным текстом


Вопрос 57

Что будет выведено в результате выполнения программы?

class Program
{
    static void Main(string[] args)
    {
        try
        {
            var array = new int[] { 1, 2 };
            Console.Write(array[5]);
        }
        catch(ApplicationException e)
        {
            Console.Write(1);
        }
        catch(SystemException e)
        {
            Console.Write(2);
        }
        catch(Exception e)
        {
            Console.Write(3);
        }
        Console.ReadLine();
    }
}

Варианты ответов:

  1. 1
  2. 2
  3. 3
  4. 123

Ответ: На консоль выведется 2 (ответ 2) Потому, что обращение к несуществующему элементу массива вызывает исключение ArgumentOutOfRangeException, который является производным от SystemException

(Object ->Exception ->SystemException ->ArgumentException -> ArgumentOutOfRangeException)

поэтому при возникновении данного исключения, управление перейдет к блоку кода catch с параметром типа SystemException, и там будет обработана полученная ошибка.

Вопрос 58

Что будет выведено в результате выполнения программы?

class Program
{
    private class Test
    {
        public void Print()
        {
            try
            {
                throw new Exception();
            }
            catch (Exception)
            {
                Console.Write("9");
                throw new Exception();
            }
            finally
            {
                Console.Write("2");
            }
        }
    }
    static void Main(string[] args)
    {
        var test = new Test();
        try
        {
            test.Print();
        }
        catch (Exception)
        {
            Console.Write("5");
        }
        finally
        {
            Console.Write("4");
        }
        Console.ReadLine();
    }
}

Варианты ответов:

  1. 92
  2. 954
  3. 9254
  4. Возникнет ошибка на этапе компиляции

Ответ: На консоль выведется 9254 (Ответ 3).

При вызове метода test.Print() сгенерируется исключение Exceprion() в блоке try.

public void Print()
        {
            try
            {
                throw new Exception();
            }

Это исключение сразу же будет обработано в самом методе Print() в блоке catch. В завершении выполнения метода обязательно отработает блок finally (потому, что он выполняется всегда). Но, так как в catch метода Print()

catch (Exception)
            {
                Console.Write("9");
                throw new Exception();
            }

генерируется еще одно исключение типа Exception, то оно будет уже обрабатываться в методе Main, а по завершению программы выполнятся инструкции прописанные в блоке finally метода Main().

Вопрос 59

Какой уровень доступа имеют поля класса, если модификатор доступа не указан:

  1. protected
  2. internal
  3. protected internal
  4. private
  5. public

Ответ: Если не указывать модификатор доступа для поля класса, то по умолчанию они объявляются с модификатором private. (вариант 4)

Вопрос 60

Каким образом можно присвоить значения полям, которые помечены ключевым словом readonly:

  1. С помощью атрибута DefaultValueAttribute
  2. В любое время из любого метода, который содержится в том же классе, что и поле
  3. Можно присвоить значение из любого места в коде, но только один раз
  4. Из конструктора, либо в месте объявления поля, приравнивая ему какое-то значение

Ответ: Поля помеченные ключевым словом readonly можно инициализировать при их объявлении либо на уровне класса, либо в конструкторе. Инициализировать или изменять их значение в других местах нельзя. (Вариант 4)

Вопрос 61

Какая из перечисленных операций linq исключает дублирование одинаковых элементов в выходной последовательности:

  1. Single()
  2. Any()
  3. Zip()
  4. First()
  5. Distinct()

Ответ: Операция Distinct удаляет дублированные элементы из входной последовательности. (Ответ 5)

Single - Возвращает единственный конкретный элемент последовательности.

Any - Проверяет существование хотя бы одного элемента в последовательности.

Zip - Применяет указанную функцию к соответствующим элементам двух последовательностей, что дает последовательность результатов.

First - Возвращает первый элемент последовательности.

Вопрос 62

С помощью какого ключевого слова осуществляется блокировка одновременного выполнения определенных участков кода несколькими потоками:

  1. private
  2. checked
  3. internal
  4. lock
  5. safe

Ответ: Для осуществления блокировки одновременного выполнения определенных участков кода несколькими потоками используется ключевое слово lock. lock определяет блок, внутри которого весь код становится недоступным для других потоков до завершения работы текущего потока.

private - Ключевое слово private является модификатором доступа к члену. (закрытый класс или член класса.)

checked - Ключевое слово checked используется для явного включения проверки переполнения при выполнении арифметических операций и преобразований с данными целого типа.

internal - Ключевое слово internal является модификатором доступа для типов и членов типов. (класс и члены класса доступны из любого места кода в той же сборке, но недоступны для других программ и сборок)

safe - такого ключевого слова нет, есть Unsafe (Ключевое слово unsafe обозначает небезопасный контекст, необходимый для выполнения любых операций с применением указателей.)

Вопрос 63

Какой интерфейс должен реализовать класс, чтобы к переменной данного типа был применим оператор foreach:

  1. IForEach
  2. IArray
  3. IIterator
  4. IReader
  5. IEnumerable
  6. Никакой

Ответ: Чтобы применить к объекту какого-либо класса оператор foreach в этом классе должен быть реализован интерфейс IEnumerable (ответ 5)

Оператор foreach может применяться для переменных, которые реализуют интерфейс IEnumerable или IEnumerable<T>, либо к экземпляру любого типа, удовлетворяющим условиям:

  • должен включать открытый метод GetEnumerator без параметров с классом, структурой или типом интерфейса в качестве возвращаемого значения;
  • тип возвращаемого значения метода GetEnumerator должен содержать открытое свойство Current и открытый метод MoveNext без параметров с типом возвращаемого значения Boolean.

Вопрос 64

Когда вызывается статический конструктор класса:

  1. Один раз при первом создании экземпляра класса или при первом обращении к статическим членам класса
  2. После каждого обращения к статическим полям, методам и свойствам
  3. Строгий порядок вызова неопределен
  4. Статических конструкторов нет

Ответ: Статический конструктор вызывается автоматически для инициализации класса перед созданием первого экземпляра типа или обращении к каким-либо статическим членам. (ответ 1)

Вопрос 65

Чем отличаются константы и поля, доступные только для чтения:

  1. Ничем не отличаются
  2. Константы инициализируются только во время компиляции, а поля, доступные для чтения, могут инициализироваться во время выполнения в конструкторе
  3. Поля, доступные для чтения, инициализируются только во время компиляции, а константы могут инициализироваться во время выполнения в конструкторе
  4. Константы можно изменять, а доступные только для чтения поля нет

Ответ: Константы являются не явно статическими и вы не можете объявить их с ключевым словом static. Поля для чтения не являются неявно статическими, и их можно сделать таковыми добавив ключевое слово static.

Значение константы должно быть задано в момент ее определения в классе. Поле только для чтения должно быть определено до завершения работы конструктора. Можно задать значение такого поля как непосредственно в строке его определения ( inline инициализация), так и в теле конструктора.


Ещё больше интересной информации на нашем Telegram канале.

<< К части 6 <<

Источник вопросов:

Metanit. Собеседование по C#. Часть 6