Сообщение 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()
Вызов.
замена struct на class решает проблему.
Замечу, что обильное использование всяких "фишек" типа иницаилизаторов, анонимных типов и т.д. должно быть оправдано и разработчик должен понимать что происходит "под капотом". Но Enumerator реализованный в List<T> как valuetype хорошая мина
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()
Вызов.
замена struct на class решает проблему.
Замечу, что обильное использование всяких "фишек" типа иницаилизаторов, анонимных типов и т.д. должно быть оправдано и разработчик должен понимать что происходит "под капотом". Но Enumerator реализованный в List<T> как valuetype хорошая мина
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 хорошая мина