Здравствуйте, Lloyd, Вы писали:
L>Фига се! А как это работает?!! Оно память что-ли портит? Или как-то иначе?
Работает также как reinterpret_cast в C++ Т.е. данные одного типа в памяти интерпретируются как данные другого типа. При желании можно и попортить что-нибудь. Но в данном конкретном случае это безопасно.
Re[6]: Как написать преобразование из базового в производный
Здравствуйте, Воронков Василий, Вы писали:
L>>Фига се! А как это работает?!! Оно память что-ли портит? Или как-то иначе?
ВВ>Работает также как reinterpret_cast в C++ Т.е. данные одного типа в памяти интерпретируются как данные другого типа. При желании можно и попортить что-нибудь. Но в данном конкретном случае это безопасно.
Не понимаю, как это может быть безопасно?
Поля BaseClass и DerivedClass ссылаются на один участок памяти. Этот участок памяти выделен вызовом "new Base", значит размер выделенного участка не больше чем размер класса Base. Значит при попытке записать в поле Title мы пишем в область за выделенным участком, т.е портим память.
У меня где-то ошибка в рассуждениях? Где?
Re[6]: Как написать преобразование из базового в производный
Здравствуйте, Воронков Василий, Вы писали: ВВ>Здравствуйте, Lloyd, Вы писали: L>>Фига се! А как это работает?!! Оно память что-ли портит? Или как-то иначе? ВВ>Работает также как reinterpret_cast в C++ Т.е. данные одного типа в памяти интерпретируются как данные другого типа. При желании можно и попортить что-нибудь. Но в данном конкретном случае это безопасно.
На чтение может и безопасно (служебные данные за пределами класса читать).
А на запись, если клас чуть побольше (еще 2 int добавлено в Derived) то все падает:
public class Derived : Base
{
public string Title;
public int id1,id2;
}
public class Base
{
public string Name;
public int Id;
}
[StructLayout(LayoutKind.Explicit)]
struct Convert
{
[FieldOffset(0)]
public Base BaseClass;
[FieldOffset(0)]
public Derived DerivedClass;
}
Тогда студия падает:
var cv = new Convert();
cv.BaseClass = new Base{ Name = "Basil", Id = 123 };
var victim = new Base { Name = "Victim", Id = 13 };
cv.DerivedClass.id1 = 1;
cv.DerivedClass.id2 = 1;
//При отладке 'System.ExecutionEngineException', или студия падает,виснет, иногда даже не доходя до этой точки.
//Но несколько раз прокатывало нормально.var t = victim.GetType();
Re[8]: Как написать преобразование из базового в производный
Здравствуйте, _FRED_, Вы писали:
_FR>А зачем данный тест править? Тест можно написать так, что бы при добавлении новых полей не приходилось бы править тест, иначе это неправильный тест.
Ты имеешь в виду reflection использовать в тесте?
Re[9]: Как написать преобразование из базового в производный
Здравствуйте, MozgC, Вы писали:
_FR>>А зачем данный тест править? Тест можно написать так, что бы при добавлении новых полей не приходилось бы править тест, иначе это неправильный тест.
MC>Ты имеешь в виду reflection использовать в тесте?
Да всё что угодно: можно отражение, а можно кодогенерацию кода теста.
Help will always be given at Hogwarts to those who ask for it.
Re[10]: Как написать преобразование из базового в производны
Здравствуйте, _FRED_, Вы писали:
_FR>>>А зачем данный тест править? Тест можно написать так, что бы при добавлении новых полей не приходилось бы править тест, иначе это неправильный тест. MC>>Ты имеешь в виду reflection использовать в тесте? _FR>Да всё что угодно: можно отражение, а можно кодогенерацию кода теста.
Тогда не проще ли в методе клонирования использовать reflection если все равно с ним тест еще писать?
Re[11]: Как написать преобразование из базового в производны
Здравствуйте, MozgC, Вы писали:
_FR>>>>А зачем данный тест править? Тест можно написать так, что бы при добавлении новых полей не приходилось бы править тест, иначе это неправильный тест. MC>>>Ты имеешь в виду reflection использовать в тесте? _FR>>Да всё что угодно: можно отражение, а можно кодогенерацию кода теста.
MC>Тогда не проще ли в методе клонирования использовать reflection если все равно с ним тест еще писать?
Я вижу большую разницу в использовании рефлекшена при написании теста и при использовании рефлекшена в рабочем коде.
Help will always be given at Hogwarts to those who ask for it.
Re[12]: Как написать преобразование из базового в производны
Здравствуйте, _FRED_, Вы писали:
_FR>>>>>А зачем данный тест править? Тест можно написать так, что бы при добавлении новых полей не приходилось бы править тест, иначе это неправильный тест. MC>>>>Ты имеешь в виду reflection использовать в тесте? _FR>>>Да всё что угодно: можно отражение, а можно кодогенерацию кода теста. MC>>Тогда не проще ли в методе клонирования использовать reflection если все равно с ним тест еще писать? _FR>Я вижу большую разницу в использовании рефлекшена при написании теста и при использовании рефлекшена в рабочем коде.
Ага, в одном случае придется при изменении класса изменять и метод клонирования, а в другом случае — не нужно.