недостатки системы типов .NET
От: AndreiF  
Дата: 09.11.06 06:46
Оценка: 9 (2) +2 :)
Вот здесь я уже писал о некоторых недостатках в реализации .NET. Теперь я решил расширить список и написать о других аспектах платформы, а точнее — о системе типов.
Здесь я составил список проблем в системе типов CLI, которые осложняют работу. Впрочем, это только мое мнение — на абсолютную правоту я не претендую
Если у кого-то есть желание расширить список — welcome.

Нет ни множественного наследования реализаций, ни его заменителей.

Нет ковариантности для переопределения виртуальных методов.

Нет возможности использовать константные ссылки на объекты, что вынуждает программиста создавать read-only версии объектов — дополнительная ручная работа.

Нельзя перегружать методы по типу возвращаемого значения.

Нет кортежей.

Критически важные системные исключения (OutOfMemoryException, ThreadAbortException, ExecutionEngineException и т.п.) наследуются от того же базового класса, что и частно используемые ArgumentException, NotSupportedException и так далее. Это провоцирует плохих программистов писать конструкции наподобие
catch (Exception) { return false; }

Наличие типов, которые явно обозначаются как передаваемые через стек, и все связанные с этим усложнения системы типов (боксинг) и ограничения (нельзя наследовать от структур). На самом деле, решать, каким образом передавать объект в каждом конкретном случае – это задача оптимизатора.

Просчеты в реализации энумов. Например, любое числовое значение можно привести к любому перечислимому типу, даже если в том нет соответствующего значения, и это не вызовет никакой ошибки во время выполнения. Фактически, целевой переменной перечислимого типа будет присвоено некоторое «неопределенное» значение. No comments.

Коллекции
Одновременное применение в системе типов .NET массивов, нетипизированных коллекций, специализированных коллекций и генерик-коллекций, которые все «немного похожи» и «немного разные». Соответственно, методы из FCL возвращают разные типы — это создает лишнюю путаницу и сложности при программировании.
Например, String.Split возвращает string[], а не IList<string> или IEnumerable<string>, как можно было ожидать.
Для массивов возможна ко/контра-вариантность элементов, для остальных коллекций – нет. Массивы можно инициализировать списком значений в коде, для коллекций это невозможно.
Большинство коллекций поддерживают возможность добавлять элементы без пересоздания объекта, для массивов эта возможность недоступна. Для большинства коллекций доступен метод AsReadOnly() или аналог, для массивов такой возможности нет.
Генерики
Много лишней писанины, если нужно создать систему из нескольких связанных типов, имеющих общие параметры.

Нельзя использовать Enum в качестве констрэйнта на тип.
... << RSDN@Home 1.1.4 stable SR1 rev. 568>>
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.