Re[10]: ref local vs null
От: vdimas Россия  
Дата: 29.05.19 18:37
Оценка:
Здравствуйте, alexzzzz, Вы писали:

A>Максимум что можно сделать с самой ссылкой, перенаправить её в новое место, явно указав, куда именно;


Также с указателями, заметь.
В С++ с ссылками так поступать нельзя.


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


Да без проблем:

https://docs.microsoft.com/en-us/dotnet/api/system.runtime.compilerservices.unsafe.add?view=dotnet-plat-ext-2.1#System_Runtime_CompilerServices_Unsafe_Add__1___0__System_IntPtr_

https://docs.microsoft.com/en-us/dotnet/api/system.runtime.compilerservices.unsafe.subtract?view=dotnet-plat-ext-2.1#System_Runtime_CompilerServices_Unsafe_Subtract__1___0__System_IntPtr_

https://docs.microsoft.com/en-us/dotnet/api/system.runtime.compilerservices.unsafe.byteoffset?view=dotnet-plat-ext-2.1


A>Указатель подразумевает, что есть непревырвая последовательность ячеек памяти, которые можно последовательно или произвольно читать и писать.


Ты не поверишь... ))


A>Ссылка же указывает на какую-то конкретную ячейку памяти, в которой гарантированно хранится что-то полезное.


Угу, типа сабжа — ссылки на null.
Re[11]: ref local vs null
От: alexzzzz  
Дата: 29.05.19 20:11
Оценка:
Здравствуйте, vdimas, Вы писали:

A>>Максимум что можно сделать с самой ссылкой, перенаправить её в новое место, явно указав, куда именно;

V>Также с указателями, заметь.
V>В С++ с ссылками так поступать нельзя.

Потому что текущий синтаксис не позволяет отличить переназначение ссылки от присваивания. Есть более концептуальные причины?

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

V>Да без проблем:
V>https://docs.microsoft.com/en-us/dotnet/api/system.runtime.compilerservices.unsafe.add?view=dotnet-plat-ext-2.1#System_Runtime_CompilerServices_Unsafe_Add__1___0__System_IntPtr_
V>...

Почему оно не на C#?

A>>Указатель подразумевает, что есть непревырвая последовательность ячеек памяти, которые можно последовательно или произвольно читать и писать.

V>Ты не поверишь... ))
Не поверю.

A>>Ссылка же указывает на какую-то конкретную ячейку памяти, в которой гарантированно хранится что-то полезное.

V>Угу, типа сабжа — ссылки на null.

При большом желании можно и ... строку сделать отрицательной длины. Того же уровня явление.

В пролетевшей ссылке на Гитхаб хотели в импортируемую нативную функцию, принимающую MyStruct*, вместо указателя отдавать null-ссылку. Функция просит указатель, в C# есть указатели, в чём проблема? От того что в коде где-то будет написано ref и не будет написано unsafe, он не станет ни безопаснее, ни надёжнее. Если кому-то страшно писать слово unsafe, то и правильно, оно специально страшное. Зато честное.
Отредактировано 29.05.2019 20:31 alexzzzz . Предыдущая версия .
Re[12]: ref local vs null
От: vdimas Россия  
Дата: 29.05.19 20:35
Оценка:
Здравствуйте, alexzzzz, Вы писали:

A>>>Максимум что можно сделать с самой ссылкой, перенаправить её в новое место, явно указав, куда именно;

V>>Также с указателями, заметь.
V>>В С++ с ссылками так поступать нельзя.
A>Потому что текущий синтаксис не позволяет отличить переназначение ссылки от присваивания. Есть более концептуальные причины?

Это и есть причина.
Синтаксис должен отражать семантику.
Ты же пытаешься поставить телегу впереди лошади.


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

V>>Да без проблем:
V>>https://docs.microsoft.com/en-us/dotnet/api/system.runtime.compilerservices.unsafe.add?view=dotnet-plat-ext-2.1#System_Runtime_CompilerServices_Unsafe_Add__1___0__System_IntPtr_
V>>...
A>Почему оно не на C#?

А на чём?


A>>>Указатель подразумевает, что есть непревырвая последовательность ячеек памяти, которые можно последовательно или произвольно читать и писать.

V>>Ты не поверишь... ))
A>Не поверю.

Ссылки я дал — проверь сам.
Re[13]: ref local vs null
От: alexzzzz  
Дата: 29.05.19 22:18
Оценка:
Здравствуйте, vdimas, Вы писали:

A>>>>Максимум что можно сделать с самой ссылкой, перенаправить её в новое место, явно указав, куда именно;

V>>>Также с указателями, заметь.
V>>>В С++ с ссылками так поступать нельзя.
A>>Потому что текущий синтаксис не позволяет отличить переназначение ссылки от присваивания. Есть более концептуальные причины?

V>Это и есть причина.

V>Синтаксис должен отражать семантику.
V>Ты же пытаешься поставить телегу впереди лошади.

Я не вижу, кто тут телега и кто лошадь. Ты упомянул, что «в отличие от C++, ref-переменные в C# имеют семантику не ссылок, а именно указателей, бо в С++ ссылка — это алиас, а в C# — значение». Я этого не понял. Когда учил С++, помню, долго не мог въехать в ссылки, зачем они нужны, если уже есть указатели. В объявлении ссылки используется значок '&', который как бы намекает на получение адреса, что как бы намекает, что это что-то типа указателя и можно использовать вместо указателей. Непонятно только, в чём выгода. Понял позже ― указатель смотрит куда хочет, а нормальная ссылка только туда, куда можно смотреть. Чтобы прочитать или, не дай бог, записать что-то по адресу указателя, сначала стоит перекреститься, а ссылки безопасны.

Если судить о семантике по синтаксису, ссылки в C# отличаются от указателей кардинально. Указатели — почти такой же тип как и value- и reference-типы. Объявляется так же, значения присваиваются тем же оператором. В объявлении же ссылки сначала обязательно будет 'ref' (никакого оператора получения адреса!), инициализация/перенаправление делается отдельным оператором '=ref'. Указателю можно присвоить всё что хочешь, можно ничего не присваивать, а ссылку можно направить только на существующий объект. Можно иметь ссылку на указатель. Иметь указатель на ссылку нельзя, получится просто указатель на объект. Ссылка ведёт себя как сам объект, на который она ссылается. Даёт одинаковое значение при чтении, одинаковый эффект при записи, адреса переменной и ссылки на неё одинаковые. Ну это алиас, который и объявлен был явно как алиас и ведёт себя как алиас.

Т.е. непонятно, в чём семантическое отличие от ссылок в C++? Если только в том, что в C++ нельзя переназначить ссылку/алиас на другой объект, то это чисто синтаксическая проблема С++. В нём инициализация ссылки выполняется оператором присваивания и повторно этот фокус не работает (хотя, я посмотрел, народ на SO пытается, в первый раз же получилось!).

A>>Почему оно не на C#?

V>А на чём?

Точно на чём-то другом.
https://github.com/dotnet/corefx/blob/master/src/System.Runtime.CompilerServices.Unsafe/src/System.Runtime.CompilerServices.Unsafe.il

V>Ссылки я дал — проверь сам.

Ссылки на System.Runtime.CompilerServices.Unsafe? Я его сам иногда использую для вещей, которые на C# трудно выразить.
Отредактировано 29.05.2019 22:42 alexzzzz . Предыдущая версия . Еще …
Отредактировано 29.05.2019 22:24 alexzzzz . Предыдущая версия .
Отредактировано 29.05.2019 22:24 alexzzzz . Предыдущая версия .
Отредактировано 29.05.2019 22:22 alexzzzz . Предыдущая версия .
Re[14]: ref local vs null
От: vdimas Россия  
Дата: 30.05.19 21:22
Оценка:
Здравствуйте, alexzzzz, Вы писали:

A>>>Почему оно не на C#?

V>>А на чём?
A>Точно на чём-то другом.
A>https://github.com/dotnet/corefx/blob/master/src/System.Runtime.CompilerServices.Unsafe/src/System.Runtime.CompilerServices.Unsafe.il

Дык, не все возможности платформы можно выразить в терминах C#.
Span<> тоже местами писан на чём-то другом, String местами тоже, статический класс Buffer и т.д.
Нас-то это никак не касается.
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.