Только мне в дотнете не хватает неизменяемого массива?
От: VladD2 Российская Империя www.nemerle.org
Дата: 30.01.11 13:57
Оценка: 2 (2) +2
Только мне в дотнете не хватает неизменяемого массива?
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re: Только мне в дотнете не хватает неизменяемого массива?
От: QrystaL Украина  
Дата: 30.01.11 14:07
Оценка: +2
Здравствуйте, VladD2, Вы писали:

VD>Только мне в дотнете не хватает неизменяемого массива?


Array.AsReadOnly();


?
Re[2]: Только мне в дотнете не хватает неизменяемого массива
От: VladD2 Российская Империя www.nemerle.org
Дата: 30.01.11 14:23
Оценка: :)
Здравствуйте, QrystaL, Вы писали:

VD>>Только мне в дотнете не хватает неизменяемого массива?


QL>
QL>Array.AsReadOnly();
QL>


QL>?


Массив — это монолитная структура данных. А AsReadOnly создает ReadOnlyCollection, что совершенно не нужный оверхэд, да и исходный массив он от изменения не защищает.
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re[3]: Только мне в дотнете не хватает неизменяемого массива
От: QrystaL Украина  
Дата: 30.01.11 14:30
Оценка:
Здравствуйте, VladD2, Вы писали:
VD>Массив — это монолитная структура данных. А AsReadOnly создает ReadOnlyCollection, что совершенно не нужный оверхэд, да и исходный массив он от изменения не защищает.

А в каких языках есть пример того, что вам нужно?
Re: Только мне в дотнете не хватает неизменяемого массива?
От: adontz Грузия http://adontz.wordpress.com/
Дата: 30.01.11 14:32
Оценка:
Здравствуйте, VladD2, Вы писали:

VD>Только мне в дотнете не хватает неизменяемого массива?


А это вообще где-то есть?
A journey of a thousand miles must begin with a single step © Lau Tsu
Re[3]: Только мне в дотнете не хватает неизменяемого массива
От: samius Япония http://sams-tricks.blogspot.com
Дата: 30.01.11 15:26
Оценка: +1
Здравствуйте, VladD2, Вы писали:

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


VD>>>Только мне в дотнете не хватает неизменяемого массива?


QL>>
QL>>Array.AsReadOnly();
QL>>


QL>>?


VD>Массив — это монолитная структура данных. А AsReadOnly создает ReadOnlyCollection, что совершенно не нужный оверхэд, да и исходный массив он от изменения не защищает.


Если совсем без оверхеда и с прямым доступом к элементам как у существующего дотнет массива (с передачей элементов по ref), то ничто не сможет гарантировать неизменяемость такого массива (благодаря unsafe и ref параметрам).

Только оверхед вроде ReadOnlyCollection может гарантировать неизменность. А что бы гарантировать неизменность и с ним, нужно AsReadOnly вызывать у клона исходного массива.

Я так понимаю, исходный вопрос риторический? В таком ракурсе — да, мне тоже не хватает встроенного неизменяемого массива. Ну т.е. было бы круто если бы он был. Но никакой надежды что он будет на уровне дотнета — нет. А вот языки в свою очередь могли бы обеспечивать что-то вроде const ref-а хотя бы на уровне компиляции. И я не понимаю, почему const ref-а нет до сих пор .
Re[4]: Только мне в дотнете не хватает неизменяемого массива
От: k.o. Россия  
Дата: 30.01.11 16:01
Оценка: +1
Здравствуйте, QrystaL, Вы писали:

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

VD>>Массив — это монолитная структура данных. А AsReadOnly создает ReadOnlyCollection, что совершенно не нужный оверхэд, да и исходный массив он от изменения не защищает.

QL>А в каких языках есть пример того, что вам нужно?


Наверно, C++: const T [], const T *, const std::vector, const my_cool_array, etc.
Re[5]: Только мне в дотнете не хватает неизменяемого массива
От: adontz Грузия http://adontz.wordpress.com/
Дата: 30.01.11 16:01
Оценка:
Здравствуйте, k.o., Вы писали:

