Извините, ничего не найдено.

Не расстраивайся! Лучше выпей чайку!
Регистрация
Справка
Календарь

Вернуться   forum.boolean.name > Программирование игр для компьютеров > С#

С# Средство разработки на платформе .Net

Ответ
 
Опции темы
Старый 19.05.2012, 01:10   #1
radiobutton
Бывалый
 
Регистрация: 16.09.2011
Сообщений: 863
Написано 257 полезных сообщений
(для 546 пользователей)
Array.ConstrainedCopy

из шилдта:



Написал код.
            int[] a = { 1, 2, 3, 4, 5 };
            int[] b = { 6, 7, 8, 9, 0 };

            Array.ConstrainedCopy(a, 1, b, 2, 3);
            // a[2] = 0;
            foreach(var i in a) Console.Write(i);
            Console.WriteLine();
            foreach(var i in b) Console.Write(i);
            Console.WriteLine();
            Console.Read();
Выводит следующее:
12345
67234
Раскоментируем // a[2] = 0;, выводит следующее:
12045
67234
почему он не выводит ?
12045
67204
Ведь ссылочный тип одинаков у обоих массивов - int[]. И они должны ссылаться на одни и теже элементы после копирования.

И чем Array.ConstrainedCopy отличается от перегруженного Array.Copy с сигнатурой аналогичной сигнатуре метода ConstrainedCopy. (Только тем, что в случае неудачного копирования при использовании метода ConstrainedCopy у массива в который копировали не будит изменений?)
(Offline)
 
Ответить с цитированием
Старый 19.05.2012, 01:52   #2
moka
.
 
Регистрация: 05.08.2006
Сообщений: 10,429
Написано 3,454 полезных сообщений
(для 6,863 пользователей)
Ответ: Array.ConstrainedCopy

Числа - копируются полностью, а не ссылки на них.
Даже если у тебя в массиве был бы указатель на объект, всё что ты делаешь, то обнуляешь по индексу в данном массиве данное.

Если ты хочешь чтобы данное обновилось и во втором массиве, то создай объект содержащий число, и заместо приравнивания элемента к нулю, приравнивай значение объекта к нулю.
Далее ссылка на объект в первом и втором массиве будет одна и та же, и изменив значение, оно будет в обоих изменено.

Ты копируешь значения, а не указатели на значения.
Я не использовал эти функции (как-то не приходилось), но судя по твоему описанию, то ConstrainedCopy - это транзакционная операция, которая при неудаче вернёт всё как оно было.
(Offline)
 
Ответить с цитированием
Сообщение было полезно следующим пользователям:
radiobutton (19.05.2012)
Старый 19.05.2012, 01:59   #3
radiobutton
Бывалый
 
Регистрация: 16.09.2011
Сообщений: 863
Написано 257 полезных сообщений
(для 546 пользователей)
Ответ: Array.ConstrainedCopy

Сообщение от MoKa Посмотреть сообщение
Числа - копируются полностью, а не ссылки на них.
Даже если у тебя в массиве был бы указатель на объект, всё что ты делаешь, то обнуляешь по индексу в данном массиве данное.

Если ты хочешь чтобы данное обновилось и во втором массиве, то создай объект содержащий число, и заместо приравнивания элемента к нулю, приравнивай значение объекта к нулю.
Далее ссылка на объект в первом и втором массиве будет одна и та же, и изменив значение, оно будет в обоих изменено.

Ты копируешь значения, а не указатели на значения.
Я не использовал эти функции (как-то не приходилось), но судя по твоему описанию, то ConstrainedCopy - это транзакционная операция, которая при неудаче вернёт всё как оно было.
но все равно остается непонятным, что такое "неполная копия" при одинаковых ссылочных типах массивов. =(
(Offline)
 
Ответить с цитированием
Старый 19.05.2012, 02:01   #4
moka
.
 
Регистрация: 05.08.2006
Сообщений: 10,429
Написано 3,454 полезных сообщений
(для 6,863 пользователей)
Ответ: Array.ConstrainedCopy

Что значит "ссылочных" типах массивов?

Массив содержит числа. Каждое число имеет указатель.
Что ты делаешь - копируешь сами числа, а не указатели на данные.
Таким образом второй массив содержит ничем не связанные данные с первым.
Копии же, ты же КОПИРУЕШЬ сами данные.
(Offline)
 
Ответить с цитированием
Старый 19.05.2012, 02:31   #5
radiobutton
Бывалый
 
Регистрация: 16.09.2011
Сообщений: 863
Написано 257 полезных сообщений
(для 546 пользователей)
Ответ: Array.ConstrainedCopy

Сообщение от MoKa Посмотреть сообщение
Что значит "ссылочных" типах массивов?

Массив содержит числа. Каждое число имеет указатель.
Что ты делаешь - копируешь сами числа, а не указатели на данные.
Таким образом второй массив содержит ничем не связанные данные с первым.
Копии же, ты же КОПИРУЕШЬ сами данные.
ну массивы в c# это ссылочные типы.

вот чо нашел.

попробовал следующий код:
            int[] a = { 1, 2, 3,4,5};
            object ob = a.Clone();
            int[] b = (int[])ob;
            a[0] = 0;
            int[] c = (int[])ob;            
            
            foreach(var i in a) Console.Write(i);
            Console.WriteLine();
            foreach (var i in b) Console.Write(i);
            Console.WriteLine();
            foreach (var i in c) Console.Write(i);
            Console.WriteLine();
выводит:
02345
12345
12345

Тоесть object ob не ссылается на тот же самый массив. Он создает его копию. Короче хз чо думать =)
(Offline)
 
Ответить с цитированием
Старый 19.05.2012, 02:48   #6
moka
.
 
Регистрация: 05.08.2006
Сообщений: 10,429
Написано 3,454 полезных сообщений
(для 6,863 пользователей)
Ответ: Array.ConstrainedCopy

ЧИСЛА НЕ УКАЗАТЕЛИ!

Если ты засунешь туда объекты, то будут копии указателей на объекты, а объект останется одним и тем же.
ЧИСЛА - это простые данные, присваивание к ним данных, или присваивание чисел к числам - не операции с указателем, а операции с самими данными.

Засунь туда объект, и сделай снова свой эксперимент.
(Offline)
 
Ответить с цитированием
Сообщение было полезно следующим пользователям:
radiobutton (19.05.2012)
Старый 19.05.2012, 02:56   #7
radiobutton
Бывалый
 
Регистрация: 16.09.2011
Сообщений: 863
Написано 257 полезных сообщений
(для 546 пользователей)
Ответ: Array.ConstrainedCopy

Сообщение от MoKa Посмотреть сообщение
ЧИСЛА НЕ УКАЗАТЕЛИ!

Если ты засунешь туда объекты, то будут копии указателей на объекты, а объект останется одним и тем же.
ЧИСЛА - это простые данные, присваивание к ним данных, или присваивание чисел к числам - не операции с указателем, а операции с самими данными.

Засунь туда объект, и сделай снова свой эксперимент.
да я вкурсе что числа это данные. Ща проверю с объектами.

    class lol
    {
        public int x { get; set; }
        public lol(int p)
        { x = p; }
    }
    class TestClass
    {
        static void Main()
        {
            lol[] a = { new lol(1), new lol(2), new lol(3)};
            object ob = a.Clone();
            lol[] b = (lol[])ob;
            b[0].x = 0;
            foreach(var i in a) Console.Write(i.x);
            Console.WriteLine();
            foreach (var i in b) Console.Write(i.x);
            Console.WriteLine();
        }        
    }
012
012

Терь все понятно.=)
Массивы содержат в каждой ячейке какой то объект. Но Для массивов типов значений (int[] итд), Этот объект является значением. Он и копируется, но дальше никуда не ссылается.
А для массивов состоящих из элементов ссылочного типа. Копируется в объекте их адрес. И он ссылается уже на элементы. Которые и являются общими. А для типов значений эти элементы не могут быть общими потому что там вместо адреса само значение.

Наверное ты мне это и пытался объяснить с первого поста. xD
(Offline)
 
Ответить с цитированием
Старый 19.05.2012, 03:26   #8
moka
.
 
Регистрация: 05.08.2006
Сообщений: 10,429
Написано 3,454 полезных сообщений
(для 6,863 пользователей)
Ответ: Array.ConstrainedCopy

Наверное.

В общем это и есть различие между struct и class.
int - value type, lol - reference type.

От сюда: http://msdn.microsoft.com/en-us/libr...=vs.71%29.aspx
Unlike C++, you cannot declare a class using the keyword struct. In C#, classes and structs are semantically different. A struct is a value type, while a class is a reference type. For more information on the features of value types, see Value Types.
И ещё: http://msdn.microsoft.com/en-us/library/saxz13w4.aspx
(Offline)
 
Ответить с цитированием
Старый 19.05.2012, 03:30   #9
radiobutton
Бывалый
 
Регистрация: 16.09.2011
Сообщений: 863
Написано 257 полезных сообщений
(для 546 пользователей)
Ответ: Array.ConstrainedCopy

Сообщение от MoKa Посмотреть сообщение
Наверное.

В общем это и есть различие между struct и class.
int - value type, lol - reference type.

От сюда: http://msdn.microsoft.com/en-us/libr...=vs.71%29.aspx

И ещё: http://msdn.microsoft.com/en-us/library/saxz13w4.aspx
я знаю что такое типы значений и ссылочные типы.

Мне было непонятно что и куда конкретно копируется. И как массивы хранят свои значения. Теперь все прояснилось.
(Offline)
 
Ответить с цитированием
Старый 19.05.2012, 08:10   #10
pax
Unity/C# кодер
 
Аватар для pax
 
Регистрация: 03.10.2005
Адрес: Россия, Рязань
Сообщений: 7,568
Написано 3,006 полезных сообщений
(для 5,323 пользователей)
Ответ: Array.ConstrainedCopy

А трудно было прочитать в справке:
Array.ConstrainedCopy - метод

Копирует диапазон элементов из массива Array, начиная с заданного индекса источника, и вставляет его в другой массив Array, начиная с заданного индекса назначения. Гарантирует, что в случае невозможности успешно скопировать весь диапазон, все изменения будут отменены.

...

Массивы, определенные параметрами sourceArray и destinationArray, должны иметь одинаковую размерность.

...

В отличие от перегрузки Copy метод ConstrainedCopy перед выполнением операции проверяет совместимость типов массива.
http://msdn.microsoft.com/ru-ru/libr...ainedcopy.aspx
__________________
Blitz3d to Unity Wiki
(Offline)
 
Ответить с цитированием
Сообщение было полезно следующим пользователям:
radiobutton (19.05.2012)
Ответ


Опции темы

Ваши права в разделе
Вы не можете создавать темы
Вы не можете отвечать на сообщения
Вы не можете прикреплять файлы
Вы не можете редактировать сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.


Часовой пояс GMT +4, время: 03:01.


vBulletin® Version 3.6.5.
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
Перевод: zCarot
Style crйe par Allan - vBulletin-Ressources.com