Официальное обоснование:
-For high performance and native development scenarios, you may want “stack-only” types that always stay on execution stack..
-...
-Cannot be dynamic binding, boxing, unboxing, wrapping or converting.
-----ref struct is also called embedded reference.
Раньше было так:
public struct S
{
public int A;
public int B;
}
public void M0(ref S s){}
public struct S1
{
public S SF;
public int C;
}
public void M1(ref S1 s){}
Теперь сделаем финт ушами, и допишем ref перед "struct S". Результат — всё сломалось.
Нафига козе баян??? Зачем положили верёвку, которая стреляет в ноги мимопроходящим?
Когда кто-то, у кого его лямбда не компилируется попытается закрыть свою таску (по-быстрячку, перед релизом), то он не задумываясь удалит слово "ref". Всё ведь и правда заработает — серьёзно! Человек, который мерджит реквесты потом замыленным, уставшим взглядом этого просто не заметит.
Всё сказанное выше — личное мнение, если не указано обратное.
Здравствуйте, Философ, Вы писали:
Ф>Когда кто-то, у кого его лямбда не компилируется попытается закрыть свою таску (по-быстрячку, перед релизом), то он не задумываясь удалит слово "ref".
Странно, что у него вообще скомипиллируется после этого.
Обычно ref struct сидит в каком-нить interop, где лямбды не нужны, или как обёртки над Span/ReadOnlySpan, когда в прикладном коде.
Ф>Всё ведь и правда заработает — серьёзно! Человек, который мерджит реквесты потом замыленным, уставшим взглядом этого просто не заметит.
А можно поинтересоваться, для каких целей вы используете ref struct?
Здравствуйте, vdimas, Вы писали:
V>А можно поинтересоваться, для каких целей вы используете ref struct?
Мы — ни для каких. У нас вообще C# 4.0
Я просто прикинул, где они могут появиться, для каких целей, и как это потом всё будет сломано. А так — мы парсим бинарные форматы и периодически юзаем interop.
К слову, System.IO у нас свой со времён C# 2.0 — нужно было длинные имена поддерживать.
Всё сказанное выше — личное мнение, если не указано обратное.
Здравствуйте, Философ, Вы писали:
V>>А можно поинтересоваться, для каких целей вы используете ref struct? Ф>Мы — ни для каких. У нас вообще C# 4.0 Ф>Я просто прикинул, где они могут появиться, для каких целей
Обычно для целей битовыжимания через нейтивный interop, или для прикладных "оберток" над Span.
В обоих случаях — для целей ссылания на некий стековый буфер, иначе ref struct не нужен, т.е. не нужны его гарантии.
Ф>К слову, System.IO у нас свой со времён C# 2.0 — нужно было длинные имена поддерживать.
У меня свои все коллекции, все парсеры-форматтеры, весь сетевой стек, все строковые операции плюс портированная прорва их с плюсов. ))
Дотнет сам по себе умеет хорошо работать, но текущие либы написаны не для шустрого исполнения, а для низкой планки входа.
Здравствуйте, Философ, Вы писали:
Ф>Теперь сделаем финт ушами, и допишем ref перед "struct S". Результат — всё сломалось.
Оно же не само. Ты лично и сломал, дописав ref. ref-struct не может жить в куче (оно для этого специально придумано), а просто-struct может, поэтому ref-struct не может быть полем просто-struct. Компилятор на это ругается.
Ф>Когда кто-то, у кого его лямбда не компилируется попытается закрыть свою таску (по-быстрячку, перед релизом), то он не задумываясь удалит слово "ref". Всё ведь и правда заработает — серьёзно!
В смысле «не задумываясь»? Так можно не задумываясь struct на class заменить, тоже всё может без проблем работать.