Информация об изменениях

Сообщение Re[2]: О дизайне от 04.05.2016 16:08

Изменено 04.05.2016 16:12 diez_p

Здравствуйте, Sinatr, Вы писали:

S>Здравствуйте, Тепляков Сергей Владимирович, Вы писали:


S>Почему к примеру с GetEnumerator() не прилагается результат с обьяснением, либо просто ссылка на куда-то где обьяснено? (к примеру, сюда)

Да все просто GetEnumerator() возвращает Enumerator, а это ValueType LOL и при обращении к свойству Enumerator происходит копирование по значению.



IL_0012: callvirt instance !0 class '<>f__AnonymousType0`1'<valuetype ConsoleApplication1.Program/MyStruct>::get_ValueTypeField()

        public struct MyStruct
        {
            public int Field;

            public MyStruct(int field)
            {
                Field = field;
            }

            public void Increment()
            {
                Field++;
            }
        }


        private static MyStruct GetStruct()
        {
            return new MyStruct(0);
        }

Вызов.

            var z = new { ValueTypeField = GetStruct() };

            for (int i = 0; i < 5; i++)
            {
                z.ValueTypeField.Increment();
            }
            Console.WriteLine(z.ValueTypeField.Field);

замена struct на class решает проблему.
Замечу, что обильное использование всяких "фишек" типа иницаилизаторов, анонимных типов и т.д. должно быть оправдано и разработчик должен понимать что происходит "под капотом". Но Enumerator реализованный в List<T> как valuetype хорошая мина
Re[2]: О дизайне
Здравствуйте, Sinatr, Вы писали:

S>Здравствуйте, Тепляков Сергей Владимирович, Вы писали:


S>Почему к примеру с GetEnumerator() не прилагается результат с обьяснением, либо просто ссылка на куда-то где обьяснено? (к примеру, сюда)

Да все просто GetEnumerator() возвращает Enumerator, а это ValueType LOL и при обращении к свойству Enumerator происходит копирование по значению всего элемента, в отличии от ссылочного объекта, когда копирование по значению происзходит только ссылки.



IL_0012: callvirt instance !0 class '<>f__AnonymousType0`1'<valuetype ConsoleApplication1.Program/MyStruct>::get_ValueTypeField()

        public struct MyStruct
        {
            public int Field;

            public MyStruct(int field)
            {
                Field = field;
            }

            public void Increment()
            {
                Field++;
            }
        }


        private static MyStruct GetStruct()
        {
            return new MyStruct(0);
        }

Вызов.

            var z = new { ValueTypeField = GetStruct() };

            for (int i = 0; i < 5; i++)
            {
                z.ValueTypeField.Increment();
            }
            Console.WriteLine(z.ValueTypeField.Field);

замена struct на class решает проблему.
Замечу, что обильное использование всяких "фишек" типа иницаилизаторов, анонимных типов и т.д. должно быть оправдано и разработчик должен понимать что происходит "под капотом". Но Enumerator реализованный в List<T> как valuetype хорошая мина