Вопросы на собеседованиях по C# и .Net. На позицию junior/middle. Часть 2.
!!НАШ БЛОГ ПЕРЕЕХАЛ!!
Мы создали свой сайт! Все материалы, опубликованные в этом блоге, переехали туда.
Наш новый сайт maddevelop.ru
А данную статью вы можете найти по ссылке ниже:
P.S. движок teletype.in очень странно интерпретирует ссылку, и пришлось вставлять ее полным текстом
Вопрос 6
Какие результаты выведет следующий код:
internal class Program
{
private static Object syncObject = new Object();
private static void Write()
{
lock (syncObject)
{
Console.WriteLine("test");
}
}
static void Main(string[] args)
{
lock (syncObject)
{
Write();
}
}
}
Варианты ответов:
- Выбросит исключение
- Напечатает слово "test"
- Произойдет взаимоблокировка (deadlock)
- Напечатает слово "test" бесконечное число раз
Ответ:
Правильный ответ под номером 2 ("Напечатает слово test"). В этом коде нет никаких причин для появления исключений. Взаимоблокировка тоже не возникает, потому что вся программа выполняется в одном потоке.
Вопрос 7
Даны следующие классы:
public class A
{
public virtual void Print1()
{
Console.Write("A");
}
public void Print2()
{
Console.Write("A");
}
}
public class B: A
{
public override void Print1()
{
Console.Write("B");
}
}
public class C : B
{
new public void Print2()
{
Console.Write("C");
}
}
К какому результату приведет выполнение следующего кода:
var c = new C(); A a = c; a.Print2(); a.Print1(); c.Print2();
Варианты ответов:
- ABC
- CCC
- ACC
- AAC
Ответ:
Верный ответ под номером 1 (ABC).
Вызов a.Print2() возвращает A, потому что в переменной a содержится ссылка на объект класса C. Этот класс наследуется от класса B (наследника класса А) и в своем теле перекрывает с помощью оператора new метод, содержащийся в классе A. В этом случае полиморфизм не будет работать и когда будет вызван метод a.Print2() выполнится код из базового класса А.
Вызов a.Print1() возвратит B, потому что класс C наследуется от B, а в нем, в свою очередь переопределен метод Print1() следовательно и вызываться он будет из класса B.
Вызов c.Print2() возвратит С. Ну здесь все просто, вызывается метод объекта класса C.
Вопрос 8
Что будет выведено на консоль в результате выполнения следующего кода:
static IEnumerable<int> Square(IEnumerable<int> a)
{
foreach(var r in a)
{
Console.WriteLine(r * r);
yield return r * r;
}
}
class Wrap
{
private static int init = 0;
public int Value
{
get { return ++init; }
}
}
static void Main(string[] args)
{
var w = new Wrap();
var wraps = new Wrap[3];
for(int i=0; i<wraps.Length; i++)
{
wraps[i] = w;
}
var values = wraps.Select(x => x.Value);
var results = Square(values);
int sum = 0;
int count = 0;
foreach(var r in results)
{
count++;
sum += r;
}
Console.WriteLine("Count {0}", count);
Console.WriteLine("Sum {0}", sum);
Console.WriteLine("Count {0}", results.Count());
Console.WriteLine("Sum {0}", results.Sum());
}
Ответ:
На консоль выведется:
1 4 9 Count 3 Sum 14 16 25 36 Count 3 49 64 81 Sum 194
Принцип состоит в том, что мы сначала создаем массив элементов Wrap и заполняем его элементами w. Массив в итоге будет таким [1, 2, 3]. Далее создается linq запрос var values = wraps.Select(x=>x.Value), который будет выполняться при каждом новом обращении к values, тем самым пересоздавая массив заново. Этот запрос вызывается и когда мы проходим циклом foreach по массиву results, и когда вызываем метод Count() над results, и когда вызываем метод Sum().
Вопрос 9
Является ли тип List потокобезопасной (thread-safe) коллекцией?
Варианты ответов:
- Только при операциях чтения
- Не является ни в каком случае
- Только при операциях записи
- Является во всех случаях
Ответ:
Если руководствоваться MSDN тип List может быть потокобезопасным в операциях чтения (Ответ 1)
Если выполняется только чтение из общей коллекции, вы можете использовать классы в пространстве имен System.Collections.Generic.
Классы коллекций, представленные в .NET Framework 2.0, находятся в пространстве имен System.Collections.Generic. К ним относятся List<T>, Dictionary<TKey,TValue> и др. Эти классы отличаются улучшенной безопасностью типа и производительностью по сравнению с классами .NET Framework 1.0.Однако классы коллекций .NET Framework 2.0 не обеспечивают синхронизацию потоков. Пользовательский код должен обеспечивать всю синхронизацию при параллельном добавлении элементов в несколько потоков или удалении элементов из них.
Вопрос 10
В чем различие между операцией cast (приведения типов) и оператором as?
- Оператор "as" - это просто синтаксический сахар для "cast"
- Cast изменяет динамический тип, в то время как as изменяет статический тип
- В случае ошибки cast выбрасывает исключение InvalidCastException, а оператор as возвращает null
- В случае ошибки cast возвращает null, а оператор as выбрасывает исключение InvalidCastException
Ответ:
Правильный ответ 3.
На эту тему можно прочитать:
и еще одна интересная статья
Ещё больше интересной информации на нашем Telegram канале.
<< К части 1 << ......... >> К части 3 >>
Источники вопросов: