Вопрос 9
Является ли тип List потокбезопасной (thread-safe) коллекцией?
Варианты ответов:
- Только при операциях чтения
- Не является ни в каком случае
- Только при операциях записи
- Является во всех случаях
Ответ
Не является ни в каком случае. Интересный пост на эту тему есть на хабре.
Вопрос 10
В чем различие между операцией cast (приведения типов) и оператором as?
- Оператор “as” – это просто синтаксический сахар для “cast”
- Cast изменяет диначеский тип, в то время как as изменяет статический тип
- В случае ошибки cast выбрасывает исключение InvalidCastException, а оператор as возвращает null
- В случае ошибки cast возвращает null, а оператор as выбрасывает исключение InvalidCastException
Ответ
В случае ошибки cast выбрасывает исключение InvalidCastException, а оператор as возвращает null
Вопрос 11
Какова алгоритмическая сложность для операций чтения и записи для коллекции Dictionary?
- Чтение – О(1), запись – О(1)
- Чтение – О(n), запись – О(1)
- Чтение – О(n), запись – О(n)
- Чтение – О(1), запись – О(n)
Ответ
Чтение – О(1), запись – О(n)
Вопрос 12
В чем различие между ключевыми словами “ref” и “out”?
- Параметр с ключевым слово ref может быть не инициализирован, а параметр с ключевым словом out обязательно должен быть инииализирован до вызова метода, который использует эти параметры
- Параметр с ключевым слово out может быть не инициализирован, а параметр с ключевым словом ref обязательно должен быть инииализирован до вызова метода, который использует эти параметры
- Нет различий
- Ключевым слово ref может использоваться только со значимыми типами (value types), а out может использоваться как со значимыми, так и с ссылочными типами.
Ответ
Параметр с ключевым слово ref может быть не инициализирован, а параметр с ключевым словом out обязательно должен быть инииализирован до вызова метода, который использует эти параметры
Вопрос 13
Какой будет результат вызова следующего кода:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 |
static void Main(string[] args) { object sync = new object(); var thread = new Thread(()=> { try { Work(); } finally { lock (sync) { Monitor.PulseAll(sync); } } }); thread.Start(); lock (sync) // locking object { Monitor.Wait(sync); // unlocking object and waiting } Console.WriteLine("test"); } private static void Work() { Thread.Sleep(1000); } |
Варианты ответов:
- Будет выброшено SynchronizationLockException
- Слово “test” не будет напечатано, так как произойдет взаимоблокировка (deadlock)
- В одних случаях может быть напечатано слово “test”, а в других может произойти взаимоблокировка
- Всегда будет напечатано слово “test”Ответ
Всегда будет напечатано слово “test”
Метод Monitor.Wait
освобождает блокировку объекта и переводит поток в очередь ожидания объекта. Следующий поток в очереди готовности объекта блокирует данный объект. А все потоки, которые вызвали метод Wait, остаются в очереди ожидания, пока не получат сигнала от метода Monitor.Pulse
или Monitor.PulseAll
, посланного владельцем блокировки. Если метод Monitor.Pulse
отправлен, поток, находящийся во главе очереди ожидания, получает сигнал и блокирует освободившийся объект. Если же метод Monitor.PulseAll
отправлен, то все потоки, находящиеся в очереди ожидания, получают сигнал и переходят в очередь готовности, где им снова разрешается получать блокировку объекта.
Вопрос 14
Какой результат выполнения будет у следующего кода:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 |
class MyCustomException : DivideByZeroException { } static void Main(string[] args) { try { Calc(); } catch (MyCustomException e) { Console.WriteLine("Catch MyCustomException"); throw; } catch (DivideByZeroException e) { Console.WriteLine("Catch Exception"); } Console.ReadLine(); } private static void Calc() { int result = 0; var x = 5; int y = 0; try { result = x / y; } catch (MyCustomException e) { Console.WriteLine("Catch DivideByZeroException"); throw; } catch (Exception e) { Console.WriteLine("Catch Exception"); } finally { throw new MyCustomException(); } } |
Варианты ответов:
- Catch DivideByZeroException, Catch MyCustomException
- Catch Exception, Catch MyCustomException
- Catch DivideByZeroException, Catch DivideByZeroException
- Catch Exception, Catch DivideByZeroException
Ответ
Деление на ноль не генерирует ошибку класса MyCustomException, а генерируется стандартный DivideByZeroException. Поэтому срабатывает второй кэтч.
Catch Exception, Catch MyCustomException