Вопрос – Ответ
January 24, 2019

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


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

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

Наш новый сайт 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=%234%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%2021-30)

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


Вопрос 21

Как можно сравнить строки в C#?

Ответ: Согласно MSDN существует несколько методов для сравнения строк:

  • String.Compare - Сравнивает значения двух строк. Возвращает целочисленное значение.
  • String.CompareOrdinal - Сравнивает две строки без учета локального языка и региональных параметров.Возвращает целочисленное значение.
  • String.CompareTo - Сравнивает текущий строковый объект с другой строкой. Возвращает целочисленное значение.
  • String.StartsWith - Определяет, начинается ли строка с переданной строки. Возвращает логическое значение.
  • String.EndsWith - Определяет, заканчивается ли строка переданной строкой. Возвращает логическое значение.
  • String.Equals - Определяет, совпадают ли две строки. Возвращает логическое значение.
  • String.IndexOf - Возвращает индекс позиции символа или строки начиная с начала проверяемой строки.Возвращает целочисленное значение.
  • String.LastIndexOf - Возвращает индекс позиции символа или строки начиная с конца проверяемой строки.Возвращает целочисленное значение.
  • Так же можно использовать операторы != и ==. С их помощью строки сравниваются по значению, а если хочется сравнить строки по ссылке то можно применить такой вариант:
(object)str1 == (object)str2

Но в этом случае не стоит забывать об интернировании.

Вопрос 22

Что такое управляемый код и CLR? Основные требования к управляемому коду.

Ответ: управляемый код - код программы исполняемый под управлением CLR (Виртуальной машиной .Net)

