Подтвердить что ты не робот

Разница между 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 также. Итак, почему приращение версии?

4b9b3361

Ответ 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, где он предлагается как новый код операции).

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

Ответ 7

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

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

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