Всем доброго дня!
Скажите, правильно ли я понял: если есть экземляр ArrayList list, содержащий N экземпляров класса Foo (не ValueType), то после вызова
Foo[] array = (Foo[])list.ToArray(typeof(Foo));
экземляров класса Foo останеться N, а ссылок на экземпляры Foo станет 2N ???
Здравствуйте, Аноним, Вы писали:
А>Всем доброго дня!
А>Скажите, правильно ли я понял: если есть экземляр ArrayList list, содержащий N экземпляров класса Foo (не ValueType), то после вызова
А>Foo[] array = (Foo[])list.ToArray(typeof(Foo));
А>экземляров класса Foo останеться N, а ссылок на экземпляры Foo станет 2N ???
А то... это вытекает из того, что все сложные типы — Reference-type.
Здравствуйте, Codechanger, Вы писали:
C>все сложные типы — Reference-type
Не совсем так.
struct — это сложный тип, но он value-type.
... << RSDN@Home 1.1.4 stable SR1 rev. 568>>
а вообще наверное да.
--------------------------------
Авто-подпись — дешевый понт!
данное сообщение получено с www.gotdotnet.ru
ссылка на оригинальное сообщение
Здравствуйте, Codechanger, Вы писали:
C>Здравствуйте, Аноним, Вы писали:
А>>Всем доброго дня!
А>>Скажите, правильно ли я понял: если есть экземляр ArrayList list, содержащий N экземпляров класса Foo (не ValueType), то после вызова
А>>Foo[] array = (Foo[])list.ToArray(typeof(Foo));
А>>экземляров класса Foo останеться N, а ссылок на экземпляры Foo станет 2N ???
C>А то... это вытекает из того, что все сложные типы — Reference-type.
Ничего подобного — ToArray() делает полную копию (Copy) а не просто копию ссылок (Shallow Copy)
Здравствуйте, Ken Keray, Вы писали:
KK>Здравствуйте, Codechanger, Вы писали:
C>>Здравствуйте, Аноним, Вы писали:
KK>Ничего подобного — ToArray() делает полную копию (Copy) а не просто копию ссылок (Shallow Copy)
А проверить религия не позволяет, прежде чем говорить несуразицу?!
ToArray() именно что копирует ссылки, а не создает новые экземпляры.
ArrayList list = new ArrayList(new object[] { 1, 2, 3 });
object[] newObj = list.ToArray();
if (Object.ReferenceEquals(newObj[0], list[0]))
Console.WriteLine("Ссылки идентичны");
else
Console.WriteLine("Ссылки не идентичны");
Как видите сслыки идентичны, даже у Value типов, так как прежде чем попасть в коллекцию ArrayList'а происходит их бокиснг
... << RSDN@Home 1.2.0 alpha rev. 655>>
Здравствуйте, <Аноним>, Вы писали:
А>Всем доброго дня!
А>Скажите, правильно ли я понял: если есть экземляр ArrayList list, содержащий N экземпляров класса Foo (не ValueType), то после вызова
А>Foo[] array = (Foo[])list.ToArray(typeof(Foo));
А>экземляров класса Foo останеться N, а ссылок на экземпляры Foo станет 2N ???
Совершенно верно
... << RSDN@Home 1.2.0 alpha rev. 655>>
Здравствуйте, RustM, Вы писали:
RM>Здравствуйте, Ken Keray, Вы писали:
KK>>Здравствуйте, Codechanger, Вы писали:
C>>>Здравствуйте, Аноним, Вы писали:
KK>>Ничего подобного — ToArray() делает полную копию (Copy) а не просто копию ссылок (Shallow Copy)
RM>А проверить религия не позволяет, прежде чем говорить несуразицу?!
RM>ToArray() именно что копирует ссылки, а не создает новые экземпляры.
RM>
RM>ArrayList list = new ArrayList(new object[] { 1, 2, 3 });
RM>object[] newObj = list.ToArray();
RM>if (Object.ReferenceEquals(newObj[0], list[0]))
RM> Console.WriteLine("Ссылки идентичны");
RM>else
RM> Console.WriteLine("Ссылки не идентичны");
RM>
RM>Как видите сслыки идентичны, даже у Value типов, так как прежде чем попасть в коллекцию ArrayList'а происходит их бокиснг
Виноват!

В самом деле, копия ссылок. Я проверял, однако пример выбрал не правильный:
ArrayList list = new ArrayList(new object[] { 1, 2, 3 });
object[] newObj = list.ToArray();
newObj[0] = 72; // здесь новая ссылка на новый объект
if (Object.ReferenceEquals(newObj[0], list[0]))
Console.WriteLine("Ссылки идентичны");
else
Console.WriteLine("Ссылки не идентичны");
Console.WriteLine(list[0]);
newObj[0] поменялся, а list[0] — нет, вот я и решил, что идёт полная копия