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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Значимые и ссылочные типы данных 
:(
    Опции темы
Idsa
Дата 23.1.2007, 23:33 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

Репутация: 14
Всего: 62



Тип int  - значимый тип данных, соответственно и переменные этого типа хранятся в стеке. Меня интересует, каким типом (значимым или ссылочным) является интовый массив, ну и соответственно, где будет хранитсья объект int[] a (в куче или стеке):
int a - значимый
int[] a - ?


--------------------
Мой блог: alexidsa.blogspot.com
PM MAIL ICQ   Вверх
Дрон
Дата 23.1.2007, 23:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Java-ненавистник :)
****


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

Репутация: 24
Всего: 93



Ссылочный, а следовательно:

1) память под элементы массива выделяется в куче, а не на стеке
2) ему можно присвоить значение null  ( int[] a = null; )

ну и к тому же все массивы, являются производными от класса System.Array, хотя и неявно.

Это сообщение отредактировал(а) Дрон - 23.1.2007, 23:48


--------------------
Да. Именно так.
PM   Вверх
Idsa
Дата 24.1.2007, 04:25 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

Репутация: 14
Всего: 62



Дрон, спасибо.
Это что-то меня ночью вдруг очень заинтересовал этот вопрос, а утром проснулся и понял, что ответ-то очевиденsmile Не зря говорят утро вечера мудренее...smile

Добавлено @ 04:34 
А кстати, корректно ли переводить value type как значимый? А то вон в Троелсене-то вообще переводится "типы, характеризуемые значениями".


--------------------
Мой блог: alexidsa.blogspot.com
PM MAIL ICQ   Вверх
Дрон
Дата 24.1.2007, 10:28 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Java-ненавистник :)
****


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

Репутация: 24
Всего: 93



Цитата(Idsa @  24.1.2007,  04:25 Найти цитируемый пост)
А кстати, корректно ли переводить value type как значимый

Вообще слух немного режет, но как правильней -- не знаю. Надо в МСДН на русском поискать.


--------------------
Да. Именно так.
PM   Вверх
Idsa
Дата 24.1.2007, 13:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

Репутация: 14
Всего: 62



В русском MSDN'e используется термин "типы значений". Тоже не очень красиво smile


--------------------
Мой блог: alexidsa.blogspot.com
PM MAIL ICQ   Вверх
ivashkanet
Дата 24.1.2007, 14:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Кодю потиху
****


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

Репутация: 47
Всего: 149



Цитата(Idsa @  24.1.2007,  12:58 Найти цитируемый пост)
В русском MSDN'e используется термин "типы значений". Тоже не очень красиво

А какая разница? Тут не капитан Врунгель "Как вы лодку назовете, так она и поплывет" smile

Тут, как не назови --- будет работать smile


P.S. Я называю ссылочные и значимые типы smile
PM MAIL WWW ICQ   Вверх
anonym
Дата 24.1.2007, 14:27 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



А такой вопрос. Структура по идее хранится в стеке. А что если одно из полей структуры будет к примеру массив? Правильно ли я понимаю, что если у нас есть структура
Код

struct MyType
{
    public int[,] Data;
    public int x;
}

то в стеке хранится значение х, а так же адрес первого элемента массива, хранящегося в куче?
PM MAIL   Вверх
ivashkanet
Дата 24.1.2007, 14:34 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Кодю потиху
****


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

Репутация: 47
Всего: 149



Цитата(anonym @  24.1.2007,  13:27 Найти цитируемый пост)
то в стеке хранится значение х, а так же адрес первого элемента массива, хранящегося в куче?

Ага, только вот не уверен насчет "адреса первого элемента". 
Мало ли как они там хранят эти данные smile 
Это не рассказывается 
PM MAIL WWW ICQ   Вверх
Idsa
Дата 24.1.2007, 15:13 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

Репутация: 14
Всего: 62



Цитата(ivashkanet @  24.1.2007,  14:23 Найти цитируемый пост)
P.S. Я называю ссылочные и значимые типы 

Нас как минимум двое smile

Цитата(ivashkanet @  24.1.2007,  14:34 Найти цитируемый пост)
Ага, только вот не уверен насчет "адреса первого элемента". Мало ли как они там хранят эти данные 

Ну а как иначе-то? Думаю, anonym прав.


--------------------
Мой блог: alexidsa.blogspot.com
PM MAIL ICQ   Вверх
ivashkanet
Дата 24.1.2007, 15:22 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Кодю потиху
****


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

Репутация: 47
Всего: 149



Цитата(Idsa @  24.1.2007,  14:13 Найти цитируемый пост)
Ну а как иначе-то?

Как-нибудь smile
Цитата(Idsa @  24.1.2007,  14:13 Найти цитируемый пост)
Думаю, anonym прав.

Я тоже так думаю, но утверждать не берусь 
PM MAIL WWW ICQ   Вверх
anonym
Дата 29.1.2007, 23:34 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Что-то я не въехал в одну вещь. Прочитал в Троелсене
В главе 2 рассказывалось о том, что в классе System.Object определен метод МеmberwiseClone(). Этот метод используется для специального типа копирования объекта — когда реальное копирование не происходит, а вместо этого создается еще одна ссылка на область оперативной памяти, занимаемую данным объектом. Для такого типа копирования используется специальный термин — «поверхностное копирование» (shallow сору). Пользователи объектов не вызывают метод MemberwiseClone() напрямую — он вызывается автоматически, когда к объектам ссылочного типа применяется оператор назначения (=), то есть одна ссылка начинает указывать на ту же область оперативной памяти, что и другая.
Пример из msdn-a.
Код

