![]() |
|
Модераторы: Partizan, gambit |
![]()
|
|
| Rohoss |
|
|||
![]() Начальник интернета ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1308 Регистрация: 9.10.2006 Где: Matrix Репутация: нет Всего: 18 |
Хочу лучше понять, как работает .net, поэтому такой вопрос.
Что здесь происходит:
Вариан 1: Каждую итерацию цикла создаётся новый объект х типа int. Далее все эти объекты уничтожаются при сборке мусора. Вариант 2: Создаётся один обет х типа int, и каждую итерацию он инициализируется новым значением. С одной стороны объект, создан в одной итерации, невидим для другой, с другой стороны, создавая объект только раз, а далее присваиваем ему новые значения можно сэкономить. Так как же всё происходит на самом деле, во время выполнения приложения? |
|||
|
||||
| PashaPash |
|
|||
|
Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1233 Регистрация: 3.1.2008 Репутация: 9 Всего: 49 |
Rohoss, 2-е, но с поправкой что объект не создается. int - value type. Под него один раз выделяется место в стеке. На кажодй итерации в выделенное место (оно же "переменная") записывается новое значение.
|
|||
|
||||
| Rohoss |
|
|||
![]() Начальник интернета ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1308 Регистрация: 9.10.2006 Где: Matrix Репутация: нет Всего: 18 |
||||
|
||||
| PashaPash |
|
|||
|
Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1233 Регистрация: 3.1.2008 Репутация: 9 Всего: 49 |
Rohoss, вот придирчивый.
Спецификация Ecma-225, Common Language Infrastructure (CLI) 8.2.3 Classes, interfaces, and objects For some values, called objects, it is always possible to determine the exact type from the value. Exact types of objects are also called object types. Objects are values of reference types, but not all reference types describe objects. Переменная типа int (value type) - не объект. |
|||
|
||||
| KelTron |
|
||||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 745 Регистрация: 8.10.2006 Где: Красноярск Репутация: 11 Всего: 38 |
А что же это тогда? Переменная типа int - объект, но объект размерного типа(value type), что означает, что память под него выделяется в стеке, а не в куче. Это мне тоже как то непонятно: Ведь запись вида:
Это просто сокращённая версия:
По моему всё происходит по такому сценарию: Каждую итерацию цикла: 1. создаётся новый объект х типа int в стеке и инициализируется значением 2. выполняется инкремент 3. при завершении блока операторов объект уничтожается. -------------------- Тысячами незримых нитей обвивает тебя Закон. Разрубишь одну - преступник. Десять - смертник. Все - Бог. Эвенгар Салладорский, основатель Школы Тьмы. |
||||
|
|||||
| Partizan |
|
|||
![]() Let's do some .NET ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 2828 Регистрация: 19.12.2005 Где: Санкт-Петербург Репутация: 8 Всего: 67 |
KelTron, не-а...в стек просто кладётся константа 3 и всё... -------------------- СУВ, Partizan. |
|||
|
||||
| KelTron |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 745 Регистрация: 8.10.2006 Где: Красноярск Репутация: 11 Всего: 38 |
Хм...
А что в таком случае происходит здесь:
Для вызова метода переменная х должна быть объектом => должен создаться объект. Это сообщение отредактировал(а) KelTron - 19.4.2009, 10:47 -------------------- Тысячами незримых нитей обвивает тебя Закон. Разрубишь одну - преступник. Десять - смертник. Все - Бог. Эвенгар Салладорский, основатель Школы Тьмы. |
|||
|
||||
| mihryak |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 731 Регистрация: 28.4.2007 Где: С-Пб Репутация: 10 Всего: 36 |
||||
|
||||
| PashaPash |
|
|||
|
Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1233 Регистрация: 3.1.2008 Репутация: 9 Всего: 49 |
KelTron, я же специально процитировал спеку. Не веришь - посмотри il:
|
|||
|
||||
| KelTron |
|
||||||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 745 Регистрация: 8.10.2006 Где: Красноярск Репутация: 11 Всего: 38 |
mihryak, полезная статья, но всё же в том примере, что я привёл никакого boxing не происходит.
Из этой же статьи:
Никакого преобразования к базовому типу в данном примере нет. Так вот интересно как происходит вызов метода, если никакого объекта нету. Хотя судя по IL здесь вызывается метод именно объекта: call instance. С этим тоже какая то несостыковка:
Тут говорится именно про "содержимое исходного объекта". PashaPash, с созданием переменной value type всё понятно (объекта нет), но что с вызовом метода? -------------------- Тысячами незримых нитей обвивает тебя Закон. Разрубишь одну - преступник. Десять - смертник. Все - Бог. Эвенгар Салладорский, основатель Школы Тьмы. |
||||||
|
|||||||
| PashaPash |
|
|||
|
Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1233 Регистрация: 3.1.2008 Репутация: 9 Всего: 49 |
KelTron, в msdn вообще хватает несостыковок
По il там вызывается "method indicated by the passed method descriptor". Instance - значит метод вызывается у экземпляра типа (!= объект). Экземпляр передается через стек - ldloca.s x. Вызывающий код знает, что туда надо положить значение int32. Вызываемый знает что в стеке будет лежать this - значение int32. |
|||
|
||||
| KelTron |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 745 Регистрация: 8.10.2006 Где: Красноярск Репутация: 11 Всего: 38 |
Я думаю я успокою себя тем, что буду думать, что это магия..)) -------------------- Тысячами незримых нитей обвивает тебя Закон. Разрубишь одну - преступник. Десять - смертник. Все - Бог. Эвенгар Салладорский, основатель Школы Тьмы. |
|||
|
||||
![]()
|
| Прежде чем создать тему, посмотрите сюда: | |
|
|
Используйте теги [code=csharp][/code] для подсветки кода. Используйтe чекбокс "транслит" если у Вас нет русских шрифтов. Что делать если Вам помогли, но отблагодарить помощника плюсом в репутацию Вы не можете(не хватает сообщений)? Пишите сюда, или отправляйте репорт. Поставим :) Так же не забывайте отмечать свой вопрос решенным, если он таковым является :) Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, mr.DUDA, Partizan, PashaPash. |
| 0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
| 0 Пользователей: | |
| « Предыдущая тема | .NET для новичков | Следующая тема » |
|
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |