- PVSM.RU - https://www.pvsm.ru -
На конференции NDC 2013 [1], недавно прошедшей в Лондоне, Мадс Торгерсен (Mads Torgersen), являющийся одним из разработчиков спецификации языка C#, рассказал в своём докладе “The Future of C#” [2] о возможных нововведениях в нём.
Предназначен для сокращённой записи конструктора с параметрами с присваиванием их приватным переменным. Для использования первичного конструктора необходимо указать в месте объявления класса после его имени передаваемые параметры также, как мы их указываем в обычном конструкторе. При этом автоматически создаются приватные переменные с именами, соответствующими именам параметров. Аналогичная конструкция есть в языке Scala [3].
//классический конструктор
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; } = x;
При использовании директивы using теперь можно будет указывать не только пространства имён, но и статические классы, для обеспечения возможности использования методов класса без указания его имени.
using System.Math;
...
public double A { get { return Sqrt(Round(5.142)); } }
Объявление свойств в стиле лямбда-выражений.
public double Distance => Math.Sqrt((X * X) + (Y * Y));
Тоже, что и выше, но только для методов.
public Point Move(int dx, int dy) => new Point(X + dx, Y + dy);
Возможность передавать в методы с переменным числом параметров классы, унаследованные от IEnumerable. Если раньше для этого приходилось преобразовывать класс в массив
Do(someEnum.ToArray());
...
public void Do(params int[] values) { ... }
то теперь можно будет просто написать
Do(someEnum);
public void Do(params IEnumerable<Point> points) { ... }
Правда, непонятно зачем это нужно, учитывая, что IEnumerable можно передавать в методы и без ключевого слова params.
Оператор?.. Избавляет от необходимости проверки объекта на null перед вызовом его свойств или методов. Абсолютно идентичен аналогичному оператору из Groovy [4].
Пример:
var bestValue = points?.FirstOrDefault()?.X ?? -1;
Как видно данный оператор значительно сокращает код, который сейчас бы выглядел вот так:
if (points != null) {
var next = points.FirstOrDefault();
if (next != null && next.X != null) return next.X;
}
return -1;
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");
Пожалуй, об этом изменении лучше всего расскажет код.
//сейчас
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 [5]
ndclondon.oktaset.com/t-11783 [2]
adamralph.com/2013/12/06/ndc-diary-day-3/#more [6]
wesnerm.blogs.com/net_undocumented/2013/12/mads-on-c-60.html [7]
Автор: bmforce
Источник [8]
Сайт-источник PVSM.RU: https://www.pvsm.ru
Путь до страницы источника: https://www.pvsm.ru/net/50961
Ссылки в тексте:
[1] NDC 2013: http://ndc-london.com
[2] “The Future of C#”: http://ndclondon.oktaset.com/t-11783
[3] Scala: http://www.javabeat.net/primary-auxiliary-constructors-scala/
[4] Groovy: http://groovy.codehaus.org/Operators#Operators-SafeNavigationOperator%28?.%29
[5] damieng.com/blog/2013/12/09/probable-c-6-0-features-illustrated: http://damieng.com/blog/2013/12/09/probable-c-6-0-features-illustrated
[6] adamralph.com/2013/12/06/ndc-diary-day-3/#more: http://adamralph.com/2013/12/06/ndc-diary-day-3/#more
[7] wesnerm.blogs.com/net_undocumented/2013/12/mads-on-c-60.html: http://wesnerm.blogs.com/net_undocumented/2013/12/mads-on-c-60.html
[8] Источник: http://habrahabr.ru/post/206356/
Нажмите здесь для печати.