ref local vs null
От: CodeMonkey  
Дата: 14.05.19 18:27
Оценка:
Есть ли в .NET какая-то возможность присвоить null переменной, объявленой как "ref SomeStruct myVariable = "?
Re: ref local vs null
От: _NN_ www.nemerleweb.com
Дата: 14.05.19 20:45
Оценка:
Здравствуйте, CodeMonkey, Вы писали:

CM>Есть ли в .NET какая-то возможность присвоить null переменной, объявленой как "ref SomeStruct myVariable = "?


Обычно тема начинается с объяснения зачем это нужно
null нельзя присвоить и обычной структуре, не то что ref struct.
System.Nullable не считается потому как компилятор раскрывает это в инициализацию, а не в присвоение null.
http://rsdn.nemerleweb.com
http://nemerleweb.com
Re[2]: ref local vs null
От: CodeMonkey  
Дата: 15.05.19 00:46
Оценка:
Здравствуйте, _NN_, Вы писали:

_NN>Обычно тема начинается с объяснения зачем это нужно


Затем же, зачем нужен "SomeStruct?"
Всё разжевывать нужно?

_NN>null нельзя присвоить и обычной структуре, не то что ref struct.


И с каких пор ссылке нельзя присвоить null?
Re[3]: ref local vs null
От: _NN_ www.nemerleweb.com
Дата: 15.05.19 06:53
Оценка:
Здравствуйте, CodeMonkey, Вы писали:

CM>Здравствуйте, _NN_, Вы писали:


_NN>>Обычно тема начинается с объяснения зачем это нужно


CM>Затем же, зачем нужен "SomeStruct?"

CM>Всё разжевывать нужно?
Хотите ответа на вопрос, тогда да.


_NN>>null нельзя присвоить и обычной структуре, не то что ref struct.


CM>И с каких пор ссылке нельзя присвоить null?

А где у нас тут ссылочный тип ?
struct , ref struct не создают ссылочного типа.
Для этого есть ключевое слово class.
Также у ref struct отсутствует боксинг .
https://blogs.msdn.microsoft.com/mazhou/2018/03/02/c-7-series-part-9-ref-structs/

В общем возьмите class или Nullable<struct>
http://rsdn.nemerleweb.com
http://nemerleweb.com
Re: ref local vs null
От: mDmitriy Россия  
Дата: 15.05.19 10:12
Оценка:
Здравствуйте, CodeMonkey, Вы писали:

CM>Есть ли в .NET какая-то возможность присвоить null переменной, объявленой как "ref SomeStruct myVariable = "?

myVariable = default(SomeStruct);

не?

PS. не null, конечно, но я таким пользуюсь иногда
Re[4]: ref local vs null
От: CodeMonkey  
Дата: 15.05.19 16:02
Оценка: :)
Здравствуйте, _NN_, Вы писали:

_NN>Хотите ответа на вопрос, тогда да.


Если человек не знает, зачем нужен SomeStruct?, то на мой вопрос он все равно не сможет ответить.

_NN>А где у нас тут ссылочный тип ?


Внутри. По сути, это просто специальный тип ссылки.
Re[2]: ref local vs null
От: CodeMonkey  
Дата: 15.05.19 16:02
Оценка:
Здравствуйте, mDmitriy, Вы писали:

D>
D>myVariable = default(SomeStruct); 
D>

D>не?

D>PS. не null, конечно, но я таким пользуюсь иногда


Не. В данном случае, нужно потом суметь отличить — null это или нет.
Re: ref local vs null
От: Sinclair Россия https://github.com/evilguest/
Дата: 15.05.19 17:15
Оценка: :))) :)))
Здравствуйте, CodeMonkey, Вы писали:

CM>Есть ли в .NET какая-то возможность присвоить null переменной, объявленой как "ref SomeStruct myVariable = "

Ессессно. Стреляйте себе в ногу: ref SomeStruct myVariable = Null<SomeStruct>();
static unsafe ref T Null<T>() where T : unmanaged => ref *(T*)null;

Не знаю, зачем такое может понадобиться, но всёж.
Уйдемте отсюда, Румата! У вас слишком богатые погреба.
Re[5]: ref local vs null
От: _NN_ www.nemerleweb.com
Дата: 15.05.19 19:37
Оценка:
Здравствуйте, CodeMonkey, Вы писали:

CM>Здравствуйте, _NN_, Вы писали:


_NN>>Хотите ответа на вопрос, тогда да.


CM>Если человек не знает, зачем нужен SomeStruct?, то на мой вопрос он все равно не сможет ответить.

Так нужен null или просто обозначить отсутствие значения ?
SomeStruct? => struct Nullable<SomeStruct> , а следовательно не является ссылочным типом.
Вы точно знаете, что на самом деле происходит в коде: SomeStruct? a = null; ?

_NN>>А где у нас тут ссылочный тип ?


CM>Внутри. По сути, это просто специальный тип ссылки.

На то он и специальный, чтобы не было глупостей:

ref class:
        .locals init (
            [0] class A&
        )


ref struct:
        .locals init (
            [0] valuetype B&
        )
http://rsdn.nemerleweb.com
http://nemerleweb.com
Re[5]: ref local vs null
От: _NN_ www.nemerleweb.com
Дата: 15.05.19 19:44
Оценка:
Здравствуйте, CodeMonkey, Вы писали:

