Pull to refresh

Будущее C#

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

Первичный конструктор (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
Tags:
Hubs:
+73
Comments 145
Comments Comments 145

Articles