Решил добавить список фич в С# в зависимости от версии:
C# 2.0
- ключевое слово
partial позволяет разделять реолизацию класса более чем на один файл:
file1.cs:
PHP код:
public partial class MyClass
{
public void MyMethod1()
{
// Manually written code
}
}
file2.cs:
PHP код:
public partial class MyClass
{
public void MyMethod2()
{
// Automatically generated code
}
}
- Обобщённые, или параметризованные типы (generics). В отличие от шаблонов C++, они поддерживают некоторые дополнительные возможности и работают на уровне виртуальной машины. Вместе с тем, параметрами обобщенного типа не могут быть выражения.
- Новая форма итератора, позволяющая создавать сопрограммы с помощью ключевого слова
yield, подобно Python'у.
PHP код:
public static IEnumerable<int> GetEven(IEnumerable<int> numbers)
{
foreach (int i in numbers)
{
if (i % 2 == 0) yield return i;
}
}
этот код вернёт все чётные числа из numbers
- Анонимные методы, обеспечивающие функциональность замыкания.
- Обнуляемые ('nullable') типы-значения (обозначаемые вопросительным знаком, например, int? i = null

, представляющие собой те же самые типы-значения, только могущие принимать также значение null. Такие типы позволяют улучшить взаимодействие с базами данных через язык SQL.
PHP код:
int? i = null;
object o = i;
if (o == null)
Console.WriteLine("Correct behaviour - runtime version from September 2005 or later");
else
Console.WriteLine("Incorrect behaviour - pre-release runtime (from before September 2005)");
C# 3.0
- интегрированный язык запросов LINQ(Language-Integrated Query)
PHP код:
int[] array = { 1, 5, 2, 10, 7 };
// Выбрать квадраты нечётных чисел в массиве отсортировав в убывающем порядке
IEnumerable<int> query = from x in array
where x % 2 == 1
orderby x descending
select x * x;
- Инициализация объекта вместе с его свойствами:
PHP код:
Customer c = new Customer { Name="James" };
- Лямбда-выражения:
PHP код:
listOfFoo.Where(delegate(Foo x) { return x.size > 10; });
// превратится в
listOfFoo.Where(x => x.size > 10);
- Подразумеваемый тип локальной переменной:
PHP код:
var x = "hello";
//вместо
string x = "hello";
- Анонимные типы:
PHP код:
var x = new { Name = "James" };
- Методы-расширения — добавление метода в существующий класс с помощью ключевого слова
this при первом параметре статической функции.
PHP код:
public static class StringExtensions
{
public static string Left(this string s, int n)
{
return s.Substring(0, n);
}
}
string s = "foo";
s.Left(3); // то же что и StringExtensions.Left(s, 3);
C# 3.0 будет совместим с C# 2.0 по генерируемому MSIL-коду; улучшения в языке — чисто синтаксические и реализуются на этапе компиляции. Например, многие из интегрированных запросов LINQ можно уже сейчас осуществить, используя безымянные делегаты в сочетании с предикатными методами над контейнерами вроде
List.FindAll и
List.RemoveAll.