Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Начинающим";
Текущий архив: 2007.08.12;
Скачать: [xml.tar.bz2];

Вниз

передача объекта по ссылке   Найти похожие ветки 

 
sydenis   (2007-07-11 12:21) [0]

Есть класс TMyObject, экземпляр которого я собираюсь передать в процедуру. Какая разница между Proc1(Obj: TMyObject) и Proc1(var Obj: TMyObject)?


 
tesseract ©   (2007-07-11 12:22) [1]

Никакой. Все объекты передаються по ссылке.


 
Сергей М. ©   (2007-07-11 12:33) [2]


> Какая разница между Proc1(Obj: TMyObject) и Proc1(var Obj:
>  TMyObject)?


В 1-м случае передается собственно ссылка на объект, во 2-м - ссылка на переменную, содержащую ссылку на объект (т.н. косвенная ссылка)


 
ЮЮ ©   (2007-07-11 12:43) [3]

Во втором случае в ходе работы процедуры можно заменить Obj на другой объект класса TMyObject, в первом - довольствоваться только переданным Obj - его методами и свойствами


 
Ega23 ©   (2007-07-11 12:44) [4]


> Никакой. Все объекты передаються по ссылке.


Вообще-то разница есть. Допустим во время передачи объекта не существует (Obj=nil). А в процедуре стоит проверка, типа если не существует, то - создать.
В таком случае надо как var передавать.
Во всех остальных - пофиг.


 
StriderMan ©   (2007-07-11 12:54) [5]


> А в процедуре стоит проверка, типа если не существует, то
> - создать.

лучше таких конструкций избегать, ИМХО :)


 
Ega23 ©   (2007-07-11 12:56) [6]


> лучше таких конструкций избегать, ИМХО :)


Почему? Нормальная ситуация.


 
sydenis   (2007-07-11 13:04) [7]

штука в том, что в Proc1 объект убивается
поэтому хотелось бы быть уверенным - в каком случае он точно прибъётся: если var или по значению? а может в обоих случаях?
потому что процедура вызывающая Proc1 о нём уже не заботится.


 
sydenis   (2007-07-11 13:07) [8]

просто объект передаётся между разными формами и та, которая его создала, может закрыться, а следить за его дальнейшей судьбой должна та, куда его передали


 
Reindeer Moss Eater ©   (2007-07-11 13:07) [9]

Убъется в любом случае.
Но в первом случае вызывающая сторона узнает про это только словив AV


 
StriderMan ©   (2007-07-11 13:55) [10]


> Ega23 ©   (11.07.07 12:56) [6]
> Почему? Нормальная ситуация.

ниразу не сталкивался с такой необходимостью. Создаю объекты обычно там где задаются переменные на них указывающие. Или в конструкторах других классов.

Крайний случай - объекты, которые создаются один раз, но только если они нужны. т.е. - не нужны - не создаем. Кому-то понадобился - создали, и оставляем на случай если еще понадобится.


 
Юрий Зотов ©   (2007-07-11 14:56) [11]

> sydenis   (11.07.07 13:07) [8]

Если так, то, может быть, стоит использовать не объект, а интерфейс? Как только на реализующий его объект не останется ссылок, он убьется автоматически.


 
Ega23 ©   (2007-07-11 15:06) [12]


> ниразу не сталкивался с такой необходимостью. Создаю объекты
> обычно там где задаются переменные на них указывающие. Или
> в конструкторах других классов.
>
> Крайний случай - объекты, которые создаются один раз, но
> только если они нужны. т.е. - не нужны - не создаем. Кому-
> то понадобился - создали, и оставляем на случай если еще
> понадобится.


Элементарная вещь: есть bmp : TBitmap, есть TBLOBField. В блобе лежит какая-то картинка (может bmp, может - jpg, а может и null). Нужно, чтобы в bmp лежал именно bmp. А если пусто, то bmp вообще не создавался.
Года 3 назад написал процедуру, до сих пор успешно пользую.


 
Ega23 ©   (2007-07-11 15:07) [13]

В целом - я с тобой согласен, сам я всего несколько раз такие конструкции использовал. Но, как говориться, почему бы и нет?


 
Игорь Шевченко ©   (2007-07-11 15:08) [14]

Хороший пример - процедура FreeAndNil


 
StriderMan ©   (2007-07-11 15:18) [15]


