- PVSM.RU - https://www.pvsm.ru -

Будущее C#

На конференции NDC 2013 [1], недавно прошедшей в Лондоне, Мадс Торгерсен (Mads Torgersen), являющийся одним из разработчиков спецификации языка C#, рассказал в своём докладе “The Future of C#” [2] о возможных нововведениях в нём.

Первичный конструктор (Primary Constructor)

Предназначен для сокращённой записи конструктора с параметрами с присваиванием их приватным переменным. Для использования первичного конструктора необходимо указать в месте объявления класса после его имени передаваемые параметры также, как мы их указываем в обычном конструкторе. При этом автоматически создаются приватные переменные с именами, соответствующими именам параметров. Аналогичная конструкция есть в языке 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 теперь можно будет указывать не только пространства имён, но и статические классы, для обеспечения возможности использования методов класса без указания его имени.

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 [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;

Вывод типа для конструктора 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 [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/