Возможности С#.NET 3.0/3.5 в версии 2.0 с помощью Visual Studio 2008

Каковы некоторые новые функции, которые можно использовать в .NET 2.0, которые относятся к С# 3.0/3.5 после обновления до Visual Studio 2008? Кроме того, какие функции недоступны?

Доступные

  • Лямбда
  • Методы расширения (путем объявления пустого System.Runtime.CompilerServices.ExtensionAttribute)
  • Автоматические свойства
  • Инициализаторы объектов
  • Инициализаторы коллекции
  • LINQ to Objects (путем реализации методов расширения IEnumerable, см. LinqBridge)

Недоступно

  • Деревья выражений
  • Библиотеки WPF/Silverlight

Ответы

Ответ 1

Вы можете использовать любую новую функцию С# 3.0, которая обрабатывается компилятором, испуская совместимый с 2.0 IL-код и не ссылаясь ни на одну из новых сборок 3.5:

  • Lambdas (используется как Func<..>, not Expression<Func<..>>)
  • Методы расширения (путем объявления пустого System.Runtime.CompilerServices.ExtensionAttribute)
  • Автоматические свойства
  • Инициализаторы объектов
  • Инициализаторы коллекции
  • LINQ to Objects (путем реализации методов расширения IEnumerable <T> см. LinqBridge)

Ответ 2

Довольно многое! Даниэль Моф описывает здесь здесь и здесь. Это только оставляет поддержку во время выполнения: LINQ-to-Objects предоставляется LINQBridge - который оставляет только большие API, такие как поддержка Expression, и инструменты, подобные LINQ к SQL. Они слишком велики, чтобы их можно было портировать обратно в .NET 2.0, поэтому я бы использовал .NET 3.5 для них.

Ответ 3

Я расскажу об этом в статье на моем сайте.

Почти все возможности С# 3.0 доступны при настройке .NET 2.0. Для методов расширения вам необходимо определить дополнительный атрибут. Деревья выражений вообще недоступны. Поддержка выражения запроса основана на переводе, за которым следуют "обычные" правила С#, поэтому вам нужно что-то предложить для методов Select, Where и. LINQBridge является фактическим стандартом "LINQ to Objects in.NET 2.0". Возможно, вам захочется объявить делегатов из семейств делегатов Func и Action, чтобы упростить работу с лямбда-выражениями, а затем удалить их, если при перемещении в .NET 3.5

Ответ 4

Чтобы определить методы расширения, вам необходимо предоставить следующий класс, если вы настроили таргетинг на .NET 2.0:

namespace System.Runtime.CompilerServices {
  [AttributeUsage(AttributeTargets.Method | AttributeTargets.Class | AttributeTargets.Assembly)]
    sealed class ExtensionAttribute : Attribute { }
}

Ответ 6

Вы можете использовать Mono версию System.Core, которая полностью поддерживает LINQ и Expression Trees. Я собрал его источник против .net 2.0, и теперь я могу использовать его в моих проектах .net2.0. Это отлично подходит для проектов, которые необходимо развернуть на win2k, где .net3.5 недоступен.

Ответ 7

Методы Lambdas и Extension обрабатываются исключительно компилятором и могут использоваться с картой .Net 2.0.