partial class F1 : Form
{
private CPriceList m_PriceList; // объект некого класса
/// здесь же в конструкторе этот объект инициализируется
public F1()
{
m_PriceList = new ...
InitializeComponent();
}
private void ShowForm2()
{
MessageBox.Show(m_PriceList.Name);
F2 fe = new F2(m_PriceList);
fe.ShowDialog();
MessageBox.Show(m_PriceList.Name);
}
}
partial class F2 : Form
{
private CPriceList m_PriceList;
public F2(CPriceList pricelist)
{
m_PriceList = pricelist;
m_PriceList = null; /// здесь обнуляем ссылку
InitializeComponent();
}
}
Почему результат обоих MessageBox'ов одинаковый? Я полагал, что второй должен вывалиться с ошибкой. Ведь между формами передаётся ссылка, которая во второй форме меняется. Почему это не отображается в первой форме?
Здравствуйте, Аноним, Вы писали:
А>Есть две формы:
А> F2 fe = new F2(ref m_PriceList);
А> public F2(ref CPriceList pricelist)
А>Почему результат обоих MessageBox'ов одинаковый? Я полагал, что второй должен вывалиться с ошибкой. Ведь между формами передаётся ссылка, которая во второй форме меняется. Почему это не отображается в первой форме?
Теперь будет падать.
Здравствуйте, Аноним, Вы писали:
А>Есть две формы:
А>partial class F1 : Form А>{ А> private CPriceList m_PriceList; // объект некого класса
А> /// здесь же в конструкторе этот объект инициализируется А> public F1() А> { А> m_PriceList = new ...
А> InitializeComponent(); А> }
А> private void ShowForm2() А> { А> MessageBox.Show(m_PriceList.Name); А> F2 fe = new F2(m_PriceList); А> fe.ShowDialog(); А> MessageBox.Show(m_PriceList.Name); А> } А>}
А>partial class F2 : Form А>{ А> private CPriceList m_PriceList;
А> public F2(CPriceList pricelist) А> { А> m_PriceList = pricelist; А> m_PriceList = null; /// здесь обнуляем ссылку
А> InitializeComponent(); А> } А>}
А>Почему результат обоих MessageBox'ов одинаковый? Я полагал, что второй должен вывалиться с ошибкой. Ведь между формами передаётся ссылка, которая во второй форме меняется. Почему это не отображается в первой форме?
ну так обнуляется же не первая сслыка на объект, на ссылка на него во 2-й форме. а печатается оба раза объект по 1-й ссылке
А>>Почему результат обоих MessageBox'ов одинаковый? Я полагал, что второй должен вывалиться с ошибкой. Ведь между формами передаётся ссылка, которая во второй форме меняется. Почему это не отображается в первой форме? L>Теперь будет падать.
Ссылка передается по _значению_, вы меняете копию ссылки.
При модификаторе ref, передается ссылка на ссылку, поэтому ее и можно изменить.
Re[2]: C#. Передача объекта между двумя формами
От:
Аноним
Дата:
10.06.10 13:01
Оценка:
Здравствуйте, alexey.kostylev, Вы писали:
AK>Здравствуйте, Аноним, Вы писали:
А>>Есть две формы:
А>>partial class F1 : Form А>>{ А>> private CPriceList m_PriceList; // объект некого класса
А>> /// здесь же в конструкторе этот объект инициализируется А>> public F1() А>> { А>> m_PriceList = new ...
А>> InitializeComponent(); А>> }
А>> private void ShowForm2() А>> { А>> MessageBox.Show(m_PriceList.Name); А>> F2 fe = new F2(m_PriceList); А>> fe.ShowDialog(); А>> MessageBox.Show(m_PriceList.Name); А>> } А>>}
А>>partial class F2 : Form А>>{ А>> private CPriceList m_PriceList;
А>> public F2(CPriceList pricelist) А>> { А>> m_PriceList = pricelist; А>> m_PriceList = null; /// здесь обнуляем ссылку
А>> InitializeComponent(); А>> } А>>}
А>>Почему результат обоих MessageBox'ов одинаковый? Я полагал, что второй должен вывалиться с ошибкой. Ведь между формами передаётся ссылка, которая во второй форме меняется. Почему это не отображается в первой форме?
AK>ну так обнуляется же не первая сслыка на объект, на ссылка на него во 2-й форме. а печатается оба раза объект по 1-й ссылке
Разве после m_PriceList = pricelist; они указывают не на один объект в куче?
Здравствуйте, Аноним, Вы писали:
А>Здравствуйте, alexey.kostylev, Вы писали:
... А>Разве после m_PriceList = pricelist; они указывают не на один объект в куче?
указывают. 2-я ссылка обнуляется. Если форма 2 попытается обратиться к своей ссылке, получим AV. Обращаемся же все время к 1-й ссылке.
Re[3]: C#. Передача объекта между двумя формами
От:
Аноним
Дата:
10.06.10 13:10
Оценка:
Здравствуйте, Lexxpin, Вы писали:
А>>>Почему результат обоих MessageBox'ов одинаковый? Я полагал, что второй должен вывалиться с ошибкой. Ведь между формами передаётся ссылка, которая во второй форме меняется. Почему это не отображается в первой форме? L>>Теперь будет падать. L>Ссылка передается по _значению_, вы меняете копию ссылки. L>При модификаторе ref, передается ссылка на ссылку, поэтому ее и можно изменить.
Разве объект _класса_ передаётся в функцию по значению?
А>Разве объект _класса_ передаётся в функцию по значению?
Объект по ссылки, сама ссылка по значению.
Re[4]: C#. Передача объекта между двумя формами
От:
Аноним
Дата:
10.06.10 13:22
Оценка:
Здравствуйте, alexey.kostylev, Вы писали:
AK>Здравствуйте, Аноним, Вы писали:
А>>Здравствуйте, alexey.kostylev, Вы писали: AK>... А>>Разве после m_PriceList = pricelist; они указывают не на один объект в куче?
AK>указывают. 2-я ссылка обнуляется. Если форма 2 попытается обратиться к своей ссылке, получим AV. Обращаемся же все время к 1-й ссылке.
Разобрался. Спасибо.
Re[5]: C#. Передача объекта между двумя формами
От:
Аноним
Дата:
10.06.10 13:29
Оценка:
Здравствуйте, Lexxpin, Вы писали:
А>>Разве объект _класса_ передаётся в функцию по значению? L>Объект по ссылки, сама ссылка по значению.
Здравствуйте, Аноним, Вы писали:
А>Почему результат обоих MessageBox'ов одинаковый? Я полагал, что второй должен вывалиться с ошибкой. Ведь между формами передаётся ссылка, которая во второй форме меняется. Почему это не отображается в первой форме?
Между фомами передаётся копия ссылки на созданный в первой форме объект. Эта копия в конструкторе второй формы обнуляется и это изменение не видно в первой форме. Что бы передавать не копию, а саму ссылку на объект, параметр в конструкторе второй формы должен быть объявлен с модификатором ref.
Help will always be given at Hogwarts to those who ask for it.