Модераторы: Partizan, gambit
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Что с объектом? 
:(
    Опции темы
Rohoss
Дата 18.4.2009, 09:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Начальник интернета
***


Профиль
Группа: Завсегдатай
Сообщений: 1308
Регистрация: 9.10.2006
Где: Matrix

Репутация: нет
Всего: 18



Хочу лучше понять, как работает .net, поэтому такой вопрос.
Что здесь происходит:
Код

            for (int i = 0; i < 10; i++)
            {
                int x = 3;
                x++;
            }

Вариан 1: Каждую итерацию цикла создаётся новый объект х типа int. Далее все эти объекты уничтожаются при сборке мусора.
Вариант 2: Создаётся один обет х типа int, и каждую итерацию он инициализируется новым значением.
С одной стороны объект, создан в одной итерации, невидим для другой, с другой стороны, создавая объект только раз, а далее присваиваем ему новые значения можно сэкономить. Так как же всё происходит на самом деле, во время выполнения приложения?



--------------------
Файловый менеджер Explorer.Net скачать  video
PM ICQ   Вверх
PashaPash
Дата 18.4.2009, 10:35 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1233
Регистрация: 3.1.2008

Репутация: 9
Всего: 49



Rohoss, 2-е, но с поправкой что объект не создается. int - value type. Под него один раз выделяется место в стеке. На кажодй итерации в выделенное место (оно же "переменная") записывается новое значение.


--------------------
PM MAIL WWW   Вверх
Rohoss
Дата 18.4.2009, 10:53 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Начальник интернета
***


Профиль
Группа: Завсегдатай
Сообщений: 1308
Регистрация: 9.10.2006
Где: Matrix

Репутация: нет
Всего: 18



Цитата(PashaPash @  18.4.2009,  10:35 Найти цитируемый пост)
Rohoss, 2-е, но с поправкой что объект не создается. int - value type.

Вроде как любой тип данных в .net наследуется от System.Object...


--------------------
Файловый менеджер Explorer.Net скачать  video
PM ICQ   Вверх
PashaPash
Дата 18.4.2009, 13:24 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 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) - не объект.


--------------------
PM MAIL WWW   Вверх
KelTron
Дата 19.4.2009, 05:37 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 745
Регистрация: 8.10.2006
Где: Красноярск

Репутация: 11
Всего: 38



Цитата(PashaPash @  18.4.2009,  13:24 Найти цитируемый пост)
Переменная типа int (value type) - не объект.


А что же это тогда? Переменная типа int  - объект, но объект размерного типа(value type), что означает, что память под него выделяется в стеке, а не в куче.

Это мне тоже как то непонятно:
Цитата(PashaPash @  18.4.2009,  10:35 Найти цитируемый пост)
 объект не создается


Ведь запись вида:
Код

int x = 3;

Это просто сокращённая версия:
Код

int x = new int();
x = 3;


По моему всё происходит по такому сценарию:

Каждую итерацию цикла:
1. создаётся новый объект х типа int в стеке и инициализируется значением
2. выполняется инкремент
3. при завершении блока операторов объект уничтожается.


--------------------
Тысячами незримых нитей обвивает тебя Закон. Разрубишь одну - преступник. Десять - смертник. Все - Бог.
Эвенгар Салладорский, основатель Школы Тьмы.
PM MAIL   Вверх
Partizan
Дата 19.4.2009, 09:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Let's do some .NET
****


Профиль
Группа: Модератор
Сообщений: 2828
Регистрация: 19.12.2005
Где: Санкт-Петербург

Репутация: 8
Всего: 67



Цитата

...
1. создаётся новый объект х типа int в стеке и инициализируется значением
...


KelTron, не-а...в стек просто кладётся константа 3 и всё...


--------------------
СУВ,
       Partizan.
PM MAIL WWW ICQ Skype GTalk Jabber   Вверх
KelTron
Дата 19.4.2009, 10:43 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 745
Регистрация: 8.10.2006
Где: Красноярск

Репутация: 11
Всего: 38



Хм...

А что в таком случае происходит здесь:

Код

int x = 1;
int y = 2;

x.CompareTo(y);


Для вызова метода переменная х должна быть объектом => должен создаться объект.

Это сообщение отредактировал(а) KelTron - 19.4.2009, 10:47


--------------------
Тысячами незримых нитей обвивает тебя Закон. Разрубишь одну - преступник. Десять - смертник. Все - Бог.
Эвенгар Салладорский, основатель Школы Тьмы.
PM MAIL   Вверх
mihryak
Дата 19.4.2009, 11:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 731
Регистрация: 28.4.2007
Где: С-Пб

