На конференции NDC 2013, недавно прошедшей в Лондоне, Мадс Торгерсен (Mads Torgersen), являющийся одним из разработчиков спецификации языка C#, рассказал в своём докладе “The Future of C#” о возможных нововведениях в нём.
Предназначен для сокращённой записи конструктора с параметрами с присваиванием их приватным переменным. Для использования первичного конструктора необходимо указать в месте объявления класса после его имени передаваемые параметры также, как мы их указываем в обычном конструкторе. При этом автоматически создаются приватные переменные с именами, соответствующими именам параметров. Аналогичная конструкция есть в языке Scala.
Если сейчас используют свойства с приватным сеттером
или readonly поля
то можно будет просто написать
При использовании директивы using теперь можно будет указывать не только пространства имён, но и статические классы, для обеспечения возможности использования методов класса без указания его имени.
Объявление свойств в стиле лямбда-выражений.
Тоже, что и выше, но только для методов.
Возможность передавать в методы с переменным числом параметров классы, унаследованные от IEnumerable. Если раньше для этого приходилось преобразовывать класс в массив
то теперь можно будет просто написать
Правда, непонятно зачем это нужно, учитывая, что IEnumerable можно передавать в методы и без ключевого слова params.
Оператор ?. Избавляет от необходимости проверки объекта на null перед вызовом его свойств или методов. Абсолютно идентичен аналогичному оператору из Groovy.
Пример:
Как видно данный оператор значительно сокращает код, который сейчас бы выглядел вот так:
C# умеет выводить типы при вызове generic методов. Например, вместо var x = MyClass.Create<int>(24) мы можем написать var x = MyClass.Create(24). Но данный приём не работает для generic классов. Обходным путём в данном случае было использование generiс метода, выполняющего роль фабрики класса.
В новой версии данное ограничение будет убрано, и мы сможем писать код аналогично методам.
Пожалуй, об этом изменении лучше всего расскажет код.
Источники:
damieng.com/blog/2013/12/09/probable-c-6-0-features-illustrated
ndclondon.oktaset.com/t-11783
adamralph.com/2013/12/06/ndc-diary-day-3/#more
wesnerm.blogs.com/net_undocumented/2013/12/mads-on-c-60.html
Первичный конструктор (Primary Constructor)
Предназначен для сокращённой записи конструктора с параметрами с присваиванием их приватным переменным. Для использования первичного конструктора необходимо указать в месте объявления класса после его имени передаваемые параметры также, как мы их указываем в обычном конструкторе. При этом автоматически создаются приватные переменные с именами, соответствующими именам параметров. Аналогичная конструкция есть в языке Scala.
//классический конструктор
public class Point {
private int x, y;
public Point(int x, int y)
{
this.x = x;
this.y = y;
}
}
//Первичный конструктор
public class Point(int x, int y) {
}
Автосвойства только для чтения
Если сейчас используют свойства с приватным сеттером
public int X { get; private set;}
или readonly поля
private readonly int x;
public int X { get { return x; } }
то можно будет просто написать
public int X { get; } = 42;
Использование статических классов в директиве using
При использовании директивы using теперь можно будет указывать не только пространства имён, но и статические классы, для обеспечения возможности использования методов класса без указания его имени.
using System.Math;
...
public double A { get { return Sqrt(Round(5.142)); } }
Property Expressions
Объявление свойств в стиле лямбда-выражений.
public double Distance => Math.Sqrt((X * X) + (Y * Y));
Method Expressions
Тоже, что и выше, но только для методов.
public Point Move(int dx, int dy) => new Point(X + dx, Y + dy);
Использование params с IEnumerable
Возможность передавать в методы с переменным числом параметров классы, унаследованные от IEnumerable. Если раньше для этого приходилось преобразовывать класс в массив
Do(someEnum.ToArray());
...
public void Do(params int[] values) { ... }
то теперь можно будет просто написать
Do(someEnum);
public void Do(params IEnumerable<Point> points) { ... }
Правда, непонятно зачем это нужно, учитывая, что IEnumerable можно передавать в методы и без ключевого слова params.
Оператор безопасной навигации (Safe Navigation Operator)
Оператор ?. Избавляет от необходимости проверки объекта на null перед вызовом его свойств или методов. Абсолютно идентичен аналогичному оператору из Groovy.
Пример:
var bestValue = points?.FirstOrDefault()?.X ?? -1;
Как видно данный оператор значительно сокращает код, который сейчас бы выглядел вот так:
if (points != null) {
var next = points.FirstOrDefault();
if (next != null && next.X != null) return next.X;
}
return -1;
Вывод типа для конструктора generic класса.
C# умеет выводить типы при вызове generic методов. Например, вместо var x = MyClass.Create<int>(24) мы можем написать var x = MyClass.Create(24). Но данный приём не работает для generic классов. Обходным путём в данном случае было использование generiс метода, выполняющего роль фабрики класса.
var x = MyClass.Create(1, "X");
...
public MyClass<T1, T2> Create<T1, T2>(T1 a, T2 b) {
return new MyClass<T1, T2>(a, b);
}
В новой версии данное ограничение будет убрано, и мы сможем писать код аналогично методам.
var x = new MyClass(1, "X");
Объявление out параметров в вызываемом методе
Пожалуй, об этом изменении лучше всего расскажет код.
//сейчас
int x;
int.TryParse("123", out x);
//будет
int.TryParse("123", out int x);
Источники:
damieng.com/blog/2013/12/09/probable-c-6-0-features-illustrated
ndclondon.oktaset.com/t-11783
adamralph.com/2013/12/06/ndc-diary-day-3/#more
wesnerm.blogs.com/net_undocumented/2013/12/mads-on-c-60.html