|
2 / 2 / 0
Регистрация: 26.09.2014
Сообщений: 45
|
||||||
Не во всех случаях работает передача объекта в метод по ссылке09.08.2015, 17:51. Показов 3772. Ответов 5
Метки нет (Все метки)
Всем нам известно, что классы - это ссылочный тип данных и передавая экземпляр класса в метод, он передается по ссылке. Если метод внесет какие-то изменения в этот экземпляр, то по выходу из метода, изменения сохранятся. Но, как оказалось, почему-то это не всегда это так!
Ниже я привел простенький пример, поведение которого мне не понятно и требуется ваша помощь!
0
|
||||||
| 09.08.2015, 17:51 | |
|
Ответы с готовыми решениями:
5
Передача объекта по ссылке
Передача объекта по ссылке |
|
17823 / 12973 / 3382
Регистрация: 17.09.2011
Сообщений: 21,261
|
||
| 09.08.2015, 18:08 | ||
Сообщение было отмечено Памирыч как решение
РешениеПеременная — это место хранения информации. Есть переменные значимых типов, а есть переменные ссылочных типов. В переменных значимых типов хранится значение. В переменных ссылочных типов хранится ссылка на значение. При присваивании, передаче в метод или при возврате из него создается копия переменной. Если переменная значимого типа, то создается копия всего значения. Если переменная ссылочного типа, то создается копия ссылки на то же самое значение.
2
|
||
|
2 / 2 / 0
Регистрация: 26.09.2014
Сообщений: 45
|
||
| 09.08.2015, 19:49 [ТС] | ||
|
Т.е. получается, что фактически у нас есть две разные ячейки стека, которые указывают на один и тот же объект в куче. Тогда становится понятным, почему не сработали второй и третий методы, т.к. копии присвоили адрес на другой объект. По выходу из метода копию убили, а настоящая ячейка стека как была неизменной, так и осталась. Тогда вопрос: что нужно сделать, чтобы по выходу из второго или третьего метода изменения сохранились? Ref и out не рассматриваем. Я так понимаю, что у копии нужно взять адрес через &, а затем разыменовывать. Так будет получен указатель на ячейку в куче. Затем нужно взять от нее адрес и в эту ячейку запись нужный объект. Но словах все вроде просто, но у меня так и не получилось подменить объект по адресу, на который ссылаются обе ячейки (оригинал и копия). Если кто-то смог провернуть - покажите как! Очень интересно!
0
|
||
|
17823 / 12973 / 3382
Регистрация: 17.09.2011
Сообщений: 21,261
|
||||||||||
| 09.08.2015, 20:36 | ||||||||||
Сообщение было отмечено Памирыч как решение
РешениеМесто хранения практически никак не связано с типом переменной (иначе они бы назывались стековые и кучевые, а не значимые и ссылочные). Стек — это вообще не более чем оптимизация, причем вовсе не обязательная. Они для этого и сделаны. Если не нравятся ref с out, то делайте запаковку:
В .NET ссылка — это что-то вроде дескриптора: "номерка", с помощью которого рантайм знает, доступ к какому объекту вы хотите получить. Примерно как при открытии файла, вы получаете дескриптор: просто номер, с помощью которого ОС позволяет получать доступ к содержимому диска. По факту, конечно, ссылка реализована через указатели, но это лишь деталь реализации, которая может меняться.
0
|
||||||||||
|
2 / 2 / 0
Регистрация: 26.09.2014
Сообщений: 45
|
||
| 09.08.2015, 20:47 [ТС] | ||
|
0
|
||
|
17823 / 12973 / 3382
Регистрация: 17.09.2011
Сообщений: 21,261
|
|||
| 09.08.2015, 20:55 | |||
|
Ну да, на два символа больше, чем амперсанд в плюсах. Big deal. Если передается адрес (&), то передается собственно адрес переменной, то есть фактически создается альяс для передаваемой переменной. Семантически абсолютно то же самое, что ref, с разницей в минус два символа.
0
|
|||
| 09.08.2015, 20:55 | |
|
Помогаю со студенческими работами здесь
6
Передача объекта структуры по ссылке Передача поля объекта по ссылке Передача объекта по ссылке или о значению Передача объекта-наследника по r-value ссылке на родительский класс Стек, не во всех случаях работает удаление Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |
|
Новые блоги и статьи
|
|||
|
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 11.02.2026
Содержание блога
Библиотека SDL3 содержит встроенные инструменты для базовой работы с изображениями - без использования библиотеки SDL3_image. Пошагово создадим проект для загрузки изображения. . .
|
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL3_image
8Observer8 10.02.2026
Содержание блога
Библиотека SDL3_image содержит инструменты для расширенной работы с изображениями. Пошагово создадим проект для загрузки изображения формата PNG с альфа-каналом (с прозрачным. . .
|
Установка Qt-версии Lazarus IDE в Debian Trixie Xfce
volvo 10.02.2026
В общем, достали меня глюки IDE Лазаруса, собранной с использованием набора виджетов Gtk2 (конкретно: если набирать текст в редакторе и вызвать подсказку через Ctrl+Space, то после закрытия окошка. . .
|
SDL3 для Web (WebAssembly): Работа со звуком через SDL3_mixer
8Observer8 08.02.2026
Содержание блога
Пошагово создадим проект для загрузки звукового файла и воспроизведения звука с помощью библиотеки SDL3_mixer. Звук будет воспроизводиться по клику мышки по холсту на Desktop и по. . .
|
|
SDL3 для Web (WebAssembly): Основы отладки веб-приложений на SDL3 по USB и Wi-Fi, запущенных в браузере мобильных устройств
8Observer8 07.02.2026
Содержание блога
Браузер Chrome имеет средства для отладки мобильных веб-приложений по USB. В этой пошаговой инструкции ограничимся работой с консолью. Вывод в консоль - это часть процесса. . .
|
SDL3 для Web (WebAssembly): Обработчик клика мыши в браузере ПК и касания экрана в браузере на мобильном устройстве
8Observer8 02.02.2026
Содержание блога
Для начала пошагово создадим рабочий пример для подготовки к экспериментам в браузере ПК и в браузере мобильного устройства. Потом напишем обработчик клика мыши и обработчик. . .
|
Философия технологии
iceja 01.02.2026
На мой взгляд у человека в технических проектах остается роль генерального директора. Все остальное нейронки делают уже лучше человека. Они не могут нести предпринимательские риски, не могут. . .
|
SDL3 для Web (WebAssembly): Вывод текста со шрифтом TTF с помощью SDL3_ttf
8Observer8 01.02.2026
Содержание блога
В этой пошаговой инструкции создадим с нуля веб-приложение, которое выводит текст в окне браузера. Запустим на Android на локальном сервере. Загрузим Release на бесплатный. . .
|