using System;

class MyBaseClass
{
    public static string CompanyName = "My Company";
    public int age;
    public string name;
}

class MyDerivedClass : MyBaseClass
{
    static void Main()
    {
        MyDerivedClass m1 = new MyDerivedClass();
        m1.age = 42;
        m1.name = "Sam";
        
        MyDerivedClass m2 = (MyDerivedClass)m1.MemberwiseClone();
        m1.age = 50;
        
        MyDerivedClass m3 = new MyDerivedClass();
        m3.age = 42;
        m3.name = "Sam";
        
        MyDerivedClass m4 = m3;
        m3.age = 50;
        
        Console.WriteLine(m2.age);
        Console.WriteLine(m4.age);
    }
}

Тогда, если при выполнении оператора = вызывается данный метод, должны вывестись одинаковые строки. Но выводит 42 и 50. Почему так?
PM MAIL   Вверх
mr.DUDA
Дата 29.1.2007, 23:45 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


3D-маньяк
****


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

Репутация: 110
Всего: 232



Цитата(anonym @  24.1.2007,  13:27 Найти цитируемый пост)
А такой вопрос. Структура по идее хранится в стеке. А что если одно из полей структуры будет к примеру массив? Правильно ли я понимаю, что если у нас есть структура

Цитата(anonym @  24.1.2007,  13:27 Найти цитируемый пост)
то в стеке хранится значение х, а так же адрес первого элемента массива, хранящегося в куче?

Если есть структура, поле которой - ссылочный тип, то в структуре будет некий адрес, не обязательно совпадающий с адресом первого элемента массива. Первый элемент можно получить из Marshal.UnsafeAddrOfPinnedArrayElement.

Цитата(anonym @  29.1.2007,  22:34 Найти цитируемый пост)
Тогда, если при выполнении оператора = вызывается данный метод, должны вывестись одинаковые строки. Но выводит 42 и 50. Почему так?

Глядя на пример, всё правильно выводит.


--------------------
user posted image
PM MAIL WWW   Вверх
anonym
Дата 30.1.2007, 09:42 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Цитата(mr.DUDA @  29.1.2007,  23:45 Найти цитируемый пост)
Глядя на пример, всё правильно выводит. 

Так если у нас m1 и m2 ссылаются на одну область оперативной памяти, когда меняем m1.age на 50, m2.age тоже должно изменится на 50... Короче так же, как и в простом присваивании m4 = m3... Что я неправильно понимаю?...  smile 

Это сообщение отредактировал(а) anonym - 30.1.2007, 09:44
PM MAIL   Вверх
ivashkanet
Дата 30.1.2007, 10:32 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Кодю потиху
****


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

Репутация: 47
Всего: 149



Цитата(anonym @  29.1.2007,  22:34 Найти цитируемый пост)
МеmberwiseClone(). Этот метод используется для специального типа копирования объекта — когда реальное копирование не происходит, а вместо этого создается еще одна ссылка на область оперативной памяти, занимаемую данным объектом. Для такого типа копирования используется специальный термин — «поверхностное копирование» (shallow сору).

Не знаю где ты такое взял, но по моим сведениям МеmberwiseClone() делает копию объекта, но не глубокую (shalllow). Т.е. если у объекта есть поля-ссылки, то там будет только копия ссылки. В отличии от Deep Copy когда создается полная копия дерева объекта.
Цитата(MSDN)

Remarks
The MemberwiseClone method creates a shallow copy by creating a new object, and then copying the nonstatic fields of the current object to the new object. If a field is a value type, a bit-by-bit copy of the field is performed. If a field is a reference type, the reference is copied but the referred object is not; therefore, the original object and its clone refer to the same object.

For example, consider an object called X that references objects A and B. Object B, in turn, references object C. A shallow copy of X creates new object X2 that also references objects A and B. In contrast, a deep copy of X creates a new object X2 that references the new objects A2 and B2, which are copies of A and B. B2, in turn, references the new object C2, which is a copy C. Use a class that implements the ICloneable interface to perform a deep or shallow copy of an object. 


Пример:
Код

        [STAThread]
        static void Main(string[] args)
        {
            MyClass o1 = new MyClass();
            MyClass o2 = o1.GetShallowCopy(o1);

            if (o1.Equals(o2))
            {
                Console.WriteLine("Ссылки на объекты совпадают");
            }
            else
            {
                Console.WriteLine("Ссылки на объекты не совпадают");
            }
            Console.ReadKey();
        }
        class MyClass
        {
            public static string CompanyName = "My Company";
            public int age;
            public string name;
            public MyClass GetShallowCopy(MyClass o)
            {
                return (MyClass)o.MemberwiseClone();
            }
        }

PM MAIL WWW ICQ   Вверх
anonym
Дата 30.1.2007, 11:18 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Цитата(ivashkanet @  30.1.2007,  10:32 Найти цитируемый пост)
Не знаю где ты такое взял

Троелсен жжёт...
Троелсен. Э. С# и платформа .NET. Библиотека программиста. — СПб.: Питер, 2004. —796 с. ISBN 5-318-00750-3 страница 212  smile 

Короче, из вышесказанного, как я понял, следует, что метод MemberwiseClone() и знак = равноправны только в том случае, если все поля объекта - ссылочные. Правильно я понял?

PM MAIL   Вверх
Страницы: (3) Все [1] 2 3 
Ответ в темуСоздание новой темы Создание опроса
Прежде чем создать тему, посмотрите сюда:
mr.DUDA
THandle

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


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

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


 




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


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

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