Войти
ФлеймФорумПрограммирование

C#. Ссылка на элемент массива. (2 стр)

Страницы: 1 2 3 4 Следующая »
#15
(Правка: 14:27) 14:15, 13 янв. 2020

Dampire
> Прекрати, зелень. Реаллокация с указателем на старый участок памяти работает
> везде одинаково и за один майн никто в эту память ничего не запишет.
https://rextester.com/YPGHL98821

pahaa
Ещё один, только теперь наоборот.
В решётке твои указатели никогда не повиснут в пустоте, если только ты не напросишься явно через unsafe.
ref var x - это валидная ссылка, значит, пока x существует, старый массив продолжает жить.

=A=L=X=
> Что если сказали "привести аналогичный пример", то надо приводить аналогичный,
> а не говорить вообще невесть что и зачем придуманное.
Ну что поделать, не так уж просто из неопределённого поведения получить что-то заранее определённое.
Главное в том, что после реаллокации массива в решётке сборщик не посмеет тронуть старый буфер, пока не сгинет последняя ссылка; тогда как в крестах после реаллокации все ссылки мгновенно становятся ядовитыми и даже малейшее прикосновение к ним превращает всю программу в лягушку.


#16
14:32, 13 янв. 2020

Delfigamer
> В решётке твои указатели никогда не повиснут в пустоте
Ну, тогда ещё проще. Значит просто x держит копию массива, на которую и ссылается.
Хоть и не UB, но просто разные сорта говна. Ссылка на объект вне контекста — такая себе радость для читающего. Хотя всяко бывает. Я однажды видел реализацию синглтона через умышленный memory leak.

#17
14:42, 13 янв. 2020

pahaa
> ресайз массива пометил этот адрес как «мусор» и сказал, что туда, в общем-то, теперь можно записывать что угодно.

Ресайз массива просто создал новый массив и скопировал туда данные из старого. Со старым массивом ничего не случилось и не случится. Он будет продолжать жить, пока на него есть хоть одна ссылка, в том числе ссылка на элемент внутри него.

#18
16:18, 13 янв. 2020

Я не особо понял что смущает афтора -

...
x=10;
....
WriteLine(x); // 10 !!!
Чему тут, блин, удивляться???
#19
(Правка: 16:27) 16:22, 13 янв. 2020

Delfigamer
> Ну что поделать, не так уж просто из неопределённого поведения получить что-то
> заранее определённое.

В плюсах можно нагородить полностью аналогичное поведение, но для этого придётся наворотить библиотеку с рефкаунтными массивами и ссылками на их элементы, просто повторяющие суть вещей.
Однако даже УБ-шная прямолинейная реализация через std::vector выдаст такое же внешнее поведение и найти компилятор и ОС  где было бы иначе имхо весьма затруднительно.
Но вообще есть такая проблема - код создающий копии не всегда очевидно что создаёт копии.
У того же Delphi ресайз как функция SetLength так и вопит, что с аргументом как ссылкой ничего не происходит. Поэтому ошибка довольно часто встречаемая.
А вот если бы ей сделали вид arr := CopyArrayFrom( arr [ , newDimensions... ] ); , то уже было бы очевидно что тут вообще происходит - а происходит именно это даже если измерения массива не меняются.

#20
10:45, 14 янв. 2020

Delfigamer

ref var x - это валидная ссылка, значит, пока x существует, старый массив продолжает жить.

чушь. 
arr  будет удален из памяти со всем своим содержимым после того как на него перестанут ссылаться.
arr[2] это не ссылка на массив, это синтаксический сахар для arr.getValue(2)
Ссылка на массив - это когда var xarr = arr;


#21
10:57, 14 янв. 2020

Polyflow3d
> ref
Ты дебил или это такой троллинг?

#22
11:02, 14 янв. 2020

Delfigamer
не, я не дибил, и еще раз тебе повторяю
arr[2] - это не ссылка на массив.

#23
11:07, 14 янв. 2020

ref arr[2]

#24
11:18, 14 янв. 2020

alexzzzz

ref arr[2]

и даже с ref  это не ссылка на массив
https://dotnetfiddle.net/ZmD55d
#25
11:22, 14 янв. 2020

ref arr[2] - это ссылка на элемент массива. Пока она где-то сохранена, массив будет жить.

#26
11:29, 14 янв. 2020

alexzzzz
нет в c# такого типа  "ссылка на элемент массива".
Я тебе упорно это обьяснял пару лет назад, но ты с тех пор так это и не осознал. 
 
Ты походу даже до сих пор не понял в чем разница между reference и value типами.

#27
11:36, 14 янв. 2020

Уже C# 8.0 вышел, а ты даже про 7.0 не читал. Вроде на ассет-сторе что-то продаешь. Выучи свой профессиональный инструмент, наконец.

#28
(Правка: 12:13) 11:40, 14 янв. 2020

alexzzzz
я много про в жизни даже не читал, но это не отменяет того факта что
нет в c# такого типа  "ссылка на элемент массива".

Я уж не знаю какие тебе пруфы привести если ты даже x.GetType() игнорируешь

а на счет продаж скажу тебе так - иногда полезно что нибудь попродавать, что бы понять что не надо использовать c#8 на следующий день после его выхода.
К тому же этот ref locals - это индусский костыль который переопределяет поведение value type  и его врятли бы одобрили архитекторы c#.  Вангую, что в следующих вресиях впилят костыль который заставляет reference type вести себя как value. Ну и получится из с# в конце концов клубок запутанного неопределенного гавна типа JS, которым , как я понимаю сейчас является c++, где все смешалось - типы, указатели.
Странно только слушать когда о профпригодности разработчика судят по степени познаний этого индусского клубка гавна.

#29
(Правка: 11:57) 11:56, 14 янв. 2020

Polyflow3d
> нет в c# такого типа "ссылка на элемент массива".

В C# есть такая штука как ref local весьма похожая на ссылки в C++: https://habr.com/ru/company/microsoft/blog/423061/
И главное её фича - возвращать ссылки на составные части сложных объектов (включая массивы!) так что работа с ними будет приводить сразу к изменению значения внутри объекта.
И есть интересное замечание:

    Невозможно вернуть ссылку на локальную переменную.
    Невозможно вернуть ссылку на this в структурах.
    Можно вернуть ссылку на переменную, размещенную в куче (например, на член класса).
    Можно вернуть ссылку на параметры ref/out.

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

Поэтому в C# давно уже есть "ссылка на элемента массива", увы и ах.

Страницы: 1 2 3 4 Следующая »
ФлеймФорумПрограммирование