Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / WinForms, .Net Framework [игнор отключен] [закрыт для гостей] / Почему в .Net такие убогие коллекции? / 25 сообщений из 379, страница 1 из 16
24.06.2014, 23:55
    #38679100
cdtyjv
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Почему в .Net такие убогие коллекции?
Волею судеб пришлось временно перейти с Java на .Net. Пишу, значит, разный относительно _низкоуровневый_ код, и доходит дело до написания универсального обработчика коллекций. И у меня просто волосы встают дыбом от того, как имплементированы коллекции в .Net. Это просто стыд и срам.

1) ICollection не имеет метода Add. ICollection<> имеет. IDictionary<> имеет. Даже IDictionary имеет. А ICollection нет. То есть это абсолютно бессмысленный интерфейс, который не добавлять практически ничего полезного к IEnumerable. В итоге, если у меня есть в руках ICollection, я не могу добавить туда элемент. Стыд и срам.
2) Нет общей иерархии классов. ICollection<> не имеет ничего общего с ICollection. С Dictionary та же проблема. В итоге, что бы определить, что у меня в руках коллекция, нужно писать трехэтажные неэффективные выражения через рефлекшн.
3) Иерархия некоторых коллекций просто повергает в ужас. Например, ConcurrentDictionary<> имплементирует IDictionary<>, логично. Наверное, тогда и типизированный ConcurrentBag<> будет имлементировать ICollection<>, правда? Неа, он имплементирует ICollection, и какой-то совершенно идиотский типизированный producer-consumer.
4) Нет кучи полезных специализированных коллекций. Нет read-only коллекций (вернее, есть одна - для списка, а set? а dictionary?), конкаррент коллекции появились только в 4.0 и имеют отвратительнейшую иерархию, нет synchronized-оберток, как в Java. Поэтому для реализации банальнейшего сценария - выдать пользователю unmodifiable коллекцию, что бы он не наломал дров - нужно писать какие-то свои обретки. А с имеющейся иерархией попробуйте ка написать универсальную такую обертку

И весь этот сыр бор нужен только для того, что бы иметь в рантайме информацию о дженерик типе. В Джава этой информации нет, type erasure. Верите-нет, но она на практике нафиг никому не нужна. Лежат в коллекции объекты, и лежат. Зато есть простая и лаконичная иерархия классов, с которой работать - одно удовольствие. После нее от всего этого стыдобища в .Net просто глаза на лоб лезут.

Вопрос - кто проектировал это? Вам комфортно работать с коллекциями в .Net?
...
Рейтинг: 0 / 0
24.06.2014, 23:57
    #38679101
Изопропил
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Почему в .Net такие убогие коллекции?
cdtyjvВам комфортно работать с коллекциями в .Net?
да. Особенно при использовании Linq For Objects
...
Рейтинг: 0 / 0
25.06.2014, 00:11
    #38679106
sphinx_mv
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Почему в .Net такие убогие коллекции?
cdtyjv[...бред поскипан...]Очередное свеномное обострение...
За сим предлагаю топик закрыть.
...
Рейтинг: 0 / 0
25.06.2014, 01:09
    #38679133
hVostt
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Почему в .Net такие убогие коллекции?
cdtyjv1) ICollection не имеет метода Add. ICollection<> имеет. IDictionary<> имеет. Даже IDictionary имеет. А ICollection нет. То есть это абсолютно бессмысленный интерфейс, который не добавлять практически ничего полезного к IEnumerable. В итоге, если у меня есть в руках ICollection, я не могу добавить туда элемент. Стыд и срам.

свойство Count. а у IEnumerable его нет, который вообще может быть бесконечной «коллекцией».

ICollection и ICollection<T> -- разные по смыслу и замыслу интерфейсы, это совсем не тоже самое «только с типом». это и касается IDictionary/IDictionary<T>.

но детский неокрепший мозг видит одинаковые слова , и его мир начинает рушится...

cdtyjv2) Нет общей иерархии классов. ICollection<> не имеет ничего общего с ICollection. С Dictionary та же проблема. В итоге, что бы определить, что у меня в руках коллекция, нужно писать трехэтажные неэффективные выражения через рефлекшн.

конечно, а с какого перепугу, это вдруг, должно? я не понял, зачем себя ставить в такую идиотскую ситуацию, чтобы выяснять «что за коллекция»?