CLR (общеязыковая исполняющая среда) — исполняющая среда для байт-кода CIL (MSIL), в которой компилируются программы, написанные на .NET-совместимых языках программирования (C#, Managed C++, Visual Basic .NET, F# и прочие). CLR является одним из основных компонентов пакета Microsoft .NET Framework.

Написанный управляемый код должен быть полностью совместим с CTS(Common Type System), который поддерживают все .Net совместимые языки.

Вопрос 23

Разница IEnumerable<T> и IQueryable<T> при работе с удаленной БД ?

Ответ: сначала нужно сказать, что:

  • IEnumerable относится к System.Collection (Linq to Object)
  • IQueryable относится к System.Linq (Linq to Sql)

При этом, стоит отметить, что IEnumerable родитель для IQueryable.

Разницу между ними хорошо видна при работе с БД (например технологией EF).

  • IEnumerable. Объект IEnumerable представляет набор данных в памяти и может перемещаться по этим данным только вперед.

Например:

IEnumerable<Phone> phoneIEnum = db.Phones;
var phones=phoneIEnum.Where(p => p.Id > id).ToList()

в этом случае фильтрация будет идти уже после выборки всех значений из БД. То есть, при выполнении запроса, IEnumerable загружает все данные, и если требуется выполнить их фильтрацию, то она происходит на стороне клиента.

Запрос на стороне БД:

SELECT * FROM STUDENTS 
  • IQueryable. Он располагается в пространстве имен System.Linq. Объект предоставляет удаленный доступ к базе данных и позволяет перемещаться по данным как в прямом порядке от начала до конца, так и в обратном порядке. В процессе же выполнения запроса, происходит оптимизация запроса.

Используем тот же пример только с IQueryable:

IQueryable<Phone> phoneIQuer = db.Phones;
var phones=phoneIQuer.Where(p => p.Id > id).ToList();

Здесь же при запросе будет производиться сразу фильтрация и будет возвращено только то, что нужно нам. Стоит отметить, что сам запрос будет отрабатываться чуть медленнее, чем запрос, возвращающий объект IEnumerable.

Запрос на стороне БД:

SELECT * FROM STUDENTS 
    WHERE AGE > 25 

Вопрос 24

Что такое абстракция и как она связана с ООП?

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

Например можно составить упрощенный класс человека, который умеет двигаться, а от всего остального мы абстрагируемся (в данным случае несущественно то, что он умеет дышать, кушать, видеть, слышать и т. д.)

class Man 
{
  public void Move(bool run)
  {
    if(run)
    {
      Run();	
    }
    else
    {
      Walk();
    }
  }
  private void Walk()
  {
    Console.WriteLine("Man is walking.");
  }
  private void Run()
  {
    Console.WriteLine("Man is running.");
  }
}

Вопрос 25

Что такое IoC(Inversion of Control/инверсия управления) и для чего она нужна?

Ответ: Inversion of Control (инверсия управления) — это некий абстрактный принцип, набор рекомендаций для написания слабо связанного кода. Суть которого в том, что каждый компонент системы должен быть как можно более изолированным от других, не полагаясь в своей работе на детали конкретной реализации других компонентов.

Вопрос 26

Что такое DI(Dependency Injection) контейнер?

Ответ: DI контейнер это один из способов реализации принципа IoC. Этот контейнер знает о всех интерфейсах и их реализациях в системе и умеет их сопоставлять. Перед началом работы с ним необходимо зарегистрировать известные типы и их сопоставления(интерфейс-->реализация).

Вопрос 27

Какие реализации DI контейнеров вы знаете на C#. Какой DI контейнер является лучшим?

Ответ: Castle Windsor, Autofac, Ninject, Unity...и так далее, на самом деле их очень много. На счет того, какой из них лучший не совсем корректный вопрос. Все зависит от конкретной реализации.

Вопрос 28

Что подразумевается под свойствами в C#?

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

[модификатор_доступа] возвращаемый_тип название
{
	//код свойства
}

Стандартной определение свойства содержит блоки get и set. В блоке get возвращается значение поля, а в блоке set устанавливается с помощью параметра value, которое представляет передаваемое значение.

private string _name;
public string Name
{
	get { return _name; }
	set { _name = value; }
}

Свойства позволяют добавить логику, которая может быть необходима, например, при присвоении переменной класса какого-либо значения. Блоки set и get не обязательно одновременно должны присутствовать в свойстве. Если свойство определяют только блок get, то такое свойство доступно только для чтения - мы можем получить его значение, но не установить. И, наоборот, если свойство имеет только блок set, тогда это свойство доступно только для записи.

Более подр��бно можно почитать здесь.

Вопрос 29

Что такое assembly manifest (манифест сборки)?

Ответ: Манифест сборки содержит все метаданные, необходимые для задания требований сборки к версиям и удостоверения безопасности, а также все метаданные, необходимые для определения области действия сборки и разрешения ссылок на ресурсы и классы. Манифест сборки может храниться в PE-файле (EXE или DLL) с кодом MSIL или же в отдельном PE-файле, содержащем только данные манифеста.

Манифест сборки предназначен для следующих задач:

  • перечисление файлов, составляющих сборку;
  • сопоставление ссылок на типы и ресурсы сборки с файлами, содержащими объявления и реализации этих типов и ресурсов;
  • перечисление других сборок, от которых зависит эта сборка;
  • обеспечение косвенного обращения пользователей сборки к подробностям ее реализации;
  • предоставление собственного описания сборки;

Жмяк на ссылку

Вопрос 30

Что такое GAC? Возможно ли поместить два файла с одинаковым именем в Global Assembly Cache?

Ответ: GAC (Global Assembly Cache) - глобальный кэш сборок, место где хранятся разделяемые сборки. Местоположение кэша сборок отличается в зависимости от версии .NET, установленной на локальной машине. До .NET 4.0 глобальный кэш находился в каталоге C:\Windows\assembly. Начиная же с версии .NET 4.0 кэш сборок размещается по пути C:\Windows\Microsoft.NET\assembly\GAC_MSIL.

В GAC нельзя помещать полностью одинаковые сборки (сборки с полностью совпадающим сложным именем). Сложное имя сборки состоит из нескольких частей:

  • Имя сборки без расширения
  • Номер версии. Благодаря разграничению по версии можно использовать разные версии одной и ой же сборки
  • Открытый ключ
  • Необязательное значение для культуры (при локализации сборки)
  • Цифровая подпись, которая создается с помощью хэш-значения содержимого сборки и значения секретного ключа. Секретный ключ представляет собой файл с расширением *.snk.

Так, что если совпадает у двух сборок только имена сборки, а все остальное отличается, то их можно помещать в GAC вместе.


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

<< К части 3 << ......... >> К части 5 >>

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

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