Здравствуйте, QrystaL, Вы писали:
VD>>Только мне в дотнете не хватает неизменяемого массива?
QL>
QL>Array.AsReadOnly();
QL>
QL>?
Массив — это монолитная структура данных. А AsReadOnly создает ReadOnlyCollection, что совершенно не нужный оверхэд, да и исходный массив он от изменения не защищает.
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re[3]: Только мне в дотнете не хватает неизменяемого массива
Здравствуйте, VladD2, Вы писали: VD>Массив — это монолитная структура данных. А AsReadOnly создает ReadOnlyCollection, что совершенно не нужный оверхэд, да и исходный массив он от изменения не защищает.
А в каких языках есть пример того, что вам нужно?
Re: Только мне в дотнете не хватает неизменяемого массива?
Здравствуйте, VladD2, Вы писали:
VD>Здравствуйте, QrystaL, Вы писали:
VD>>>Только мне в дотнете не хватает неизменяемого массива?
QL>>
QL>>Array.AsReadOnly();
QL>>
QL>>?
VD>Массив — это монолитная структура данных. А AsReadOnly создает ReadOnlyCollection, что совершенно не нужный оверхэд, да и исходный массив он от изменения не защищает.
Если совсем без оверхеда и с прямым доступом к элементам как у существующего дотнет массива (с передачей элементов по ref), то ничто не сможет гарантировать неизменяемость такого массива (благодаря unsafe и ref параметрам).
Только оверхед вроде ReadOnlyCollection может гарантировать неизменность. А что бы гарантировать неизменность и с ним, нужно AsReadOnly вызывать у клона исходного массива.
Я так понимаю, исходный вопрос риторический? В таком ракурсе — да, мне тоже не хватает встроенного неизменяемого массива. Ну т.е. было бы круто если бы он был. Но никакой надежды что он будет на уровне дотнета — нет. А вот языки в свою очередь могли бы обеспечивать что-то вроде const ref-а хотя бы на уровне компиляции. И я не понимаю, почему const ref-а нет до сих пор .
Re[4]: Только мне в дотнете не хватает неизменяемого массива
Здравствуйте, QrystaL, Вы писали:
QL>Здравствуйте, VladD2, Вы писали: VD>>Массив — это монолитная структура данных. А AsReadOnly создает ReadOnlyCollection, что совершенно не нужный оверхэд, да и исходный массив он от изменения не защищает.
QL>А в каких языках есть пример того, что вам нужно?
Наверно, C++: const T [], const T *, const std::vector, const my_cool_array, etc.
Re[5]: Только мне в дотнете не хватает неизменяемого массива
Здравствуйте, k.o., Вы писали:
QL>>А в каких языках есть пример того, что вам нужно? KO>Наверно, C++: const T [], const T *, const std::vector, const my_cool_array, etc.
Здравствуйте, adontz, Вы писали:
A>Здравствуйте, k.o., Вы писали:
QL>>>А в каких языках есть пример того, что вам нужно? KO>>Наверно, C++: const T [], const T *, const std::vector, const my_cool_array, etc.
A>Это константность вообще, а не только массива.
А в чём разница?
Re[7]: Только мне в дотнете не хватает неизменяемого массива
Здравствуйте, adontz, Вы писали:
A>Здравствуйте, k.o., Вы писали:
A>>>Это константность вообще, а не только массива. KO>>А в чём разница?
A>Спрашивали про массив
Ну так мы и получаем неизменяемый массив, разве нет?
Re: Только мне в дотнете не хватает неизменяемого массива?
Здравствуйте, samius, Вы писали:
S>Если совсем без оверхеда и с прямым доступом к элементам как у существующего дотнет массива (с передачей элементов по ref), то ничто не сможет гарантировать неизменяемость такого массива (благодаря unsafe и ref параметрам).
А ничего что банальная строка (System.String) в дотнете по сути является таким массивом?
Твои рассуждения в корне ошибочны. unsafe есть unsafe. От него не защитишься. А передача по ссылке (то что ты назвал ref) просто не должна допускаться для данных доступных только для чтения.
S>Только оверхед вроде ReadOnlyCollection может гарантировать неизменность. А что бы гарантировать неизменность и с ним, нужно AsReadOnly вызывать у клона исходного массива.
Если бы это было так, то строки тоже создавали бы оверхэд, но это не так.
S>Я так понимаю, исходный вопрос риторический? В таком ракурсе — да, мне тоже не хватает встроенного неизменяемого массива. Ну т.е. было бы круто если бы он был. Но никакой надежды что он будет на уровне дотнета — нет. А вот языки в свою очередь могли бы обеспечивать что-то вроде const ref-а хотя бы на уровне компиляции. И я не понимаю, почему const ref-а нет до сих пор .
Вопрос совершенно практический. Если бы я нашел поддержку, то можно было бы сделать запрос на фичу в следующую версию дотнета.
ЗЫ
Кроме того хотелось бы получить возможность размещать в хвосте объекта один массив однородных элементов. Тогда типы вроде строк не пришлось бы хардодить в рантайме.
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re[2]: Только мне в дотнете не хватает неизменяемого массива
Здравствуйте, adontz, Вы писали:
QL>>>А в каких языках есть пример того, что вам нужно? KO>>Наверно, C++: const T [], const T *, const std::vector, const my_cool_array, etc.
A>Это константность вообще, а не только массива.
Да как хочешь называй, а создать аналогичный массив на дотнете невозможно. И это просто бредовый просчет создателей системы.
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re[7]: Только мне в дотнете не хватает неизменяемого массива
Здравствуйте, VladD2, Вы писали:
A>>Это константность вообще, а не только массива. VD>Да как хочешь называй, а создать аналогичный массив на дотнете невозможно. И это просто бредовый просчет создателей системы.
Просчёт — это отсутствие константности вообще. Из-за неё нельзя, например, сделать switch по объектам произвольного типа. С другой стороны, я не понимаю как это можно реализовать на уровне run-time без кучи проверок.
Здравствуйте, adontz, Вы писали:
A>Спрашивали про массив
Дык для полей есть readonly (в терминалогии шарпа). Почему бы не сделать решение полноценным и не позволить объявлять неизменяемые массивы?
Объект состоящий только из неизменяемых данных можно хранить в более эффективном GC. Ну, и гарантии намного выше когда рантайм обеспечивает свойства объекта, а не инкапсуляция. Про эффективность я молчу.
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re[2]: Только мне в дотнете не хватает неизменяемого массива
Здравствуйте, adontz, Вы писали:
A>А это вообще где-то есть?
Меня это не волнует. Думаю, что где-нить в ОКамле или Хаскеле должно быть. Плюс в С++ можно добиться похожего поведения (если закрыть глаза на возможность плевать на все и реинтерпретировать память).
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re[3]: Только мне в дотнете не хватает неизменяемого массива
Здравствуйте, VladD2, Вы писали:
VD>Здравствуйте, adontz, Вы писали:
A>>А это вообще где-то есть?
VD>Меня это не волнует. Думаю, что где-нить в ОКамле или Хаскеле должно быть. Плюс в С++ можно добиться похожего поведения (если закрыть глаза на возможность плевать на все и реинтерпретировать память).
VD>И это печально. Дотнетчики не видят ничего дальше своего носа. МС сам воспитывает такой менталитет.
Печально, действительно не видят дальше своего носа.
В OCaml с давних пор массивы мутабельны, неизменяемые в Haskell.
Вот пишут люди на окамлах промышленную фигню десятки лет и не понимают, что же им в функциональном языке не хватает... ах да, неизменяемых массивов!
Лично мне гораздо унылее от того, что в дотнетах из коробки нету какой-нибудь структуры данных типа VList, чтобы и внешне иммутабельно, и доступ по индексу/вычисление длинны быстрее чем O(n), и оверхеда по памяти и нагрузки на GC поменьше, чем у linked list.