QL>>А в каких языках есть пример того, что вам нужно?

KO>Наверно, C++: const T [], const T *, const std::vector, const my_cool_array, etc.

Это константность вообще, а не только массива.
A journey of a thousand miles must begin with a single step © Lau Tsu
Re[6]: Только мне в дотнете не хватает неизменяемого массива
От: k.o. Россия  
Дата: 30.01.11 16:09
Оценка:
Здравствуйте, adontz, Вы писали:

A>Здравствуйте, k.o., Вы писали:


QL>>>А в каких языках есть пример того, что вам нужно?

KO>>Наверно, C++: const T [], const T *, const std::vector, const my_cool_array, etc.

A>Это константность вообще, а не только массива.


А в чём разница?
Re[7]: Только мне в дотнете не хватает неизменяемого массива
От: adontz Грузия http://adontz.wordpress.com/
Дата: 30.01.11 16:09
Оценка:
Здравствуйте, k.o., Вы писали:

A>>Это константность вообще, а не только массива.

KO>А в чём разница?

Спрашивали про массив
A journey of a thousand miles must begin with a single step © Lau Tsu
Re[8]: Только мне в дотнете не хватает неизменяемого массива
От: k.o. Россия  
Дата: 30.01.11 16:11
Оценка:
Здравствуйте, adontz, Вы писали:

A>Здравствуйте, k.o., Вы писали:


A>>>Это константность вообще, а не только массива.

KO>>А в чём разница?

A>Спрашивали про массив


Ну так мы и получаем неизменяемый массив, разве нет?
Re: Только мне в дотнете не хватает неизменяемого массива?
От: Аноним  
Дата: 30.01.11 16:17
Оценка: -1 :))
Здравствуйте, VladD2, Вы писали:

VD>Только мне в дотнете не хватает неизменяемого массива?


Есть, объявляется вот так


 var arr = new ReadonlyArray<int>( new int[] { 1,2,3,4} );



Чтоб работало надо прописать 6 магических строк

public class ReadonlyArray<T> : Array
{
   T[] _a;
   public ReadonlyArray( T[] a ){ _a = a; }
   public this[int index] { get{ return array[index]; } }
}
Re: Только мне в дотнете не хватает неизменяемого массива?
От: Пельмешко Россия blog
Дата: 30.01.11 16:22
Оценка: 2 (2) +2 :))) :))
Здравствуйте, VladD2, Вы писали:

VD>Только мне в дотнете не хватает неизменяемого массива?


Да.
Re[4]: Только мне в дотнете не хватает неизменяемого массива
От: VladD2 Российская Империя www.nemerle.org
Дата: 30.01.11 16:57
Оценка:
Здравствуйте, samius, Вы писали:

S>Если совсем без оверхеда и с прямым доступом к элементам как у существующего дотнет массива (с передачей элементов по ref), то ничто не сможет гарантировать неизменяемость такого массива (благодаря unsafe и ref параметрам).


А ничего что банальная строка (System.String) в дотнете по сути является таким массивом?

Твои рассуждения в корне ошибочны. unsafe есть unsafe. От него не защитишься. А передача по ссылке (то что ты назвал ref) просто не должна допускаться для данных доступных только для чтения.

S>Только оверхед вроде ReadOnlyCollection может гарантировать неизменность. А что бы гарантировать неизменность и с ним, нужно AsReadOnly вызывать у клона исходного массива.


Если бы это было так, то строки тоже создавали бы оверхэд, но это не так.

S>Я так понимаю, исходный вопрос риторический? В таком ракурсе — да, мне тоже не хватает встроенного неизменяемого массива. Ну т.е. было бы круто если бы он был. Но никакой надежды что он будет на уровне дотнета — нет. А вот языки в свою очередь могли бы обеспечивать что-то вроде const ref-а хотя бы на уровне компиляции. И я не понимаю, почему const ref-а нет до сих пор .


Вопрос совершенно практический. Если бы я нашел поддержку, то можно было бы сделать запрос на фичу в следующую версию дотнета.

ЗЫ

