|
С# Средство разработки на платформе .Net |
19.05.2012, 01:10
|
#1
|
Бывалый
Регистрация: 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
|
.
Регистрация: 05.08.2006
Сообщений: 10,429
Написано 3,454 полезных сообщений (для 6,863 пользователей)
|
Ответ: Array.ConstrainedCopy
Числа - копируются полностью, а не ссылки на них.
Даже если у тебя в массиве был бы указатель на объект, всё что ты делаешь, то обнуляешь по индексу в данном массиве данное.
Если ты хочешь чтобы данное обновилось и во втором массиве, то создай объект содержащий число, и заместо приравнивания элемента к нулю, приравнивай значение объекта к нулю.
Далее ссылка на объект в первом и втором массиве будет одна и та же, и изменив значение, оно будет в обоих изменено.
Ты копируешь значения, а не указатели на значения.
Я не использовал эти функции (как-то не приходилось), но судя по твоему описанию, то ConstrainedCopy - это транзакционная операция, которая при неудаче вернёт всё как оно было.
|
(Offline)
|
|
Сообщение было полезно следующим пользователям:
|
|
19.05.2012, 01:59
|
#3
|
Бывалый
Регистрация: 16.09.2011
Сообщений: 863
Написано 257 полезных сообщений (для 546 пользователей)
|
Ответ: Array.ConstrainedCopy
Сообщение от MoKa
Числа - копируются полностью, а не ссылки на них.
Даже если у тебя в массиве был бы указатель на объект, всё что ты делаешь, то обнуляешь по индексу в данном массиве данное.
Если ты хочешь чтобы данное обновилось и во втором массиве, то создай объект содержащий число, и заместо приравнивания элемента к нулю, приравнивай значение объекта к нулю.
Далее ссылка на объект в первом и втором массиве будет одна и та же, и изменив значение, оно будет в обоих изменено.
Ты копируешь значения, а не указатели на значения.
Я не использовал эти функции (как-то не приходилось), но судя по твоему описанию, то ConstrainedCopy - это транзакционная операция, которая при неудаче вернёт всё как оно было.
|
но все равно остается непонятным, что такое "неполная копия" при одинаковых ссылочных типах массивов. =(
|
(Offline)
|
|
19.05.2012, 02:01
|
#4
|
.
Регистрация: 05.08.2006
Сообщений: 10,429
Написано 3,454 полезных сообщений (для 6,863 пользователей)
|
Ответ: Array.ConstrainedCopy
Что значит "ссылочных" типах массивов?
Массив содержит числа. Каждое число имеет указатель.
Что ты делаешь - копируешь сами числа, а не указатели на данные.
Таким образом второй массив содержит ничем не связанные данные с первым.
Копии же, ты же КОПИРУЕШЬ сами данные.
|
(Offline)
|
|
19.05.2012, 02:31
|
#5
|
Бывалый
Регистрация: 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
|
.
Регистрация: 05.08.2006
Сообщений: 10,429
Написано 3,454 полезных сообщений (для 6,863 пользователей)
|
Ответ: Array.ConstrainedCopy
ЧИСЛА НЕ УКАЗАТЕЛИ!
Если ты засунешь туда объекты, то будут копии указателей на объекты, а объект останется одним и тем же.
ЧИСЛА - это простые данные, присваивание к ним данных, или присваивание чисел к числам - не операции с указателем, а операции с самими данными.
Засунь туда объект, и сделай снова свой эксперимент.
|
(Offline)
|
|
Сообщение было полезно следующим пользователям:
|
|
19.05.2012, 02:56
|
#7
|
Бывалый
Регистрация: 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
|
.
Регистрация: 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
|
Бывалый
Регистрация: 16.09.2011
Сообщений: 863
Написано 257 полезных сообщений (для 546 пользователей)
|
Ответ: Array.ConstrainedCopy
Сообщение от MoKa
|
я знаю что такое типы значений и ссылочные типы.
Мне было непонятно что и куда конкретно копируется. И как массивы хранят свои значения. Теперь все прояснилось.
|
(Offline)
|
|
19.05.2012, 08:10
|
#10
|
Unity/C# кодер
Регистрация: 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
|
(Offline)
|
|
Сообщение было полезно следующим пользователям:
|
|
Ваши права в разделе
|
Вы не можете создавать темы
Вы не можете отвечать на сообщения
Вы не можете прикреплять файлы
Вы не можете редактировать сообщения
HTML код Выкл.
|
|
|
Часовой пояс GMT +4, время: 11:37.
|