cdtyjv3) Иерархия некоторых коллекций просто повергает в ужас. Например, ConcurrentDictionary<> имплементирует IDictionary<>, логично. Наверное, тогда и типизированный ConcurrentBag<> будет имлементировать ICollection<>, правда? Неа, он имплементирует ICollection, и какой-то совершенно идиотский типизированный producer-consumer.

всё логично, если подумать тем местом, что называется голова. я же сказал ICollection и ICollection<T> никак не коррелируют друг с другом, да и были спроектированы с довольно большим интервалом времени. кое что доосмыслилось при проектировании типизированных коллекций, а старое менять нельзя, надеюсь сам понимаешь почему. очень надеюсь.

cdtyjv4) Нет кучи полезных специализированных коллекций. Нет read-only коллекций (вернее, есть одна - для списка, а set? а dictionary?), конкаррент коллекции появились только в 4.0 и имеют отвратительнейшую иерархию, нет synchronized-оберток, как в Java. Поэтому для реализации банальнейшего сценария - выдать пользователю unmodifiable коллекцию, что бы он не наломал дров - нужно писать какие-то свои обретки. А с имеющейся иерархией попробуйте ка написать универсальную такую обертку

всё там есть. IReadOnlyDictionary, IReadOnlyCollection и IReadOnlyList.

для ISet видимо это без надобности, т.к. есть IsReadOnly на такой редкий случай.

cdtyjvВ Джава этой информации нет, type erasure. Верите-нет, но она на практике нафиг никому не нужна.

когда была жёсткая необходимость покодить на Java, я чуть не блеванул. серьёзно. хотя знаю, что имеются толпы миллионов Java-кодеров, которые вполне комфортно себя чувствуют в среде Java, но лично я после C# на Java чувствовал себя вышвырнутым за пределы нормальной цивилизации.

cdtyjvВопрос - кто проектировал это?

много людей, соответственно до идеала конечно далеко.

cdtyjvВам комфортно работать с коллекциями в .Net?

вполне.
...
Рейтинг: 0 / 0
25.06.2014, 01:46
    #38679149
hVostt
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Почему в .Net такие убогие коллекции?
cdtyjv,

чтоб понять, почему ICollection<T> никак не может наследоваться от ICollection, рассмотрим вот такую коллекцию:

Код: c#
1.
var list = new List<int> { 1, 2, 3, 4 };



благодаря тому, что .NET точно знает тип и размер элементов коллекции, он может разместить их эффективно в непрерывном блоке памяти .

приведём эту коллекцию к ссылке на интерфейс ICollection, который представляет собой коллекцию, хранящую какие-то Object, т.е. ссылки на объекты в куче.

стоит заморачиваться и объяснять, почему это в принципе невозможно?

с другой стороны может возникнуть вопрос, почему же тогда можно привести типизированную коллекцию к нетипизированному IEnumerable? ответ прост. потому что IEnumerable это вовсе не коллекция по сути. это интерфейс, который содержит метод, возвращающий итератор. итератор же упаковывает значение элемента и возвращает ссылку (это называется boxing, и в случае, если не применяется duck typing), или просто ссылку, если элементы коллекции являются экземплярами класса.

в Java таких заморочек нет, потому что там нет типов-значений, что позволяет .NET уделывать Java как котёнка в плане производительности.
...
Рейтинг: 0 / 0
25.06.2014, 02:13
    #38679154
Где-то в степи
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Почему в .Net такие убогие коллекции?
hVostt,
автор это интерфейс, который содержит метод, возвращающий итератор. итератор же упаковывает значение элемента и возвращает ссылку
в типизированых коллекциях, в случае со значениями, упаковки не проходит, там даже итератор живет живет в виде структуры.
За это, в свое время воевали наши отцы и деды.
...
Рейтинг: 0 / 0
25.06.2014, 02:49
    #38679159
hVostt
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Почему в .Net такие убогие коллекции?
Где-то в степив типизированых коллекциях, в случае со значениями, упаковки не проходит, там даже итератор живет живет в виде структуры.
За это, в свое время воевали наши отцы и деды.

http://msdn.microsoft.com/ru-ru/library/system.collections.ienumerator.current.aspx
...
Рейтинг: 0 / 0
25.06.2014, 07:57
    #38679199
skyANA
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Почему в .Net такие убогие коллекции?
hVosttГде-то в степив типизированых коллекциях, в случае со значениями, упаковки не проходит, там даже итератор живет живет в виде структуры.
За это, в свое время воевали наши отцы и деды.

