Вопрос 5
Что выведет на консоль следующий код
1 2 3 4 5 6 7 8 |
var s1 = string.Format("{0}{1}", "abc", "cba"); var s2 = "abc" + "cba"; var s3 = "abccba"; Console.WriteLine(s1 == s2); Console.WriteLine((object)s1==(object)s2); Console.WriteLine(s2==s3); Console.WriteLine((object)s2==(object)s3); |
Варианты ответов:
- true, false, true, true
- true, true, true, true
- true, false, true, false
- true, false, false, false
Ответ
1 2 3 4 |
True False True True |
Тут надо добавить еще что код var s2 = “abc” + “cba”; компилятор оптимизирует и превратит на этапе компиляции в var s2 = “abccba”;
если две строки имеют одинаковый набор символов и создаются во время
компиляции, то они фактически указывают на один и тот же объект.
Вопрос 6
Какие результаты выведет следующий код
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 |
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” бесконечное число раз
Ответ
Выведет слово test
Два lock’а не приведут к взаимоблокировке в данном случае, поскольку дело происходит в одном и том же потоке.
Вопрос 7
Есть следующие классы
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 |
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"); } } |
К какому результату приведет выполнение следующего кода:
1 2 3 4 5 6 |
var c = new C(); A a = c; a.Print2(); a.Print1(); c.Print2(); |
Варианты ответов:
- ABC
- CCC
- ACC
- AAC
Ответ
ABC
Этот вопрос про раннее и позднее связывание
Переменная a является типом A, но хранит ссылку на объект С.
Создается объект a типа A, который указывает на объект c типа C. Но объект c типа C, в свою очередь, является объектом классов A и B. Поэтому, при вызове метода print1() у этого объекта вызывается переопределенный метод Print1() из класса B.
Это называется сокрытием методов. В классе С вы сокрыли метод Print2() базового класса А, поэтому когда вы обращаетесь с.Print2() выводится С. Но a.Print2() выведет А потому, что вы обратитесь к нему через ссылку на класс А(базовый класс) и таким образом вызовете метод из класса А.
a.Print2() выведет A
a.Print1() выведет B (позднее связывание)
c.Print2() (раннее связывание, выведет С из-за сокрытия метода оператором new в классе C)
Вопрос 8
Пропущен…