Разница между CLR 2.0 и CLR 4.0
Я прочитал бесчисленные блоги, сообщения и вопросы StackOverflow о новых функциях С# 4.0. Даже новые функции WPF 4.0 начали открываться. Что я не мог найти и хотел бы знать:
- Каковы основные изменения в CLR 4.0 с точки зрения разработчика С#/WPF?
- Каковы основные изменения для CLR 4.0 в целом?
Я думаю, что внутренне большинство изменений связано с новыми динамическими языками и параллельным программированием. Но есть ли другие важные улучшения? Потому что улучшения языка - это только улучшения языка. Вам просто нужен новый компилятор, и эти функции могут использоваться с более низкой версией .Net, кроме версии 1.0/1.1 (по крайней мере, большинство из них можно использовать).
И если указанные выше функции являются единственными, только для этих функций версия изменена на 4.0, и я думаю, что это 4.0 из-за того, что она основана на версии .Net 4.0 (т.е. после 1.0/1.1, 2.0 и 3.0/3.5). Является ли оправданное значение версии?
Отредактировано:
Как отметил Павел Минаев в комментариях, даже эти две функции независимы от CLR. Были скорости и другие улучшения в 3.0 и 3.5 также. Итак, почему приращение версии?
Ответы
Ответ 1
Одна новая вещь CLR, о которой я знаю, представляет собой форму структурной типизации для интерфейсов, структур и делегатов для Поддержка NoPIA - в основном, он позволяет runtime обрабатывать различные типы с эквивалентными определениями, как если бы они были одинаковыми, поэтому, если две сборки A
и B
имеют в себе COM-импортированный интерфейс IFoo
, объявленный в них, с тем же IID и теми же членами, runtime будет рассматривать их как эквивалентные типы; поэтому если экземпляр класса Foo
реализует [A]IFoo
, вы можете применить его к [B]IFoo
, и приведение будет работать.
Еще одна вещь - возможность размещения нескольких версий CLR бок о бок в одном процессе. Например, вы не можете размещать 1.x и 2.0 в одном процессе, но вы можете размещать версии 2.0 и 4.0. Основным преимуществом этого является возможность одновременного загрузки плагинов, написанных для обеих версий CLR.
Один младший бит состоит в том, что еще несколько исключений стали неучетными, например StackOverflowException
в 2.0 - вы больше не можете поймать AccessViolationException
.
Кроме того, здесь является презентацией PowerPoint на CLR 4.0 от PDC 2008. Это может быть немного датировано сейчас, но большинство вещей, которые упоминались там похоже, находится в бета-версии.
Ответ 2
Существует огромное количество изменений.
В самой CLR есть несколько изменений. Сборщик мусора меняется для поддержки одновременного сбора gen0/1 и gen2 в режиме рабочей станции. Кроме того, есть некоторые изменения в реализации безопасности. Параллельная структура изменяет некоторые из CLR-реализации потока thread (который не полностью управляется, а является частью самой среды выполнения). Кроме того, есть некоторые изменения в системе типов, в основном связанные с новой поддержкой PIA COM.
Самыми большими изменениями являются, вероятно, больше изменений в библиотеке/каркасе, а не изменениях в CLR. таких как интеграция DLR в структуру и новый динамический тип. С точки зрения структуры у вас есть реактивная структура, параллельные расширения библиотек, кодовые контракты, поддержка кортежей и множество небольших изменений (т.е. Enum.TryParse
, Lazy<T>
и множество других небольших, но приятных улучшений).
Ответ 3
Я не верю, что есть новые инструкции IL. Новая среда CLR улучшает такие вещи, как сборка и сборка мусора, которые выполняют ту же работу, что и CLR 2.0, но лучше. Виртуальная машина (например, CLR или JVM) представляет собой абстрактную концепцию с несколькими возможными реализациями. Я считаю, что CLR 4.0 представляет собой ту же абстрактную машину, что и в CLR 2.0, только с улучшенной реализацией.
Даже новый динамический материал - это просто компилятор с новыми API (в отличие от Java, где он предлагается как новый код операции).
Если я ошибаюсь в этом, я хотел бы знать!
Ответ 4
Для каждой группы документации по выпуску создаются "какие новые" документы.
Вот для С# 4.0 Beta2: Что нового в Visual С# 2010
И вот для .NET Framework 4.0 Beta2: Что нового в .NET Framework версии 4
Это самые полные списки изменений, которые вы можете найти.
Ответ 5
Многие основные интерфейсы и типы делегатов в CLR были обновлены в поддержку общей ковариации и контравариантности. Например, IEnumerable<T>
был изменен на IEnumerable<out T>
.
Ответ 6
Ниже приведены изменения в CLR 4.0
Ответ 7
Я попытался взглянуть на некоторые из новых материалов С# в Reflector, чтобы увидеть, есть ли что-то новое:
- динамические типы преобразуются в объект с помощью магии компилятора, которая добавляет вызовы библиотеки для обработки привязки времени выполнения.
- Дополнительные параметры обрабатываются через компилятор. Если вы вызываете Foo (int x = 5), без указания значения для x, вы увидите вызов как Foo (5) в Reflector.
Итак, я думаю, что изменения не могут быть легко обнаружены (например, общая поддержка в CLR 2.0).