http://msdn.microsoft.com/ru-ru/library/system.collections.ienumerator.current.aspx Сказать-то что хотел?
...
Рейтинг: 0 / 0
25.06.2014, 08:54
    #38679228
17-77
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Почему в .Net такие убогие коллекции?
hVosttкогда была жёсткая необходимость покодить на Java, я чуть не блеванул
+1, я когда ставил JEE у меня постоянно сыпались ошибки в инсталяторе, каждая - гугление и исправление по полчаса-час, на пятой итерации я нажал кнопку кансел

ну ее нахрен эту яву, для линуксоидов самое то - чтоб запрограммировать хеллоу ворд - надо собрать под себя ядро
...
Рейтинг: 0 / 0
25.06.2014, 09:05
    #38679234
Изопропил
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Почему в .Net такие убогие коллекции?
17-77+1, я когда ставил JEE у меня постоянно сыпались ошибки в инсталяторе, каждая - гугление и исправление по полчаса-час, на пятой итерации я нажал кнопку кансел
Java то здесь причём?
...
Рейтинг: 0 / 0
25.06.2014, 10:02
    #38679314
Arm79
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Почему в .Net такие убогие коллекции?
cdtyjv1) ICollection не имеет метода Add. ICollection<> имеет. IDictionary<> имеет. Даже IDictionary имеет. А ICollection нет. То есть это абсолютно бессмысленный интерфейс, который не добавлять практически ничего полезного к IEnumerable. В итоге, если у меня есть в руках ICollection, я не могу добавить туда элемент. Стыд и срам.
А зачем работать с нетипизированными коллекциями? Я вот за последние несколько лет не работал, и надобности такой не вижу.

cdtyjvНет общей иерархии классов. ICollection<> не имеет ничего общего с ICollection. С Dictionary та же проблема.
Оно не имеет ничего общего по той простой причине, что это разные вещи. Просто интерфейсы похожи.

cdtyjvВ итоге, что бы определить, что у меня в руках коллекция, нужно писать трехэтажные неэффективные выражения через рефлекшн
Это очень сильно. А что, вы не знаете, где у вас коллекция, а где - нет? Приведите пример, а то у меня сомнения возникают в том, что вы грамотно подошли к архитектуре приложения с учетом особенностей .Net

cdtyjvНет кучи полезных специализированных коллекций. Нет read-only коллекций
Есть, и много. Примеры выше приводились.

cdtyjvпопробуйте ка написать универсальную такую обертку
Универсальные обертки, как и таблетки, не существуют.
cdtyjvИ весь этот сыр бор нужен только для того, что бы иметь в рантайме информацию о дженерик типе. В Джава этой информации нет, type erasure. Верите-нет, но она на практике нафиг никому не нужна
Не верю :-)

cdtyjvЛежат в коллекции объекты, и лежат. Зато есть простая и лаконичная иерархия классов, с которой работать - одно удовольствие. После нее от всего этого стыдобища в .Net просто глаза на лоб лезут.
Я когда с Delphi на .Net переходил, тоже долго плевался. Казалось все нелогичным, и сделано через одно место. Сейчас мне кажется ровно наоборот. Все недостатки Delphi убраны, преимущества - сохранены (кроме визуальной составляющей). Так и с Java. Вы привыкли к нему, лучше ориентируетесь в базовых классах, и знаете подход. К .Net нужно просто привыкнуть. И я вам искренне говорю, что 1) в .Net (точнее C#) гораздо удобнее в плане синтаксиса и конструкций 2) VS 2013 - крутая штука, очень.
...
Рейтинг: 0 / 0
25.06.2014, 10:35
    #38679368
Shocker.Pro
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Почему в .Net такие убогие коллекции?
В общем "какая дурацкая штука - этот ваш мотоцикл! где педали? как я поеду, если педалей нет, нечего крутить"
...
Рейтинг: 0 / 0
25.06.2014, 10:46
    #38679384
Алексей К
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Почему в .Net такие убогие коллекции?
Arm79Все недостатки Delphi убраны, преимущества - сохранены ( кроме визуальной составляющей ).Да?!
...
Рейтинг: 0 / 0
25.06.2014, 11:07
    #38679412
Arm79
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Почему в .Net такие убогие коллекции?
Алексей КДа?!
Да. Я знаю, Алексей, про ваше творчество на WPF :-) Но когда я переходил, были унылые WinForms. Как мне не хватало полноценного наследования форм....