> Ega23 ©   (11.07.07 15:06) [12]

а почему бы как-нибудь так не сделать:

bmp := SafeLoadBmp(AField: TBLOBField);
функция соответственно возвращает то что нужно.

хотя согласен разница с процедурой и var-параметром не велика.


> Игорь Шевченко ©   (11.07.07 15:08) [14]

+1. Классика как всегда :)


 
Ega23 ©   (2007-07-11 15:27) [16]


> bmp := SafeLoadBmp(AField: TBLOBField);
> функция соответственно возвращает то что нужно.
>
> хотя согласен разница с процедурой и var-параметром не велика.


Тут ведь вот какое дело: а если в моём bmp уже что-то было?


 
StriderMan ©   (2007-07-11 15:30) [17]


> Ega23 ©   (11.07.07 15:27) [16]
> Тут ведь вот какое дело: а если в моём bmp уже что-то было?

можно конечно снаружи проверить есть там что или нет, но раз процедурой удобнее, тогда умываю руки :)


 
Ega23 ©   (2007-07-11 15:59) [18]


> можно конечно снаружи проверить есть там что или нет, но
> раз процедурой удобнее, тогда умываю руки :)


Можно. Но в таком случае мне каждый раз перед вызовом придётся проверять, а так - один раз в процедуре написал - и дело с концом.


 
Сергей М. ©   (2007-07-11 16:14) [19]


> sydenis   (11.07.07 13:07) [8]


Наиболее удобным и универсальным решением "проблемы ответственности" за уничтожение передаваемого "туда-сюда" объекта будет решение с интерфейсами.


 
StriderMan ©   (2007-07-11 16:27) [20]


> решение с интерфейсами.
главное не забывать, что когда все ссылки на интерфейс пропадут - объекту кирдык.

Пару раз наступал на грабли, что создавал объект, а для некоторых операций он имел еще и интерфейс. Передал куда-нить интерфейс, поработал с ним, вернулся - а объекта уже прибили :(
причем при работе с интерфейсами дебаггеру частенько сносит крышу.


 
Ega23 ©   (2007-07-11 16:37) [21]


>
> Пару раз наступал на грабли, что создавал объект, а для
> некоторых операций он имел еще и интерфейс. Передал куда-
> нить интерфейс, поработал с ним, вернулся - а объекта уже
> прибили :(


AddRef перекрой - и всё в порядке будет.


 
StriderMan ©   (2007-07-11 18:38) [22]


> Ega23 ©   (11.07.07 16:37) [21]
> AddRef перекрой - и всё в порядке будет.

да как один из способов использовал, когда догадался в чем трабл :)


 
Юрий Зотов ©   (2007-07-11 20:01) [23]

> StriderMan ©   (11.07.07 16:27) [20]

Смешение объектной и интерфейсной моделей. Типичная ошибка проектирования.


 
oxffff ©   (2007-07-11 21:52) [24]


> Юрий Зотов ©   (11.07.07 20:01) [23]
> > StriderMan ©   (11.07.07 16:27) [20]
>
> Смешение объектной и интерфейсной моделей. Типичная ошибка
> проектирования.


Где?


 
sydenis   (2007-07-13 11:29) [25]

> Юрий Зотов

> Если так, то, может быть, стоит использовать не объект,
> а интерфейс? Как только на реализующий его объект не останется
> ссылок, он убьется автоматически.

Да нет - всё проще. Передаваемый объект становится пропертью другого объекта и тот уж сам его прибъёт, когда будет умирать.  
Что-то типа create и assign TFont для вновь открываемой формы...



Страницы: 1 вся ветка

Форум: "Начинающим";
Текущий архив: 2007.08.12;
Скачать: [xml.tar.bz2];

Наверх




Память: 0.5 MB
Время: 0.05 c
4-1172491308
Светлана
2007-02-26 15:01
2007.08.12
работа с портами


2-1184832133
Combo
2007-07-19 12:02
2007.08.12
Как изменить пароль на Access?


11-1166446345
AndreyRus
2006-12-18 15:52
2007.08.12
Ошибка обработчика события OnDestroy


15-1184508737
P_
2007-07-15 18:12
2007.08.12
Пиратство - конструктивный подход.


15-1184643727
Девушка
2007-07-17 07:42
2007.08.12
В чем писать документацию?





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский