Форум программистов, компьютерный форум, киберфорум
C# .NET
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.86/7: Рейтинг темы: голосов - 7, средняя оценка - 4.86
0 / 0 / 0
Регистрация: 26.09.2012
Сообщений: 87

Дискуссия по поводу внутреннего устройства this в c#

13.02.2016, 13:00. Показов 1342. Ответов 5
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
this ссылается именно на экземпляр класса? или еще экземпляр значимого типа?
я знаю что при вызове метода передается неявный параметр this - ссылка на текущий экземпляр (к примеру класса).
я имею ввиду вот на этом этапе попрошу объяснить зачем нужен неявный параметр-ссылка this? (1-ый ВОПРОС)
просто хочу понять досконально как внутри все устроено и почему именно ТАК.
Мое мнение (комментируем так ли это): во внутренней реализации this ссылается на объект-тип (там же таблица методов), но с использованием этим
методом полей, текущего экземпляра класса, на который и указывает ссылка this (ссылка на объект).

Цитатка из Рихтера (глава про boxing/unboxing).

"Хотя неупакованные значимые типы не имеют указателя на типовой объект, вы все равно можете вызывать виртуальные методы (такие, как Equals, GetHashCode или ToString), унаследованные или переопределенные этим типом. Если ваш значимый тип переопределяет один из этих виртуальных методов, CLR может вызвать
метод не виртуально, потому что значимые типы неявно запечатываются и поэтому не могут выступать базовыми классами других типов. Кроме того, экземпляр значимого типа, используемый для вызова виртуального метода, не упаковывается.Но если ваше переопределение виртуального метода вызывает реализацию этого метода из базового типа, экземпляр значимого типа упаковывается при вызове реализации базового типа, чтобы в указателе this базового метода передавалась ссылка на объект в куче."

Т.е. меня интересует какой именно механизм в данном случае управляет тем, чтобы проверялось, что this указывает на объект в КУЧЕ? (ВТОРОЙ ВОПРОС)
так как this можно писать и в struct.

Или объяснение в том, что при вызове каждого экземплярного метода неявно передается ссылка this имеющая (или предполагается что имеет) соответствующие тип. К примеру если мы вызываем экземплярные методы на классе object, то предполагается что в this передается ссылка на экземпляр класса object и ПОЭТОМУ требуется упаковка... или как?
0
Лучшие ответы (1)
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
13.02.2016, 13:00
Ответы с готовыми решениями:

Дискуссия по поводу современных технологий в области веб-дизайна и верстки
Здравствуйте! У меня в процессе создания сайта на завершающей стадии возникли некоторые вопросы, или сомнения, как угодно. Я в этом деле...

Дискуссия
Вам даётся утверждение. Его надо отвергнуть или доказать. Пример: "......" Слоны летают ",,,,,," Нет. Летают птицы Просто...

Дискуссия по сокетам в Java
Интересная дискуссия: ...

5
 Аватар для m0nax
1274 / 975 / 113
Регистрация: 12.01.2010
Сообщений: 1,971
13.02.2016, 14:34
на счет передачи this в методы:

наши ЭВМ не знают никаких объектов/классов, там внизу нет никакого ООП, да и вообще холодно и сыро
есть только лента комманд, линейных, последовательных (хотя и есть прыжки вперед/назад по ленте)

класс это кучка данных, а не исполняемый код
кроме наших полей там всякие внутренние штуки вроде вирутальных таблиц методов, описание типа и т.п

а вот методы это уже код, но код этот ничего знать не знает про класс (лента комманд, никаких данных)
так вот чтоб рассказать методу что у него есть связанные с ним данные ему и передают ссылку на класс, т.е ссылку на кусок данных где-то в памяти
0
0 / 0 / 0
Регистрация: 26.09.2012
Сообщений: 87
13.02.2016, 18:01  [ТС]
Ну это примерно и было ясно. А что по второму вопросу?
0
Эксперт .NETАвтор FAQ
 Аватар для Storm23
10427 / 5157 / 1825
Регистрация: 11.01.2015
Сообщений: 6,226
Записей в блоге: 34
13.02.2016, 19:02
Лучший ответ Сообщение было отмечено kingass как решение

Решение

kingass, Не очень понятны ваш вопросы. Нужно формулировать точнее.
Цитата Сообщение от kingass Посмотреть сообщение
зачем нужен неявный параметр-ссылка this
This это указатель на объект. Дело в том, что методы класса существуют в единственном экземпляре. То есть код методов для всех объектов - один и тот же. Поэтому, что бы метод знал для какого именно объекта он вызывается - передается указатель this.
Цитата Сообщение от kingass Посмотреть сообщение
какой именно механизм в данном случае управляет тем, чтобы проверялось, что this указывает на объект в КУЧЕ
Тут вопрос совсем непонятен. Какая нам разница куда указывает this? Он указывает на область памяти, где лежит объект. Куча ли это или стек - не важно. Поэтому ничего там не проверяется.
Что касается значимых типов, то там тоже есть this. Только разница в том, что по адресу, куда указывает this лежит не объект, а поля структуры (то есть там есть только данные, служебных данных, типа ссылки на таблицу вирт. методов - нет).
Как определяется что this указывает на значимый тип? Ну так компилятор же заранее знает, что тип - значимый.

Цитата Сообщение от kingass Посмотреть сообщение
Но если ваше переопределение виртуального метода вызывает реализацию этого метода из базового типа, экземпляр значимого типа упаковывается при вызове реализации базового типа, чтобы в указателе this базового метода передавалась ссылка на объект в куче
А вот эта цитата из Рихтера непонятна. Про какие базовые типы он говорит, если значимые типы нельзя наследовать?
3
0 / 0 / 0
Регистрация: 26.09.2012
Сообщений: 87
13.02.2016, 23:42  [ТС]
This это указатель на объект. Дело в том, что методы класса существуют в единственном экземпляре. То есть код методов для всех объектов - один и тот же. Поэтому, что бы метод знал для какого именно объекта он вызывается - передается указатель this.
Тут ясно, спасибо. (только интересно вы до этого сами дошли или прочитали где? если прочитали то очень интересно где)

А про кучу я сделал акцент так как Рихтер сделал на нее акцент. Что, типа, в некоторых случаях требуется определить что ссылка this указывает в куче... т.е. он (может) думал что this и не на объект в куче может указывать и т.д. ну да ладно... ок

Про непонятную цитату из Рихтера: он имеет в виду базовый тип ValueType для структур в котором переопределен метод ToString().

p.s. к слову В Рихтере бывают грубейшие неточности к примеру, еще одна цитата:
"В этой главе обсуждаются разновидности методов, которые могут определяться
в типе, и разбирается ряд вопросов, касающихся методов. В частности, показано, как
определяются методы-конструкторы (создающие экземпляры типов и сами типы),
методы перегрузки операторов и методы преобразования (выполняющие явное и не-
явное приведение типов)."
0
 Аватар для nio
6050 / 3460 / 336
Регистрация: 14.06.2009
Сообщений: 8,136
Записей в блоге: 2
16.02.2016, 14:27
Цитата Сообщение от kingass Посмотреть сообщение
к слову В Рихтере бывают грубейшие неточности
довольно часто ошибки случаются не у автора, а у переводчика, когда переводчик не в теме того, что переводит. Это цитата из переведённой книги или из оригинала?
Лично видел перевод книги (что-то из разряда " C# для начинающих"), там с первой главы описания классов просто какая-то бессвязная ересь была написана. Для интереса взялся сравнивать с оригиналом на английском, и оказалось, что переводчик для слов field и property использовал одинаковый перевод - "свойство". Дальше я ту книгу не читал...
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
16.02.2016, 14:27
Помогаю со студенческими работами здесь

Дискуссия K/X/ubuntu, Debian
Я за OS Linux провёл довольно мало времени, а именно я работал с Ubuntu. Но вот наконец прищёл тот момент когда я решил поставить Linux для...

Дискуссия про Сетевое Оборудование
В данном треде только "Сетевое оборудование" и Средства коммуникации. И так давайте поговорим про сетевое оборудование не в общем формате. ...

Небольшая дискуссия. Закрытый код популярных игр
Занимаюсь созданием браузерных игр, и вот стал интересен вот такой вопрос: Возьму в качестве примера игру world of warcraft, т.к....

Стало появляться окно "Внимание! Запрашиваемая вами дискуссия не найдена"
При открытии страницы (в частности "http://ok.ru/" стало появляться неизвестное окно (см.приложение).

Как разместить драйвер устройства в Диспетчере устройств в разделе Системные устройства?
Здравствуйте! Можно ли ( если да, то как ? ) отредактировать имеющийся .inf файл от драйвера некого устройства, чтобы в Диспетчере...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
6
Ответ Создать тему
Новые блоги и статьи
SDL3 для Web (WebAssembly): Реализация движения на Box2D v3 - трение и коллизии с повёрнутыми стенами
8Observer8 20.02.2026
Содержание блога Box2D позволяет легко создать главного героя, который не проходит сквозь стены и перемещается с заданным трением о препятствия, которые можно располагать под углом, как верхнее. . .
Конвертировать закладки radiotray-ng в m3u-плейлист
damix 19.02.2026
Это можно сделать скриптом для PowerShell. Использование . \СonvertRadiotrayToM3U. ps1 <path_to_bookmarks. json> Рядом с файлом bookmarks. json появится файл bookmarks. m3u с результатом. # Check if. . .
Семь CDC на одном интерфейсе: 5 U[S]ARTов, 1 CAN и 1 SSI
Eddy_Em 18.02.2026
Постепенно допиливаю свою "многоинтерфейсную плату". Выглядит вот так: https:/ / www. cyberforum. ru/ blog_attachment. php?attachmentid=11617&stc=1&d=1771445347 Основана на STM32F303RBT6. На борту пять. . .
Камера Toupcam IUA500KMA
Eddy_Em 12.02.2026
Т. к. у всяких "хикроботов" слишком уж мелкий пиксель, для подсмотра в ESPriF они вообще плохо годятся: уже 14 величину можно рассмотреть еле-еле лишь на экспозициях под 3 секунды (а то и больше),. . .
И ясному Солнцу
zbw 12.02.2026
И ясному Солнцу, и светлой Луне. В мире покоя нет и люди не могут жить в тишине. А жить им немного лет.
«Знание-Сила»
zbw 12.02.2026
«Знание-Сила» «Время-Деньги» «Деньги -Пуля»
SDL3 для Web (WebAssembly): Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 12.02.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами и вызывать обработчики событий столкновения. . . .
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 11.02.2026
Содержание блога Библиотека SDL3 содержит встроенные инструменты для базовой работы с изображениями - без использования библиотеки SDL3_image. Пошагово создадим проект для загрузки изображения. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru