forum.boolean.name

forum.boolean.name (http://forum.boolean.name/index.php)
-   С# (http://forum.boolean.name/forumdisplay.php?f=128)
-   -   Array.ConstrainedCopy (http://forum.boolean.name/showthread.php?t=16805)

radiobutton 19.05.2012 01:10

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 у массива в который копировали не будит изменений?)

moka 19.05.2012 01:52

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

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

Ты копируешь значения, а не указатели на значения.
Я не использовал эти функции (как-то не приходилось), но судя по твоему описанию, то ConstrainedCopy - это транзакционная операция, которая при неудаче вернёт всё как оно было.

radiobutton 19.05.2012 01:59

Ответ: Array.ConstrainedCopy
 
Цитата:

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

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

Ты копируешь значения, а не указатели на значения.
Я не использовал эти функции (как-то не приходилось), но судя по твоему описанию, то ConstrainedCopy - это транзакционная операция, которая при неудаче вернёт всё как оно было.

но все равно остается непонятным, что такое "неполная копия" при одинаковых ссылочных типах массивов. =(

moka 19.05.2012 02:01

Ответ: Array.ConstrainedCopy
 
Что значит "ссылочных" типах массивов?

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

radiobutton 19.05.2012 02:31

Ответ: Array.ConstrainedCopy
 
Цитата:

Сообщение от MoKa (Сообщение 228187)
Что значит "ссылочных" типах массивов?

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

ну массивы в 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 не ссылается на тот же самый массив. Он создает его копию. Короче хз чо думать =)

moka 19.05.2012 02:48

Ответ: Array.ConstrainedCopy
 
ЧИСЛА НЕ УКАЗАТЕЛИ!

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

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

radiobutton 19.05.2012 02:56

Ответ: Array.ConstrainedCopy
 
Цитата:

Сообщение от MoKa (Сообщение 228190)
ЧИСЛА НЕ УКАЗАТЕЛИ!

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

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

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

Код:

    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

moka 19.05.2012 03:26

Ответ: 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

radiobutton 19.05.2012 03:30

Ответ: Array.ConstrainedCopy
 
Цитата:

Сообщение от MoKa (Сообщение 228192)
Наверное.

В общем это и есть различие между 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

я знаю что такое типы значений и ссылочные типы.:)

Мне было непонятно что и куда конкретно копируется. И как массивы хранят свои значения. Теперь все прояснилось.

pax 19.05.2012 08:10

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

Array.ConstrainedCopy - метод

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

...

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

...

В отличие от перегрузки Copy метод ConstrainedCopy перед выполнением операции проверяет совместимость типов массива.
http://msdn.microsoft.com/ru-ru/libr...ainedcopy.aspx


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

vBulletin® Version 3.6.5.
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
Перевод: zCarot