C#. Передача объекта между двумя формами
От: Аноним  
Дата: 10.06.10 12:52
Оценка:
Есть две формы:

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'ов одинаковый? Я полагал, что второй должен вывалиться с ошибкой. Ведь между формами передаётся ссылка, которая во второй форме меняется. Почему это не отображается в первой форме?
Re: C#. Передача объекта между двумя формами
От: Lexxpin  
Дата: 10.06.10 12:55
Оценка: +1 :)
Здравствуйте, Аноним, Вы писали:

А>Есть две формы:


А> F2 fe = new F2(ref m_PriceList);



А> public F2(ref CPriceList pricelist)


А>Почему результат обоих MessageBox'ов одинаковый? Я полагал, что второй должен вывалиться с ошибкой. Ведь между формами передаётся ссылка, которая во второй форме меняется. Почему это не отображается в первой форме?

Теперь будет падать.
Re: C#. Передача объекта между двумя формами
От: alexey.kostylev Новая Зеландия http://alexeykostylev.livejournal.com/
Дата: 10.06.10 12:57
Оценка:
Здравствуйте, Аноним, Вы писали:

А>Есть две формы:


А>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-й ссылке
Re[2]: C#. Передача объекта между двумя формами
От: Lexxpin  
Дата: 10.06.10 12:57
Оценка:
А>>Почему результат обоих 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; они указывают не на один объект в куче?
Re[3]: C#. Передача объекта между двумя формами
От: alexey.kostylev Новая Зеландия http://alexeykostylev.livejournal.com/
Дата: 10.06.10 13:03
Оценка:
Здравствуйте, Аноним, Вы писали:

А>Здравствуйте, 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#. Передача объекта между двумя формами
От: Lexxpin  
Дата: 10.06.10 13:11
Оценка:
А>Разве объект _класса_ передаётся в функцию по значению?
Объект по ссылки, сама ссылка по значению.
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>Объект по ссылки, сама ссылка по значению.

Спасибо.
Re: C#. Передача объекта между двумя формами
От: _FRED_ Черногория
Дата: 10.06.10 13:41
Оценка:
Здравствуйте, Аноним, Вы писали:

А>Почему результат обоих MessageBox'ов одинаковый? Я полагал, что второй должен вывалиться с ошибкой. Ведь между формами передаётся ссылка, которая во второй форме меняется. Почему это не отображается в первой форме?


Между фомами передаётся копия ссылки на созданный в первой форме объект. Эта копия в конструкторе второй формы обнуляется и это изменение не видно в первой форме. Что бы передавать не копию, а саму ссылку на объект, параметр в конструкторе второй формы должен быть объявлен с модификатором ref.
Help will always be given at Hogwarts to those who ask for it.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.