Кроме того хотелось бы получить возможность размещать в хвосте объекта один массив однородных элементов. Тогда типы вроде строк не пришлось бы хардодить в рантайме.
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re[2]: Только мне в дотнете не хватает неизменяемого массива
От: VladD2 Российская Империя www.nemerle.org
Дата: 30.01.11 16:59
Оценка: -4 :)))
Здравствуйте, Пельмешко, Вы писали:

VD>>Только мне в дотнете не хватает неизменяемого массива?


П>Да.


Вижу. И это печально. Дотнетчики не видят ничего дальше своего носа. МС сам воспитывает такой менталитет.
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re[6]: Только мне в дотнете не хватает неизменяемого массива
От: VladD2 Российская Империя www.nemerle.org
Дата: 30.01.11 17:01
Оценка:
Здравствуйте, adontz, Вы писали:

QL>>>А в каких языках есть пример того, что вам нужно?

KO>>Наверно, C++: const T [], const T *, const std::vector, const my_cool_array, etc.

A>Это константность вообще, а не только массива.


Да как хочешь называй, а создать аналогичный массив на дотнете невозможно. И это просто бредовый просчет создателей системы.
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re[7]: Только мне в дотнете не хватает неизменяемого массива
От: adontz Грузия http://adontz.wordpress.com/
Дата: 30.01.11 17:03
Оценка: 1 (1)
Здравствуйте, VladD2, Вы писали:

A>>Это константность вообще, а не только массива.

VD>Да как хочешь называй, а создать аналогичный массив на дотнете невозможно. И это просто бредовый просчет создателей системы.

Просчёт — это отсутствие константности вообще. Из-за неё нельзя, например, сделать switch по объектам произвольного типа. С другой стороны, я не понимаю как это можно реализовать на уровне run-time без кучи проверок.
A journey of a thousand miles must begin with a single step © Lau Tsu
Re[8]: Только мне в дотнете не хватает неизменяемого массива
От: VladD2 Российская Империя www.nemerle.org
Дата: 30.01.11 17:04
Оценка:
Здравствуйте, adontz, Вы писали:

A>Спрашивали про массив


Дык для полей есть readonly (в терминалогии шарпа). Почему бы не сделать решение полноценным и не позволить объявлять неизменяемые массивы?

Объект состоящий только из неизменяемых данных можно хранить в более эффективном GC. Ну, и гарантии намного выше когда рантайм обеспечивает свойства объекта, а не инкапсуляция. Про эффективность я молчу.
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re[2]: Только мне в дотнете не хватает неизменяемого массива
От: VladD2 Российская Империя www.nemerle.org
Дата: 30.01.11 17:05
Оценка:
Здравствуйте, adontz, Вы писали:

A>А это вообще где-то есть?


Меня это не волнует. Думаю, что где-нить в ОКамле или Хаскеле должно быть. Плюс в С++ можно добиться похожего поведения (если закрыть глаза на возможность плевать на все и реинтерпретировать память).
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re[3]: Только мне в дотнете не хватает неизменяемого массива
От: Пельмешко Россия blog
Дата: 30.01.11 17:28
Оценка: 6 (1)
Здравствуйте, VladD2, Вы писали:

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


A>>А это вообще где-то есть?


VD>Меня это не волнует. Думаю, что где-нить в ОКамле или Хаскеле должно быть. Плюс в С++ можно добиться похожего поведения (если закрыть глаза на возможность плевать на все и реинтерпретировать память).


VD>И это печально. Дотнетчики не видят ничего дальше своего носа. МС сам воспитывает такой менталитет.


Печально, действительно не видят дальше своего носа.
В OCaml с давних пор массивы мутабельны, неизменяемые в Haskell.

Вот пишут люди на окамлах промышленную фигню десятки лет и не понимают, что же им в функциональном языке не хватает... ах да, неизменяемых массивов!

Лично мне гораздо унылее от того, что в дотнетах из коробки нету какой-нибудь структуры данных типа VList, чтобы и внешне иммутабельно, и доступ по индексу/вычисление длинны быстрее чем O(n), и оверхеда по памяти и нагрузки на GC поменьше, чем у linked list.
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.