Разница между CLR 2.0 и CLR 4.0 - PullRequest
       14

Разница между CLR 2.0 и CLR 4.0

22 голосов
/ 26 октября 2009

Я прочитал бесчисленные блоги, сообщения и вопросы StackOverflow о новых функциях C # 4.0. Даже новые функции WPF 4.0 начали появляться открыто. Что я не смог найти и хотел бы знать:

  1. Каковы основные изменения в CLR 4.0 с точки зрения разработчика на C # / WPF?
  2. Каковы основные изменения в 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 были также улучшены скорость и другие улучшения. Так почему же приращение версии?

Ответы [ 7 ]

11 голосов
/ 26 октября 2009

Одна новая вещь CLR, о которой я знаю, это форма структурной типизации для интерфейсов, структур и делегатов ради поддержки NoPIA - в основном, это позволяет среде выполнения обрабатывать различные типы с эквивалентными определениями, как если бы они были одинаковыми - поэтому, если две сборки A и B каждая имеют объявленный в них COM-импортированный интерфейс IFoo с одинаковым IID и одинаковыми элементами, среда выполнения будет рассматривать их как эквивалентные типы; так что если есть экземпляр некоторого класса 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. Возможно, она немного устарела, но большинство упомянутых там вещей, по-видимому, содержится в бета-версиях.

4 голосов
/ 26 октября 2009

Есть огромное количество изменений.

В самой CLR есть несколько изменений. Сборщик мусора изменяется для поддержки одновременного сбора gen0 / 1 и gen2 в режиме рабочей станции. Также есть некоторые изменения в том, как реализована безопасность. Параллельная структура изменяет некоторые реализации CLR потока пула (который не полностью управляется, но является частью самой среды выполнения). Кроме того, в систему типов внесены некоторые изменения, в основном связанные с новой поддержкой PIA COM.

Самыми большими изменениями, вероятно, являются изменения библиотеки / фреймворка, а не изменения CLR. такие как интеграция DLR в каркас и новый динамический тип. С точки зрения инфраструктуры у вас есть реактивная структура, параллельные расширения библиотеки, контракты кода, поддержка кортежей и множество мелких изменений (например: Enum.TryParse, Lazy<T> и множество других небольших, но приятных улучшений).

2 голосов
/ 29 октября 2009

Для каждой документации по выпуску команды создают «Что нового».

Вот пример для C # 4.0 Beta2: Что нового в Visual C # 2010

А вот для .NET Framework 4.0 Beta2: Что нового в .NET Framework версии 4

Это самые полные списки изменений, которые вы можете найти.

2 голосов
/ 26 октября 2009

Я не верю, что есть какие-либо новые инструкции IL. Новый CLR имеет улучшения в таких вещах, как встраивание и сборка мусора, которые выполняют ту же работу, что и 2.0 CLR, но лучше. Виртуальная машина (например, CLR или JVM) - это абстрактная концепция с множеством возможных реализаций. Я считаю, что CLR 4.0 - это та же абстрактная машина, что и в CLR 2.0, только с улучшенной реализацией.

Даже новый динамический материал - это просто трюк с компилятором с новыми API (в отличие от Java, где он предлагается в качестве нового кода операции .)

Если я ошибаюсь, я бы хотел знать!

1 голос
/ 27 октября 2009

Многие основные интерфейсы и типы делегатов в CLR были обновлены для поддержки общей ковариации и контравариантности . Например, IEnumerable<T> было изменено на IEnumerable<out T>.

0 голосов
/ 26 октября 2009

Я попытался взглянуть на некоторые новые C # вещи в Reflector, чтобы посмотреть, есть ли что-нибудь новое под:

  • динамические типы преобразуются в объект s с помощью магии компилятора, которая добавляет библиотечные вызовы для обработки привязки во время выполнения.
  • Необязательные параметры обрабатываются с помощью компилятора. Если вы вызовете Foo (int x = 5), не указав значение для x, вы увидите вызов Foo (5) в Reflector.

Так что я думаю, что изменения - это не то, что вы легко можете заметить (как общая поддержка в CLR 2.0).

...