Кстати есть уже пара предложений на эту тему. Возможно сделают в будущем:
https://github.com/dotnet/csharplang/issues/1201
https://github.com/dotnet/csharplang/issues/1837
https://github.com/dotnet/csharplang/issues/497
https://github.com/dotnet/csharplang/issues/1148
http://rsdn.nemerleweb.com
http://nemerleweb.com
Отредактировано 15.05.2019 19:50 _NN_ . Предыдущая версия .
Re[6]: ref local vs null
От: CodeMonkey  
Дата: 16.05.19 00:34
Оценка: +1
Здравствуйте, _NN_, Вы писали:

_NN>Вы точно знаете, что на самом деле происходит в коде: SomeStruct? a = null; ?


Ты точно уверен, что понял написанное?
ref SomeStruct — это, по своей сути, специальный вид ссылки/указателя. А раз это ссылка, то сделать ее null никаких технических сложностей быть не должно.
Re[2]: ref local vs null
От: CodeMonkey  
Дата: 16.05.19 00:35
Оценка:
Здравствуйте, Sinclair, Вы писали:

S>Ессессно. Стреляйте себе в ногу: ref SomeStruct myVariable = Null<SomeStruct>();

S>
S>static unsafe ref T Null<T>() where T : unmanaged => ref *(T*)null;
S>


Это вы без меня развлекайтесь подобным образом.
Re[6]: ref local vs null
От: CodeMonkey  
Дата: 16.05.19 00:39
Оценка:
Здравствуйте, _NN_, Вы писали:

_NN>Кстати есть уже пара предложений на эту тему. Возможно сделают в будущем:


Судя по комментариям — вряд ли. У идиотов всегда или всё, или ничего. Раньше была концепция "null должен быть везде", ну а сейчас, похоже, это сменилось на "null никогда не нужен".
Re[3]: ref local vs null
От: Sinclair Россия https://github.com/evilguest/
Дата: 16.05.19 06:28
Оценка: +8 :))
Здравствуйте, CodeMonkey, Вы писали:

CM>Это вы без меня развлекайтесь подобным образом.

Эмм, а что вас не устраивает? Вы хотели null в ref local — вот вам способ впаять туда null.
Понятно, что ту задачу, которая перед вами на самом деле стоит, нужно решать как-то по-другому, но т.к. вы её не обозначили, то решение вам дано ровно для того, для чего просили.
Уйдемте отсюда, Румата! У вас слишком богатые погреба.
Re[7]: ref local vs null
От: _NN_ www.nemerleweb.com
Дата: 16.05.19 06:31
Оценка: +1 :)
Здравствуйте, CodeMonkey, Вы писали:

CM>Здравствуйте, _NN_, Вы писали:


_NN>>Кстати есть уже пара предложений на эту тему. Возможно сделают в будущем:


CM>Судя по комментариям — вряд ли. У идиотов всегда или всё, или ничего. Раньше была концепция "null должен быть везде", ну а сейчас, похоже, это сменилось на "null никогда не нужен".

И правильно.
Отсутствие значения должно быть обозначено явно.
http://rsdn.nemerleweb.com
http://nemerleweb.com
Re[3]: ref local vs null
От: mDmitriy Россия  
Дата: 16.05.19 09:18
Оценка:
Здравствуйте, CodeMonkey, Вы писали:

CM>Здравствуйте, mDmitriy, Вы писали:


D>>
D>>myVariable = default(SomeStruct); 
D>>

D>>не?

D>>PS. не null, конечно, но я таким пользуюсь иногда


CM>Не. В данном случае, нужно потом суметь отличить — null это или нет.

не нужно, потому что структуы в текущей реализации шарпа не бывают null

чтобы отличить пустую структуру, достаточно сравнить ее с default(SomeStruct)
и сразу будет понятно, было присвоено что-то ссылочному параметру внутри метода или нет
Re[8]: ref local vs null
От: CodeMonkey  
Дата: 16.05.19 15:33
Оценка:
Здравствуйте, _NN_, Вы писали:

_NN>И правильно.

_NN>Отсутствие значения должно быть обозначено явно.

Даешь логику на исключениях или добавочные флаги?
Re[9]: ref local vs null
От: _NN_ www.nemerleweb.com
Дата: 16.05.19 17:43
Оценка:
Здравствуйте, CodeMonkey, Вы писали:

CM>Здравствуйте, _NN_, Вы писали:


_NN>>И правильно.

_NN>>Отсутствие значения должно быть обозначено явно.

CM>Даешь логику на исключениях или добавочные флаги?

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

Пусть внутри будет реализовано оптимально через ссылку с null, но это должно быть в деталях реализации.
http://rsdn.nemerleweb.com
http://nemerleweb.com
Re[2]: ref local vs null
От: alexzzzz  
Дата: 24.05.19 00:09
Оценка: +1
Здравствуйте, Sinclair, Вы писали:

S>
S>static unsafe ref T Null<T>() where T : unmanaged => ref *(T*)null;
S>


ref T t = ref Unsafe.AsRef<T>(null);
Отредактировано 24.05.2019 0:11 alexzzzz . Предыдущая версия .
Re[2]: ref local vs null
От: vdimas Россия  
Дата: 28.05.19 14:40
Оценка:
Здравствуйте, Sinclair, Вы писали:

S>Не знаю, зачем такое может понадобиться, но всёж.


Для интеропа часто использую.
Интероп требует передавать структуры по указателю в некое АПИ, но:
— иногда хочется оставить их value-типами;
— иногда требуется подать NULL;
— раскидывать unmanaged/fixed повсюду не хочется.
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.