«Boxing» (Решение)
Ответ
Объяснение
Ключевым моментом в понимании примера является тот факт, что при вызове Console.WriteLine
используется перегруженный вариант метода, принимающий аргумент типа object
. Поэтому передаваемая в него структура упаковывается. Это означает, что в управляемой куче создаётся копия структуры, метод ToString()
отрабатывает для упакованной копии. Теперь разберём пример по строчкам:
Мы создали экземпляр структуры Foo
и дважды выполнили для него Console.WriteLine(foo)
. Дважды выполнилась копирование и упаковка структуры, ToString()
вызвалось для копии, не тронув оригинал. Изначально Foo.value == 0
, так что в обоих случаях выведется "Foo"
.
Тут мы явно выполняем упаковку структуры. Объекты bar
и qux
указывают на разные копии структуры, т.к. мы выполнили две отдельных операции упаковки. Объект baz
указывает на ту же копию структуры, что и bar
, т.к. в третьей строчке мы просто выполнили копирование ссылки.
В этих трёх строчках мы работаем с одной и той же копией структуры, обращаясь к ней по ссылке (bar
и baz
представляют собой одну и ту же ссылку).
А в этой строчке мы работаем с копией структуры, для которой метод ToString()
ещё ни разу не вызывался. Поэтому выведется "Foo"
.
Last updated