Потом появился Wpf, концептуально крутая штука, но я пока не вижу никакого его развития. И предсказать, на какую технологию как мейнстрим будет ориентироваться Microsoft для разработки клиентской части, я не в состоянии. WinForms умер, Silverlite тоже, WPF в загоне, JS + HTML - слишком медленно...
...
Рейтинг: 0 / 0
25.06.2014, 11:14
    #38679420
Где-то в степи
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Почему в .Net такие убогие коллекции?
Упаковка в правильно написаны дженерик конструкциях не должна приветствоваться равно как и надо постараться что бы
упаковаться, списки ли методы разницы нет.
Код: c#
1.
2.
3.
4.
5.
  static T Foo<T>(T t)
        {
            T inner = t;
            return inner;
        }


проверим через приведение
Код: c#
1.
2.
3.
 var dd1 =(Int64) Foo<Int32>(1);
 var dd3 = (Int64)Foo<Object>(1);//  на выходе объект, объект  as int32  не приводтся к 64, надо сначало вернуть его в стойло..
 var dd4 = (Int64)(Int32)Foo<Object>(1);
...
Рейтинг: 0 / 0
25.06.2014, 11:19
    #38679432
hVostt
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Почему в .Net такие убогие коллекции?
Где-то в степиУпаковка в правильно написаны дженерик конструкциях не должна приветствоваться

чуть больше веселья cо специальным Nullable<T> типом
...
Рейтинг: 0 / 0
25.06.2014, 11:21
    #38679435
Алексей К
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Почему в .Net такие убогие коллекции?
Arm79Потом появился Wpf, концептуально крутая штука, но я пока не вижу никакого его развития.Он вполне юзабелен в существующем виде. Его можно и не развивать.
Arm79JS + HTML - слишком медленно...Ничего там не медленно. Типовой набор jQuery+Knockout+Bootstrap+TypeScript умеет в разы больше чем Delphi.
...
Рейтинг: 0 / 0
25.06.2014, 11:24
    #38679438
Где-то в степи
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Почему в .Net такие убогие коллекции?
hVostt,
а чем же он специальный? это обыкновенная структура? со своим сахаром
...
Рейтинг: 0 / 0
25.06.2014, 11:32
    #38679456
hVostt
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Почему в .Net такие убогие коллекции?
Где-то в степиа чем же он специальный? это обыкновенная структура? со своим сахаром

сахар это всего лишь пол беды, попробуй вот это:

Код: c#
1.
2.
3.
4.
5.
int? meaningOfLife = 42;
object some = meaningOfLife;

int? meaningOfLife = null;
object some = meaningOfLife;



что будет в some в обоих случаях?

а с рефлекшеном там вообще целая эпопея.
...
Рейтинг: 0 / 0
25.06.2014, 11:38
    #38679468
Где-то в степи
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Почему в .Net такие убогие коллекции?
hVostt,
ну а что Вас смутило? упаковка nullable имеет свои определенные правила.
...
Рейтинг: 0 / 0
25.06.2014, 11:39
    #38679474
Где-то в степи
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Почему в .Net такие убогие коллекции?
равно как и распаковка
...
Рейтинг: 0 / 0
25.06.2014, 11:43
    #38679483
hVostt
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Почему в .Net такие убогие коллекции?
Где-то в степину а что Вас смутило? упаковка nullable имеет свои определенные правила.

поэтому я и говорю что это специальный тип, а не обыкновенная структура.
...
Рейтинг: 0 / 0
25.06.2014, 11:44
    #38679484
hVostt
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Почему в .Net такие убогие коллекции?
Где-то в степиравно как и распаковка

Nullable<T> не может быть распакован, так как он и не упаковывается вовсе.
...
Рейтинг: 0 / 0
25.06.2014, 11:44
    #38679488
Изопропил
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Почему в .Net такие убогие коллекции?
а где собственно топикстартер?
букварь читает?
...
Рейтинг: 0 / 0
25.06.2014, 11:45
    #38679493
Алексей К
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Почему в .Net такие убогие коллекции?
Изопропила где собственно топикстартер?Скрипач не нужен...
...
Рейтинг: 0 / 0
Форумы / WinForms, .Net Framework [игнор отключен] [закрыт для гостей] / Почему в .Net такие убогие коллекции? / 25 сообщений из 379, страница 1 из 16
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]