Репутация: 10
Всего: 36



Цитата(KelTron @  19.4.2009,  11:43 Найти цитируемый пост)
А что в таком случае происходит здесь

boxing


Это сообщение отредактировал(а) mihryak - 19.4.2009, 11:48
PM MAIL ICQ   Вверх
PashaPash
Дата 19.4.2009, 20:22 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1233
Регистрация: 3.1.2008

Репутация: 9
Всего: 49



KelTron, я же специально процитировал спеку. Не веришь - посмотри il:
Код

...
  .entrypoint
  // Code size       11 (0xb)
  .maxstack  1
  .locals init ([0] int32 x)
  IL_0000:  ldc.i4.0 // int x = new int();
  IL_0001:  stloc.0
  IL_0002:  ldc.i4.3 // x = 3
  IL_0003:  stloc.0
...



--------------------
PM MAIL WWW   Вверх
KelTron
Дата 20.4.2009, 06:05 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 745
Регистрация: 8.10.2006
Где: Красноярск

Репутация: 11
Всего: 38



mihryak, полезная статья, но всё же в том примере, что я привёл никакого boxing не происходит. 

Код

...
    .entrypoint
    .maxstack 2
    .locals init (
        [0] int32 x,
        [1] int32 y)
    L_0000: nop 
    L_0001: ldc.i4.1 
    L_0002: stloc.0 
    L_0003: ldc.i4.2 
    L_0004: stloc.1 
    L_0005: ldloca.s x
    L_0007: ldloc.1 
    L_0008: call instance int32 [mscorlib]System.Int32::CompareTo(int32)
...


Из этой же статьи:
Цитата

По смыслу, boxing – это операция приведения к базовому типу (к object’у).

Никакого преобразования к базовому типу в данном примере нет. 

Так вот интересно как происходит вызов метода, если никакого объекта нету. Хотя судя по IL здесь вызывается метод 
именно объекта: call instance.

С этим тоже какая то несостыковка:
Цитата

Сначала в heap’е создаётся специальный объект ссылочного типа (box) в который копируется содержимое исходного объекта value-типа.

Тут говорится именно про "содержимое исходного объекта".

PashaPash, с созданием переменной value type всё понятно (объекта нет), но что с вызовом метода?


--------------------
Тысячами незримых нитей обвивает тебя Закон. Разрубишь одну - преступник. Десять - смертник. Все - Бог.
Эвенгар Салладорский, основатель Школы Тьмы.
PM MAIL   Вверх
PashaPash
Дата 20.4.2009, 10:18 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1233
Регистрация: 3.1.2008

Репутация: 9
Всего: 49



KelTron, в msdn вообще хватает несостыковок smile
Цитата(KelTron @  20.4.2009,  06:05 Найти цитируемый пост)
Так вот интересно как происходит вызов метода, если никакого объекта нету. Хотя судя по IL здесь вызывается метод 
именно объекта: call instance.

По il там вызывается "method indicated by the passed method descriptor". Instance - значит метод вызывается у экземпляра типа (!= объект). Экземпляр передается через стек -  ldloca.s x. Вызывающий код знает, что туда надо положить значение int32. Вызываемый знает что в стеке будет лежать this - значение int32.



--------------------
PM MAIL WWW   Вверх
KelTron
Дата 20.4.2009, 13:43 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 745
Регистрация: 8.10.2006
Где: Красноярск

Репутация: 11
Всего: 38



Цитата(PashaPash @  20.4.2009,  10:18 Найти цитируемый пост)
у экземпляра типа (!= объект)

 smile 

Я думаю я успокою себя тем, что буду думать, что это магия..))


--------------------
Тысячами незримых нитей обвивает тебя Закон. Разрубишь одну - преступник. Десять - смертник. Все - Бог.
Эвенгар Салладорский, основатель Школы Тьмы.
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Прежде чем создать тему, посмотрите сюда:
Partizan
PashaPash

Используйте теги [code=csharp][/code] для подсветки кода. Используйтe чекбокс "транслит" если у Вас нет русских шрифтов.
Что делать если Вам помогли, но отблагодарить помощника плюсом в репутацию Вы не можете(не хватает сообщений)? Пишите сюда, или отправляйте репорт. Поставим :)
Так же не забывайте отмечать свой вопрос решенным, если он таковым является :)


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, mr.DUDA, Partizan, PashaPash.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | .NET для новичков | Следующая тема »


 




[ Время генерации скрипта: 0.0687 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.